构造函数私有化或保护化

构造函数私有化或保护化

摘自: https://blog.csdn.net/caoyangxiaoyao/article/details/81184786

  1. 构造函数私有化/保护化

可以将构造函数设置为私有函数,但是这样做就无法从外部直接调用构造函数,因此就无法直接构造这个类的对象。

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修饰。

posted @ 2023-04-24 11:24  泽良_小涛  阅读(80)  评论(0编辑  收藏  举报