Petty C++ 初始化

在 C++ 中，初始化或者初始值设定（initializers）是一种设置变量或对象初始状态的表达式，经常出现在对象的创建、成员的初始化、数组赋值等上下文中。

直接初始化

直接初始化可以使用()或者{}初始化变量：

Copy
int a(10);
int b{10};

// 成员初始化表达式列表就是一种直接初始化方式
MyClass(int a, int b): x(a), y(b){
// do something..
}

直接初始化可以调用显式的构造函数

复制初始化

复制初始化使用复制赋值操作符=，于直接初始化不同，它不可以调用显式的构造函数

Copy
int a = 10;
shared_ptr<int> p = new int(10); // 错误

列表初始化

列表初始化是 C++11 之后的新特性，允许使用花括号{}初始化任何类型的变量，它可以防止窄化转换（即从一种类型隐式转换为另一种类型而造成的精度丢失等行为: int x {4.2}）

Copy
MyClass myClass = {1,2,3};
// or
MyClass myClass = new MyClass{1,2,3};
std::vector<int> v = {1,2,3};

聚合 (struct) 初始化

聚合是一种没有用户定义的构造函数、没有私有或受保护的非静态数据成员、没有基类和没有虚函数的类或结构体

对于聚合类型，可以使用花括号初始化其成员，例如：

Copy
struct Point {int x; int y;};
Point p = {1, 2};

默认成员初始化器

默认成员初始化器是 C++11 引入的新特性，允许在类定义中直接为成员变量指定默认的值

Copy
class MyClass{
int x = 4;
int y = 2;
public:
MyClass() = default; // 使用默认构造函数和默认成员初始化器初始化
// do something ..
}