在 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 ..
}