C++:初始化
本文簡介 C++ 中的初始化。
1 初始化的類型
以下我們依據語法區分不同類型的初始化。
1.1 預設初始化
若物件在初始化時沒有使用初值設定式(initializer),會進行預設初始化(default-initialization)。
- 若目標型別是純量型別,則不進行初始化。
- 若目標型別是類別型別,會呼叫預設建構函式以初始化。
- 若目標型別是陣列型別,會對每一個元素進行預設初始化。
範例 1 以下是預設初始化的例子。
int n;
std::string s;
此時 n
不會被初始化(其值未定),而 s
會呼叫預設建構函式而成為空字串。
1.2 複製初始化
利用賦值語法初始化物件,稱為複製初始化(copy-initialization)。此外,函式的引數傳遞與值的回傳也會進行複製初始化。
- 複製初始化過程中,可能會進行隱性轉換(implicit conversion)。但要注意複製初始化不會考慮顯性(explicit)的建構函式和自定義轉換函式。
範例 2 以下是複製初始化的例子。
int n = 3;
std::string s = "fly";
1.3 直接初始化
利用呼叫建構函式的語法初始化物件,稱為直接初始化(direct-initialization)。
- 與複製初始化不同,直接初始化會考慮顯性(explicit)的建構函式和自定義轉換函式。
範例 3 以下是直接初始化的例子。
int n(3);
std::string s("fly");
1.4 列表初始化
利用初始化列表的初始化稱為列表初始化(list-initialization)。
利用賦值語法進行列表初始化,稱為複製列表初始化(copy-list-initialization)。
範例 4 以下是複製列表初始化的例子。
int n = {3};
std::string s = {'f', 'l', 'y'};
不藉由賦值語法而直接進行列表初始化,稱為直接列表初始化(direct-list-initialization)。
範例 5 以下是直接列表初始化的例子。
int n{3};
std::string s{'f', 'l', 'y'};