编译器生成“合成默认构造函数'的情况总结

在以下五种情况下,编译器会生成"合成默认构造函数":

1.本身没有任何构造函数,但是含有类成员,且该类成员含有默认构造函数。

2.子类继承父类,且父类含有默认构造函数,但是子类没有任何构造函数。

3.含有虚函数,且自身没有任何构造函数。

4.含有虚基类,且自身没有任何构造函数。

5.定义成员变量的时候赋初值,且自身没有任何构造函数。

(注:对于含有虚函数和虚基类的类,即使自己定义了构造函数,编译器同样会在开头安插保存虚函数表或者虚基类表的代码)。

下面举例:

-------------------------------------------------------------------------------------------------------------------

1:本身没有任何构造函数,但是含有类成员,且该类成员含有默认构造函数。

class A
{

public:

A(){}

};

class B

{

public:

private:
 A a;

};

------------------------------------------------------------------------------------------------------------

2.子类继承父类,且父类含有默认构造函数,但是子类没有任何构造函数。

class A
{

public:

A(){}

};

class B:public A{

public:

};

----------------------------------------------------------------------------------------------------------------

3.含有虚函数,且自身没有任何构造函数。

class A

{

public:

virtual void foo();

};

-----------------------------------------------------------------------------------------------------------------

4.含有虚基类,且自身没有任何构造函数。

class A

{

public:

};

class B:virtual public A

{

public:

};

class C:virtual public A

{

public:

};

class D:public A,public B

{

public:

};

------------------------------------------------------------------------------------------------------------------------

对于情况5,是C++11引入的,比如:

class A{

private:

int x{0};
};

----------------------------------------------------------------------------------------------------------------------------

原文地址:https://www.cnblogs.com/SunShine-gzw/p/13571891.html