在程序员没有为类定义默认构造函数的情况下,C++编译器在某些情况下会自动生成默认构造函数。
1.类中包含的其他有默认构造函数的类的对象
例如:
Class A
{
private:
int data;
public:
A();
};
A::A()
{
this->data = 10;
}
Class B
{
private:
A m_a;
int m_data;
};
B类中包含A类的成员对象,而A类有默认构造函数,这时,编译器会为B类自动生成一个默认构造函数,用以初始化A类成员变量m_a,生成的代码可能如下:
inline
B::B()
{
m_a.A::A();//调用A类构造函数初始化m_a对象
}
编译器自动生成的默认构造函数只负责初始化有默认构造函数的成员对象,其他的一律不负责(不会去处理m_data的初始化,这个该由程序员去做)
2.基类有默认构造函数
这种情况与上面的类型,编译器生成的默认构造函数可能情况下:
inline
DeviredClass::DeviredClass()
{
this->Base::Base();
}
3.带有虚函数的类
这种情况下是由于编译器需要给每一个该类的对象设置虚函数表的地址,设置每一个对象的vptr(指向vtbl)
因此,编译器需要在类的构造函数中增加这一步操作(这个不是用户来进行的,只要是有虚函数的类编译器都会帮助处理该过程)
其实对于每一个构造函数(无论是编译器自动生成的还是用户定义的),编译器都会在每一个函数中增加设置vptr。
4.虚拟继承的类
这个用的实在比较少,因此略过了。
上面提到的是用户没有提供默认构造函数的情况。
假设用户提供了默认构造函数又会是什么情况
比如用户提供了默认构造函数,但是函数中没有去调用基类构造函数初始化对象基类部分亦或没有去调用成员对象的默认构造函数
那么,编译器会在编译时在用户提供的构造函数中帮助用户增加这些代码,无论是默认构造函数还是其他用户自定义构造函数
总结自《INSIDE THE C++ MODEL》