2014-09-05 193 views
0

在初始化子初始化列表中的空構造父類時是否存在任何危險?用初始化器列表中的空構造函數初始化父類?

例子:

class Parent 
{ 
    public: 
    Parent(){} 
    ~Parent(){} 
}; 

class Child : public Parent 
{ 
    public: 
    Child(): Parent() 
    {} 
    ~Child(){} 
}; 

原因的問題:我經常看到那裏有一個空的構造函數「父」類不符合兒童構造函數初始化列表初始化代碼。

+3

默認構造函數是隱式調用,如果你不顯式調用初始化列表構造。 – scohe001 2014-09-05 21:15:01

回答

1

假設Parent沒有用戶提供的構造函數,例如,如果它是一個聚集:

struct Parent 
{ 
    int x; 
    int get_value() const { return x; } 
}; 

現在有一個差(參見[dcl.init] /(8.1)),由於Parent值初始化將零初始化構件x,而缺省初始化將沒有:

struct GoodChild : Parent { GoodChild() : Parent() {} }; 

struct BadChild : Parent { BadChild() {} }; 

因此:

int n = GoodChild().get_value(); // OK, n == 0 

int m = BadChild().get_value(); // Undefined behaviour 
+1

具體來說,根據C++ 11,當初始化程序沒有給出時('[C++ 11:12.6.2/8]'),基地將被默認初始化,並且默認初始化聚合沒有任何用處。相比之下,在_ctor-initialiser_中包含'Parent()'將最終對其成員進行初始化('[C++ 11:12.6.2/7]')。 – 2014-09-05 21:38:01

+1

Downvoter,小心解釋你的反對意見嗎?我很樂意提高不明確或缺失的分數(或者只是自己編輯它)。 – 2014-09-05 21:54:55

+0

@ T.C .:這很有道理,謝謝。我編輯了這篇文章以反映這一點。 (清理評論。) – 2014-09-06 11:08:31

相關問題