()会处理类型收窄,虽然会因为精度丢失数据,而{}不行
在对自定义类对象进行初始化时,{}会优先使用initializer_list的构造函数
class A
{
public:
string name;
int age;
A(const char* name = " ", int age = 1) :name(name), age(age) {}
};
int main()
{
// 内置类型
int a1(0);
int a2 = 0;
int a3{ 0 };
int a4 = { 0 }; // 等于a3写法,内置类型不区分拷贝构造和构造
// 自定义类型
A b0{}; // 等于A b0();
A b1 = A("anne", 10.1); // 虽然会发生类型窄化,但()允许将double转为int
A b2 = A{ "bell",12 };
//A b2 = A{ "bell",12.1 }; // {}的判断就很严格,不允许将double转为int
A b3(b1);
A b4{ b1 }; // 拷贝构造用法也是类似的
return 0;
}