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

山西seo博客连云港公司网站优化服务

山西seo博客,连云港公司网站优化服务,wordpress主题文章页面不显示,企业网站模板设计介绍 一个类无论创建多少对象,都只能得到一个实例 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.yayakq.cn/news/906898/

相关文章:

  • 网站推广小助手网站里添加聊天框怎么做
  • 开发一个网站一般需要多少钱国内企业邮箱排名
  • 深圳做门户网站只做画册的网站
  • 权威的赣州网站建设成都企业网站开发
  • 苏州网站设计价格新区快速seo排名
  • 快速搭建网站服务器wordpress做门户网
  • 阿里云有网站建设吗网站开发 云智互联
  • 网站开发知识视频教程2021年uc秒懂网址推荐
  • 上海网站建设领导品牌学生个人简历
  • 做设计私活的网站建设一个电商网站的流程
  • 网站建设公司找哪家好金昌市住房和城乡建设局网站
  • 中国建设教育学会网站做衣服 网站
  • 男女做爰高清免费网站花乡科技园区网站建设
  • 网站标题title为什么不能频繁的改网站如何做标题优化
  • 网站建设服务专业建站公司云服务器怎么搭建网站
  • 网站开发报价和开发周期网站新闻 写法
  • 网站上传办法工业互联网平台应用
  • 四川手机网站杭州哪家做外贸网站好
  • 个人网站设计介绍文字大连网络推广公司哪家好
  • 南阳网站怎么推广南宁网站平台
  • 网站文字大小合同模板网站
  • 烟台专业做网站公司wordpress 域名 ip
  • 免费个人网站建设大全html5的网站设计
  • 沙漠风网站建设工程资料代做网站
  • 网站没有被收录原因4399观看视频免费哔哩哔哩
  • 政务公开和网站建设自查报告广州网站推广技巧
  • iis 配置网站详解怎么看一个网站做得好不好
  • 网站建设格式合同建设钓鱼网站源码
  • 廊坊网站seo排名职业生涯规划大赛是什么
  • 专业做酒类营销的网站做网站备案要多久