2015-06-23 55 views

回答

3

如果在构造函数initializer list中没有提到基类,它将是default initialized。由于基类肯定是类的类型,这意味着将调用default constructor

其中两个引用也有隐式调用基类默认构造函数的派生类的示例。例如:

struct Class : public Base 
{ 
    unsigned char x; 
    unsigned char y; 

    Class (int x) 
     : Base (123), // initialize base class 
     x (x),  // x (member) is initialized with x (parameter) 
     y { 0 }  // y initialized to 0 
    {}    // empty compound statement 

    Class (double a) 
     : y (a+1), 
     x (y) // x will be initialized before y, its value here is indeterminate 
    {} // base class constructor does not appear in the list, it is 
     // default-initialized (not the same as if Base() were used, which is value-init) 

    ... 
}; 
1

它使用默认的构造,如通过标准的在N4140 初始化碱和成员,§12.6.2[class.base.init]/8(重点煤矿)规定:

在非委托构造,如果给定的潜在的构造子对象不是由MEM-初始化-ID (包括的情况下指定其中不存在MEM-初始化列表因为构造没有ctor -initializer) 然后

  • 如果实体是具有撑 - 或等于初始值设定的非静态数据成员,要么

    • 构造的类是联合,并且没有该联盟的其他变体成员被指定为mem-initializer-id
    • 构造函数的类不是联合体,并且如果实体是匿名联合的成员,该联合的ER构件由MEM-初始化-ID指定,如在8.5指定

    实体被初始化;

  • 否则,如果实体是匿名联合或变体成员,则不执行初始化;

  • 否则,实体默认初始化为

注意,基类潜在构造每特殊成员函数子对象,§12[特殊]/5:

对于一类,它的非静态数据成员,其非 - 虚拟直接基础类,如果该类不是抽象类,则将其虚拟基类称为其潜在构造的子对象。