3.构造函数

默认构造函数合成

C++编译器在其需要的时候,会为类合成默认构造函数,以便用来执行编译器所需的操作。所谓的需要,包含以下情况:

  • class中没有默认构造器,但是内部包含有默认构造器的成员。
    C++编译器会在构造器被调用时合成一个构造函数。如果这个构造函数不复杂,则会以inline的形式完成,如果比较复杂,则会以explicit non-inline static的形式完成。合成的构造函数将会调用成员的默认构造函数,以便完成对默认构造函数调用的保证。如果程序员提供了默认构造函数,编译器则会对默认构造函数进行扩充,在执行用户指定代码之前,调用成员的默认构造函数。如果存在多个拥有默认构造函数的成员,编译器则会按照成员定义的顺序,依次调用成员的构造函数。
  • class中没有默认构造函数,但是基类中包含默认构造函数。
    C++编译器会合成默认构造函数或扩展已有构造函数,调用基类的默认构造函数。
  • class中带有虚方法或继承自虚基类。
    C++编译器会合成默认构造函数或扩展已有构造函数,处理vptr信息和虚基类信息。同时,会生成class对应的vtbl。

说白了,编译器合成默认构造函数,主要用于达到如下两个目的:
1.调用成员和基类的默认构造函数,以便实现语言对于OO的承诺。
2.初始化虚函数机制和虚基类机制所需数据,以便支持对应的函数特性。

拷贝构造函数

拷贝构造函数主要应用于以下三种情况:

  • 对一个对象做显式的赋值操作。
  • 将一个对象作为实参传递。
  • 函数返回一个对象。

如果class中没有提供默认的拷贝构造函数,则会执行default memberwise initialization,也就是把每一个内建的或派生的数据成员的值,从某个对象拷贝到另一个对象中。拷贝的过程中不会拷贝类成员对象,而是以递归的方式实行类成员对象的拷贝。

如果class中没有提供默认的构造函数,则编译器会按需生成默认的拷贝构造函数。合成的拷贝构造函数主要用于调用成员对象的拷贝构造函数、基类的拷贝构造函数,以及处理虚方法表指针及虚基类指针。

初始化列表

使用场景:

  • 当初始化一个引用类型的成员时。
  • 当初始化一个常量成员时。
  • 当调用基类的有参构造方法时。
  • 当调用成员的有参构造方法时。

编译器在处理初始化列表时,会按照成员在class中的声明顺序进行处理,在用户定义的代码之前安插初始化操作。

你可能感兴趣的:(3.构造函数)