C++11引入了使用{}来初始化对象,这样初始化一个对象有如下几种方法:
class MyClass
{
public:
int value;
MyClass(int _val):value(_val){}
};
int main()
{
MyClass cls1(1);
MyClass cls2{ 1 };
MyClass cls3 = { 1 };//会调用默认拷贝函数
MyClass cls4 = 1 ;//会调用默认拷贝函数
MyClass* p1 = new MyClass(1);
MyClass* p2 = new MyClass{ 1 };
delete p1;
delete p2;
return 0;
}
实际上,就是增加了一种调用构造函数的形式,以前是圆括号,现在增加了花括号。
那么引入{}的意义是什么呢?
1.禁止变窄转换;2.适配std::initializer_list参数的构造函数;3.调用无参构造函数语义更加明确
class MyClass
{
public:
int value;
MyClass(int _val):value(_val){}
MyClass() {}
};
int main()
{
MyClass cls1(1.2);//ok
MyClass cls2{ 1.2 };//变窄转换,编译错误
MyClass cls3();//语义可以理解函数声明,函数名为cls3,返回值为MyClass类型,无参
MyClass cls4{};//语义更加明确
return 0;
}
class MyClass
{
public:
MyClass(std::initializer_list<int>_list) {}
};
int main()
{
MyClass cls1{ 1,2,3,4 }; //适配initializer_list参数的构造函数
std::vector<int>vec{1,2,3,4};//适配initializer_list参数的构造函数
return 0;
}
但要注意的是,{}会优先适配initializer_list参数的构造函数,例如下面的区别:
int main()
{
std::vector<int>vec1{ 1,4 };//适配initializer_list参数的构造函数
std::vector<int>vec2(1,4);
return 0;
}