建構函數除名稱、參數列表、函數體外,可在冒號後跟初始化列表:
struct Foo {
string name;
int id;
Foo(string s, int i) : name(s), id(i) {} // 初始化列表
};
對內建型別(int、指標等)差異不大;但對類類型,列表初始化可直接呼叫拷貝/移動建構函數,避免「預設建構 + 賦值」兩步操作,提升效率。
struct Test1 {
Test1() { cout << "Default\n"; }
Test1(const Test1&) { cout << "Copy\n"; }
Test1& operator=(const Test1&) { cout << "Assign\n"; return *this; }
};
struct Test2 {
Test1 t;
Test2(Test1& x) : t(x) {} // 列表:直接 Copy
// Test2(Test1& x) { t = x; } // 函數體:Default + Assign
};
列表版僅輸出 Copy,函數體版輸出 Default + Assign。
const 成員:只能初始化,不能賦值。
按成員在類中**宣告順序**初始化,與列表中順序無關。最好保持列表順序與宣告順序一致,避免未定義行為。
struct Foo {
int i, j;
Foo(int x) : i(x), j(i) {} // OK:i 先初始化
Foo(int x) : j(x), i(j) {} // 錯誤:i 用未初始化的 j 初始化
};
初始化列表是 C++ 高效、正確建構物件的關鍵機制。原則:能用列表就用列表,順序跟隨宣告順序,const/參考/無預設建構成員強制使用。