通常使用的场景如下: 1。如果你不想让外面的用户直接构造一个类(假设这个类的名字为A)的对象,而希望用户只能构造这个类A的子类,那你就可以将类A的构造函数/析构函数声明为protected,而将类A的子类的构造函数/析构函数声明为public。例如: class A { protected: A(){} public: .... }; calss B : public A { public: B(){} .... };
A a; // error B b; // ok
2. 如果将构造函数/析构函数声明为private,那只能这个类的“内部”的函数才能构造这个类的对象了。这里所说的“内部”不知道你是否能明白,下面举个例子吧。 class A { private: A(){ } ~A(){ }
public: void Instance()//类A的内部的一个函数 { A a; } }; 上面的代码是能通过编译的。上面代码里的Instance函数就是类A的内部的一个函数。Instance函数体里就构建了一个A的对象。 但是,这个Instance函数还是不能够被外面调用的。为什么呢? 如果要调用Instance函数,必须有一个对象被构造出来。但是构造函数被声明为private的了。外部不能直接构造一个对象出来。 A aObj; // 编译通不过 aObj.Instance(); 但是,如果Instance是一个static静态函数的话,就可以不需要通过一个对象,而可以直接被调用。如下:class A { private: A():data(10){ cout << "A" << endl; } ~A(){ cout << "~A" << endl; }