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; }标签:初始化,int,适配,list,圆括号,initializer,括号,MyClass,构造函数 From: https://www.cnblogs.com/hosseini/p/18157633