2015-06-23 144 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:

對於一類,它的非靜態數據成員,其非 - 虛擬直接基礎類,如果該類不是抽象類,則將其虛擬基類稱爲其潛在構造的子對象。