在c ++()或{}中委托构造函数

时间:2015-10-17 10:31:21

标签: c++ c++11 constructor delegation

我使用以下代码阅读了Stroustrup的this link

class X {
        int a;
    public:
        X(int x) { if (0<x && x<=max) a=x; else throw bad_X(x); }
        X() :X{42} { }
        X(string s) :X{lexical_cast<int>(s)} { }
        // ...
    };

我的问题是关于这一行:

X() X{42}{}

括号和大括号之间是否有任何区别?
如果没有差异,我可以在其他函数调用中使用大括号吗?或者只是在构造函数委托中? 最后为什么我们应该有这两种语法?这有点暧昧。

2 个答案:

答案 0 :(得分:13)

如果括号为空,则

()使用value initialization,如果非空,则使用direct initialization

{}使用list initialization,如果大括号为空,则隐含value initialization;如果初始化对象是聚合,则隐含aggregate initialization

由于您的X是一个简单的int,因此将其与(){}初始化没有区别。

答案 1 :(得分:2)

可以使用括号或大括号指定初始化值。

使用C ++ 11引入了大括号初始化,它意味着可以用于所有非静态变量的“统一初始化”。

可以在括号或等号的位置使用括号,以增加均匀度并减少混淆。

它只是一种语法结构,不会带来性能上的好处或惩罚。