初始化使用花括号还是圆括号?

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;
}