单例模式

概念:只能创建一个对象的类

实现关键:   1、所有构造函数都必须是private的(包括带参构造,拷贝构造,赋值运算符)

                     2、通过static成员函数申请对象空间,并返回地址

        3、定义一个静态标记,记录对象的个数,并控制

           4、析构函数将标记清空,以达到重复申请对象的目的,析构函数是public的

        5、赋值运算符、拷贝构造函数也必须是private的,由于编译器默认合成的赋值运算符和拷贝构造函数都是public的,所以这两个函数都要人为定义,而不能由编辑器默认合成

 

代码实现:

1 #include <iostream>
2
3 using namespace std;
4
5 class Single
6 {
7 private: //由于单例模式下所有构造函数都必须是private的,但编译器默认合成的所有构造函数都是public的,
8 Single() = default; //所以此时所有构造函数都要人为定义一遍
9 Single(const Single&) = default;
10 Single& operator=(const Single&) = default;
11
12 public:
13 static int flag ;
14 static Single* creat();
15 ~Single() //析构函数是public的
16 {
17 flag = 0;
18 }
19 };
20
21 int Single::flag = 0;
22
23 Single* Single::creat()
24 {
25 if (flag == 0)
26 {
27 flag = 1;
28 return (new Single);
29 }
30 else
31 return nullptr;
32 }
33
34
35 int main()
36 {
37 Single *p1 = Single::creat(); //创建一个对象
38 delete p1; //销毁此对象
39
40 Single *p2 = Single::creat(); //正确:由于之前的对象已经被销毁,所以可以创建一个新对象
41 Single *p3 = Single::creat(); //错误:该类只能存在一个唯一对象,故此时p3被创建为nullptr
42
43 return 0;
44 }