两种使用场景:第一种只希望构建子类的对象,而不构建基类的对象。第二种,构建单例模型,利用静态成员函数生成类的实例
第一种使用情景:
对于类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; B b; 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(); }
|
单例模式
定义一个单例类:
私有化它的构造函数,以防止外界创建单例类的对象;
使用类的私有静态指针变量指向类的唯一实例;
使用一个公有的静态方法获取该实例。
参考文献:
https://blog.csdn.net/fly542/article/details/8055207