在 C++ 中,初始化或者初始值设定(initializers)是一種設置變量或對象初始狀態的表達式,經常出現在對象的創建、成員的初始化、數組賦值等上下文中。
直接初始化#
直接初始化可以使用()
或者{}
初始化變量:
int a(10);
int b{10};
// 成員初始化表達式列表就是一種直接初始化方式
MyClass(int a, int b): x(a), y(b){
// do something..
}
直接初始化可以調用顯式的構造函數
複製初始化#
複製初始化使用複製賦值操作符=
,於直接初始化不同,它不可以調用顯式的構造函數
int a = 10;
shared_ptr<int> p = new int(10); // 錯誤
列表初始化#
列表初始化是 C++11 之後的新特性,允許使用花括號{}
初始化任何類型的變量,它可以防止窄化轉換(即從一種類型隱式轉換為另一種類型而造成的精度丟失等行為: int x {4.2})
MyClass myClass = {1,2,3};
// or
MyClass myClass = new MyClass{1,2,3};
std::vector<int> v = {1,2,3};
聚合 (struct) 初始化#
聚合是一種沒有用戶定義的構造函數、沒有私有或受保護的非靜態數據成員、沒有基類和沒有虛函數的類或結構體
對於聚合類型,可以使用花括號初始化其成員,例如:
struct Point {int x; int y;};
Point p = {1, 2};
默認成員初始化器#
默認成員初始化器是 C++11 引入的新特性,允許在類定義中直接為成員變量指定默認的值
class MyClass{
int x = 4;
int y = 2;
public:
MyClass() = default; // 使用默認構造函數和默認成員初始化器初始化
// do something ..
}