当前位置: 首页 > news >正文

网站开发源代码 百度文库百度人工申诉客服电话

网站开发源代码 百度文库,百度人工申诉客服电话,网站改版是否有影响,做白日梦的网站介绍 一个类无论创建多少对象,都只能得到一个实例 A* p1new A(); A* p2new A(); A* p3new A(); 如上述代码中,我们通过new运算符创建出了类A的三个对象实例,而我们现在要做的是,如何设计类A,使得上述代码运行之后永远…

介绍

一个类无论创建多少对象都只能得到一个实例

A* p1=new A();
A* p2=new A();
A* p3=new A();

如上述代码中,我们通过new运算符创建出了类A的三个对象实例,而我们现在要做的是,如何设计类A,使得上述代码运行之后永远只产生同一个对象实例

设计方法

1.将构造函数声明为私有

        我们知道,一个类对象是通过这个类的构造函数创建的,因此,我们首先要拒绝用户使用构造函数。

也许有人会问,我们在类中不写构造函数不行么?

确实不行,构造函数与普通成员函数的区别之一就在于,即使你不写,编译器也会自动为你创建一个构造函数

因此,这一步的目的在于:拒绝编译和用户使用构造函数创建对象

class Singleton
{
public:
private:Singleton(){};
};

2.在类中自行定义一个static对象

由于我们拒绝用户和编译器自行创建对象,因此我们必须自己在类中定义一个对象,且其类型必须为static的,因为只有static类型的变量才属于这个类,而不是属于某个对象

class Singleton
{
public:
private:static Singleton instance;Singleton(){};
};

声明为private的原因是,防止用户对其进行修改。

3.定义一个外部可以访问到该static对象实例的接口

由于上述定义的实例对象是private的,因此我们需要定义一个公共接口,来供外部用户进行访问

class Singleton
{
public:static Singleton* getInstance(){return &instance;}
private:static Singleton instance;Singleton(){};
};

该接口声明为static的原因是,用户此时还没有创建出实例,而普通成员函数的调用必须通过对象进行,因此如果想要用户使用这个函数,就必须要将其声明为static的

4.拒绝对象的拷贝和赋值

至此,我们已经完成了一个半成品,也就是说,这个时候我们要使用Sington对象,就必须通过其中的static成员函数getInstance来获取,而该函数返回的对象实例永远都是同一个实例

#include<iostream>
using namespace std;class Singleton
{
public:static Singleton* getInstance(){return &instance;}
private:static Singleton instance;Singleton(){};
};void test()
{/*此时,s1,s2,s3所指向的对象实例都是类中自己创建的那个instance*/Singleton* s1=Singleton::getInstance();Singleton* s2=Singleton::getInstance();Singleton* s3=Singleton::getInstance();
}int main()
{test();return 0;
}

但还有个问题是,编译器还会为我们创建拷贝构造函数和拷贝赋值运算符,因此,当我们进行对象拷贝操作的时候,这个实例对象就不是“单例”的了

Singleton t=*p1;//此时编译器会自行创造出一个拷贝构造函数,从而创建出一个p1的副本

而解决这个问题的办法,上述也说明过,只需将其声明为私有即可


class Singleton
{
public:static Singleton* getInstance(){return &instance;}
private:static Singleton instance;Singleton(){};Singleton(const Singleton&)=delete;Singleton& operator=(const Singleton&)=delete;
};

饿汉式单例模式

还没有获取对象实例,对象实例就已经创建了

上述最后的代码就是饿汉式单例模式,由于对象实例在类A是static的,因此我们在还没有调用接口在获取该对象的时候,它就已经存在了

class Singleton
{
public:static Singleton* getInstance(){return &instance;}
private:static Singleton instance;Singleton(){};Singleton(const Singleton&)=delete;Singleton& operator=(const Singleton&)=delete;
};

因此,它的特点是

  • 优点
    • 实现简单,线程安全:在类加载时就创建了实例,不存在多线程并发访问的问题
    • 执行效率高:没有加锁、同步等额外操作
  • 缺点
    • 内存浪费:类加载时即创建实例,如果单例对象占用大量资源或者初始化耗时较长,会导致程序启动变慢。
    • 无法延迟加载即使没有使用到该单例对象,也会被创建

懒汉式单例模式

唯一的实例,只有在第一次获取它的时候才会创建

由于饿汉式单例模式的缺陷,有了懒汉式单例模式的出现,也就是对象延迟加载,看代码


class Singleton
{
public:static Singleton* getInstance(){// return &instance;if(instance==nullptr){instance=new Singleton();}return instance;}
private:static Singleton *instance;Singleton(){};Singleton(const Singleton&)=delete;Singleton& operator=(const Singleton&)=delete;
};

最大的区别在于

我们将类中创建的对象实例声明为指针类型,这样当类加载的时候,内存中存在的是一个指针,而指针变量的大小永远都是固定的

	static Singleton *instance;

其次,再看接口函数的实现

	static Singleton* getInstance(){// return &instance;if(instance==nullptr){instance=new Singleton();}return instance;}

该函数在调用时,首先会判断instance是否为nullptr,而instance为nullptr说明用户是第一次在代码中创建该实例,此时就new一个实例对象,返回给用户,而后续用户再创建实例对象时,instance就不为空了,直接返回即可

http://www.hrbkazy.com/news/13982.html

相关文章:

  • 如何做企业交易网站太原百度快照优化排名
  • 信阳制作网站ihanshi头条站长平台
  • 微信开发一个小程序多少钱湖北seo整站优化
  • wordpress菜单加登陆seo推广外包企业
  • pc 手机网站源码网盟推广
  • 网站开发团队人员地推公司排名
  • 东莞 网站设计优化营商环境心得体会1000字
  • 南京专业网站制作多少钱百度推广个人怎么开户
  • 网站app的作用搜索引擎优化的办法有哪些
  • 做动态h5的网站河南百度推广电话
  • 用flash做的经典网站广州seo优化外包服务
  • 淮北做网站的公司网站百度不收录的原因
  • wordpress是php语言网站运营优化培训
  • 网站页面数怎么做西安网站排名优化培训
  • 做网站一定要域名吗怎么做微信小程序
  • 扬州有做义工的地方或网站嘛软文推广范文
  • 官方网站娱乐游戏城网站建设的流程及步骤
  • 株洲网站建设 英铭win7优化设置
  • 网站做跳转会有什么影响中国去中心化搜索引擎
  • 没有网站可以做备案吗淘宝店铺怎么推广和引流
  • 网站空间和域名价格五个成功品牌推广案例
  • 网站信息发布制度建设刚刚中国突然宣布
  • 什么是销售型网站seo职位
  • pageadmin做网站seo的实现方式
  • 最近中文字幕在线mv免费佛山百度快速排名优化
  • 鹰潭公司做网站关系网站优化公司
  • 萝岗免费网站建设谷歌搜索入口中文
  • 好的网站建设价格营销型网站有哪些平台
  • 手机网站返回按钮怎么做网站seo标题优化技巧
  • 网站开发与建设google广告投放技巧