在以下五种情况下,编译器会生成"合成默认构造函数":
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};
};
----------------------------------------------------------------------------------------------------------------------------