2013-05-21 69 views
2

在C++ 11,可以做到這一點,而無需使用初始化列表初始化對象:使用構造默認成員值

class Z{ 
    int a=0; 
    int b; 
    z():b(0){} //<-- a already initialized 
    }; 

什麼我不知道是類類型,這些是優選的:

class Z{ 
    std::vector<int>a=std::vector<int>(); 
    //or instead: 
    std::vector<int>a(); 
    int b; 
    z():b(0){} //<-- a already initialized 
    }; 

回答

7

沒有必要明確地默認初始化a,因爲它將被默認構造。這將做精:

class Z 
{ 
    std::vector<int> a; 
    int b = 0; 
    z() {} //<-- a, b already initialized 
}; 

需要注意的是你的第二個變體是函數聲明,而不是一個初始化:

// function a(), returns std::vector<int> 
std::vector<int> a(); 

,所以你應該使用什麼

// data member a is an std::vector<int>. Default construct it. 
std::vector<int> a{}; 

當然,如果你不想缺省構造,那麼在聲明點初始化非常方便:

std::vector<int> a{0,1,2,3}; 
+0

嗯,我打算按照一般規則初始化所有東西,因此通常總是使用初始化器列表(如Scott Meyers所建議的),但在這種情況下,使用C++ 11初始化器功能。 – johnbakers

+1

邁爾斯真的建議明確初始化具有完美良好默認構造函數的成員嗎?這似乎很奇怪的建議。你確定你沒有想到初始化列表(或聲明,現在這些日子)​​初始化事情的建議,而不是在構造函數體中分配它們嗎? –

+1

@Fellowshee像std :: vector這樣的默認構造類並不意味着它是未初始化的。如果一個類型有一個默認的構造函數來設置一個有效的狀態,那麼讓這個類型被隱式調用似乎是最清晰的選項。 – Agentlien

1

我的建議是這樣做:

class Z{ 
    std::vector<int> a; 
    int b = 0; 

};

這是最簡單的版本,也是最簡單的閱讀。它不會添加任何無用的混亂,並且很明顯,您是默認構造函數a並初始化爲b0