默认构造函数合成
C++编译器在其需要的时候,会为类合成默认构造函数,以便用来执行编译器所需的操作。所谓的需要,包含以下情况:
- class中没有默认构造器,但是内部包含有默认构造器的成员。
C++编译器会在构造器被调用时合成一个构造函数。如果这个构造函数不复杂,则会以inline的形式完成,如果比较复杂,则会以explicit non-inline static的形式完成。合成的构造函数将会调用成员的默认构造函数,以便完成对默认构造函数调用的保证。如果程序员提供了默认构造函数,编译器则会对默认构造函数进行扩充,在执行用户指定代码之前,调用成员的默认构造函数。如果存在多个拥有默认构造函数的成员,编译器则会按照成员定义的顺序,依次调用成员的构造函数。 - class中没有默认构造函数,但是基类中包含默认构造函数。
C++编译器会合成默认构造函数或扩展已有构造函数,调用基类的默认构造函数。 - class中带有虚方法或继承自虚基类。
C++编译器会合成默认构造函数或扩展已有构造函数,处理vptr信息和虚基类信息。同时,会生成class对应的vtbl。
说白了,编译器合成默认构造函数,主要用于达到如下两个目的:
1.调用成员和基类的默认构造函数,以便实现语言对于OO的承诺。
2.初始化虚函数机制和虚基类机制所需数据,以便支持对应的函数特性。
拷贝构造函数
拷贝构造函数主要应用于以下三种情况:
- 对一个对象做显式的赋值操作。
- 将一个对象作为实参传递。
- 函数返回一个对象。
如果class中没有提供默认的拷贝构造函数,则会执行default memberwise initialization,也就是把每一个内建的或派生的数据成员的值,从某个对象拷贝到另一个对象中。拷贝的过程中不会拷贝类成员对象,而是以递归的方式实行类成员对象的拷贝。
如果class中没有提供默认的构造函数,则编译器会按需生成默认的拷贝构造函数。合成的拷贝构造函数主要用于调用成员对象的拷贝构造函数、基类的拷贝构造函数,以及处理虚方法表指针及虚基类指针。
初始化列表
使用场景:
- 当初始化一个引用类型的成员时。
- 当初始化一个常量成员时。
- 当调用基类的有参构造方法时。
- 当调用成员的有参构造方法时。
编译器在处理初始化列表时,会按照成员在class中的声明顺序进行处理,在用户定义的代码之前安插初始化操作。