将构造函数/析构函数设置为私有(如何构建单例模型)

两种使用场景:第一种只希望构建子类的对象,而不构建基类的对象。第二种,构建单例模型,利用静态成员函数生成类的实例

第一种使用情景:

对于类A 不想让外面的用户直接构造一个类A的对象,而是希望用户只构造类A的子类,那么可以将A的构造/析构函数声明为protected,将类A的子类的构造函数/析构函数声明为public,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespace std;
class A
{
protected:
A(){}
public:
void test(){
cout << "call A test()" << endl;
}
};

class B : public A
{
public: B(){}

};

int main(int argc, char** argv)
{
A a; // error
B b; // ok
b.test();
}

基类的构造函数被protected,外部无法访问,也就无法构造示例。但子类将基类的public和protected成员都继承为public,子类可以调用基类的函数。

第二种使用场景:

单例模型

当构造函数/析构函数被声明为private,那么无法构造类的对象,就只能使用类的内部的函数构造类的对象了。但是类的成员函数需要有类的对象才能够调用,外部不能直接构造一个对象出来。因此,我们需要将构造对象的函数声明为static,这样我们通过类就可以直接访问和调用静态成员函数。静态成员函数可以通过类直接调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
using namespace std;

class A
{
private:
A():data(10){ cout << "A" << endl; }
~A(){ cout << "~A" << endl; }

public:
static A& Instance()
{
static A a;
return a;
}
void Print()
{
cout << data << endl;
}

private:
int data;
};

int main(int argc, char** argv)
{
A& ra = A::Instance();
ra.Print();
}

单例模式

定义一个单例类:

  1. 私有化它的构造函数,以防止外界创建单例类的对象;

  2. 使用类的私有静态指针变量指向类的唯一实例;

  3. 使用一个公有的静态方法获取该实例。

参考文献

https://blog.csdn.net/fly542/article/details/8055207