构造函数私有化或保护化
构造函数私有化或保护化
摘自: https://blog.csdn.net/caoyangxiaoyao/article/details/81184786
- 构造函数私有化/保护化
可以将构造函数设置为私有函数,但是这样做就无法从外部直接调用构造函数,因此就无法直接构造这个类的对象。
1.如果你不想让外面的用户直接构造一个类(类A)的对象,而是希望用户只能构造这个类A的子类,那么就可以将类A的构造函数/析构函数声明为protected,而将类A的子类的构造函数/析构函数声明为public。如:
#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();
}
2. 如果将构造函数/析构函数声明为private,那只能这个类的“内部”函数来构造这个类的对象了,但是,由于必须有一个对象被构造出来才能调用这个内部函数,内部函数才能调用私有的构造函数,因此我们将这个内部函数设置为静态函数,这样就不需要通过对象,而可以通过类直接调用。如下:
#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();
}
3.通常将拷贝构造函数和operator=(赋值操作符重载)声明为private,但是没有实现体。这个目的是禁止一个类的外部用户对这个类的对象进行复制动作。
二、构造函数继承与重写
基类的构造函数不能被子类继承,但是子类可以直接调用,当然子类也无法重写父类的构造函数。
#include <iostream>
using namespace std;
class animal
{
public:
animal(int height, int weight)
{
cout << "animal construct--" << height<<":"<<weight<<endl;
}
animal()
{
cout << "animal construct" << endl;
}
};
class fish :public animal
{
public:
fish() :animal(100,200)
{
cout << "fish construct" << endl;
}
};
void main()
{
fish fh;
system("pause");
}
三、构造函数能否为虚函数
不能。构造函数用来创建一个新的对象,而虚函数的运行是建立在对象的基础上,在构造函数执行时,对象尚未形成,所以不能将构造函数定义为虚函数。通常析构函数才会用virtual修饰。