C++默认构造函数的创建

C++新手一般有两个常见的误解:

  1. 任何class 如果没有定义default constructor,就会被合成出一个来.
  2. 编译器合成出来的default constructor 会明确设定“class内每一个datamember的默认值”。

但是,C++默认构造函数只有在一下四种情况才会进行默认的构造函数创建!

  1. 带有Default Constructor 的Member Class Object

    如果一个class没有任何constructor,但它内含一个member object,而后者 有default constructor,那么这个class的implicit default constructor 就是 “nontrivial”,编译器需要为此class合成出一个default constructor。不过这个 合成操作只有在constructor真正需要被调用时才会发生。

    例子:Bar会生成一个默认的构造函数

    带有默认构造函数的成员类对象

    提示:被合成的默认构造函数只是满足编译器的需要,而不是程序的需要。

  2. “带有 Default Constructor”的 Base Class

    如果一个没有任何constructors的class派生自一个“带有default constructor”的base class,那么这个derived class的default constructor会被视为nontrivial,并因此需要被合成出来。它将调用上一层base classes的default constructor(根据它们的声明次序)。对一个后继派生的class而言,这个合成的constructor和一个“被明确提供的default constructor”没有什么差异。

  3. “带有一个 Virtual Function”的Class

    构造函数的构建主要是为了初始化或者更新虚函数指针

    例子

    虚函数构造函数
  4. “带有一个Virtual Base Class”的Class

    例子:

    虚基类

在合成的default constructor中,只有base class subobjects和member classobjects会被初始化。所有其它的 nonstatic data member,如整数、整数指针、整数数组等等都不会被初始化。这些初始化操作对程序而言或许有需要,但对编译器则并非必要。如果程序需要一个“把某指针设为0”的default constructor,那么提供它的人应该是程序员。

你可能感兴趣的:(C++默认构造函数的创建)