2013-11-09 211 views
7

C++ 11現在支持在聲明時設定類成員字段的值,如下所示:C++ 11是否重新初始化初始化成員字段?

class MyClass 
{ 
private 
    int test = 0; 
} 

如果我還在構造這樣初始化變量:

class MyClass 
{ 
private 
    int test = 0; 

public: 
    MyClass() : test(1) 
    { 
    } 
} 

將這會導致變量的值被設置兩次,或者該規範指示編譯器應該優化它以僅初始化變量一次?如果規範沒有規定任何東西,你是否知道着名編譯器(例如MSVC,GCC等)的行爲?

回答

14

標準實際上具有用於此的規則,在§12.6.2/ 9:

如果一個給定的非靜態數據成員既具有大括號或相等的初始值設定和MEM-初始化,執行由mem初始化程序指定的初始化,並且忽略非靜態數據成員的括號或等於初始化程序 。 [實施例:鑑於

struct A { 
int i = /∗ some integer expression with side effects ∗/ ; 
A(int arg) : i(arg) { } 
// ... 
}; 

的A(int)構造將簡單地初始化i至arg的值,和副作用在我的大括號或-equal- 初始化將不會發生。 - 結束示例]

所以在你所描述的情況,如果默認構造函數被調用,只定義了初始化會有執行,test1