将构造函数c;析构函数声明为私有和保护的c;那么对象如何创建?
已经不能从外部调用构造函数了c;但是对象必须被构造c;应该如何解决c;麻烦大家帮忙说明c;关于构造c;析构函数声明为私有和保护时的用法???
提出这个问题c;说明你已经对c++有所思考了。
从语法上来讲c;一个函数被声明为protected或者privatec;那么这个函数就不能从“外部”直接被调用了。
对于protected的函数c;子类的“内部”的其他函数可以调用之。
而对于private的函数c;只能被本类“内部”的其他函数说调用。
语法上就是这么规定的c;你肯定也知道的咯。
那么为什么有时候将构造函数或者析构函数声明为protected的或者private的?
通常使用的场景如下:
1。如果你不想让外面的用户直接构造一个类(假设这个类的名字为A)的对象c;而希望用户只能构造这个类A的子类c;那你就可以将类A的构造函数/析构函数声明为protectedc;而将类A的子类的构造函数/析构函数声明为public。例如:
<code class="tags" href="/tags/CLASS.html" title=class>class="language-cpp">#include <iostream> using namespace std; class="tags" href="/tags/CLASS.html" title=class>class A { protected: A(){} public: void test(){ cout << "call A test()" << endl; } }; class="tags" href="/tags/CLASS.html" title=class>class B : public A { public: B(){} }; int main(int argc, char** argv) { A a; // error B b; // ok b.test(); }code>
2. 如果将构造函数/析构函数声明为privatec;那只能这个类的“内部”的函数才能构造这个类的对象了。这里所说的“内部”不知道你是否能明白c;下面举个例子吧。
class="tags" href="/tags/CLASS.html" title=class>class A
{
private:
public:
};
上面的代码是能通过编译的。上面代码里的Instance函数就是类A的内部的一个函数。Instance函数体里就构建了一个A的对象。
但是c;这个Instance函数还是不能够被外面调用的。为什么呢?
如果要调用Instance函数c;必须有一个对象被构造出来。但是构造函数被声明为private的了。外部不能直接构造一个对象出来。
A aObj; // 编译通不过
aObj.Instance();
但是c;如果Instance是一个static静态函数的话c;就可以不需要通过一个对象c;而可以直接被调用。如下:
<code class="tags" href="/tags/CLASS.html" title=class>class="language-cpp">#include <iostream> using namespace std; class="tags" href="/tags/CLASS.html" title=class>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(); }code>
上面的代码其实是class="tags" href="/tags/SheJiMoShi.html" title=设计模式>设计模式singleton模式的一个简单的C++代码实现。
还有一个情况是:通常将拷贝构造函数和operator=(赋值操作符重载)声明成privatec;但是没有实现体。
这个的目的是禁止一个类的外部用户对这个类的对象进行复制动作。