一个类,如果没有任何的用户声明的的构造函数,那么会有一个默认的构造函数被隐式地声明出来。这个被隐式声明的构造函数,究竟什么时候被合成、被编译器合成的默认构造函数究竟执行怎么样的操作,编译器如何处理用户定义的构造函数,见下:
1)类的成员变量带有默认构造函数 (带有default constructor的member class object),合成的default constructor只调用了成员对象的构造函数。
2)类的基类带有默认构造函数,同上,编译器会合成default constructor 调用基类的default constructor 或者扩展现有的每一个constructor,并且在成员对象默认构造函数调用之前。
3)类带有virtual函数
合成default constructor在对象的开头写入vptr(虚表指针)用于实现多态;
当用派生类对象复制初始化一个基类对象,他的虚表指针必须得到正确的赋值,而不能使用bitwise,所以default copy constructor必须被合成出来
4)类带有一个virtual基类
对象中有一个virtual base class subobject的指针(这个不同编译器的实现方式不同,有的是virtual base class table,有的是在虚函数表中写入virtual base class的offset,总之需要default constructor和default copy constructor实现,并在用户定义的构造函数添加代码。
满足上述4种情况之一或以上的类,若没有声明任何的构造函数,编译器会为其合成一个默认的构造函数;若已声明一个或多个构造函数,则编译器会为每个构造函数安插一定的代码来完成编译必要的工作。这些被合成的构造函数称为implicit nontrivial default constructors(隐式有效的默认构造函数)。
默认构造函数在需要被调用时被合成出来,并且在不同的编译模块用inline方式避免合成多个default constructor