性能問題之外,有些時場合初始化列表是不可或缺的,以下幾種情況時必須使用初始化列表
- 常量成員,因為常量只能初始化不能賦值,所以必須放在初始化列表里面
-
Error1(constchar* constmsg) :data(msg)
{
//data = msg;
}
- 引用類型,引用必須在定義的時候初始化,并且不能重新賦值,所以也要寫在初始化列表里面
- 沒有默認構造函數的類類型,因為使用初始化列表可以不必調用默認構造函數來初始化,而是直接調用拷貝構造函數初始化。
-
?classError2
{
constchar* const data;
public:
Error2(constchar* constmsg = 0) :data(msg){}//Error2()
};
classError1
{
constchar* const data;
Error2 e2;
public:
Error1(constchar* constmsg=0) :data(msg)
{
// e2 = e2Out;
//data = msg;
}
//Error1(const char* const msg = 0) :data(msg){}
Error1(constchar* constmsg, Error2 & e2Out) :data(msg), e2(e2Out)
{
//e2 = e2Out;
//data = msg;
}
};
if not, there will be a waring, - 但是對于類類型來說,最好使用初始化列表,為什么呢?由上面的測試可知,使用初始化列表少了一次調用默認構造函數的過程,這對于數據密集型的類來說,是非常高效的。同樣看上面的例子,我們使用初始化列表來實現Test2的構造函數
struct Test2 {Test1 test1 ;Test2(Test1 &t1):test1(t1){} }
-
-
使用同樣的調用代碼,輸出結果如下。
第一行輸出對應 調用代碼的第一行。第二行輸出對應Test2的初始化列表,直接調用拷貝構造函數初始化test1,省去了調用默認構造函數的過程。所以一個好的原則是,能使用初始化列表的時候盡量使用初始化列表。
-