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


我读 这个链接 Stroustrup的代码如下:

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

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


8745
2017-10-17 10:31


起源

“我可以在其他函数调用中使用大括号,还是只在构造函数委托中?” - 构造函数委派不是函数调用。你永远不能使用 {} 用函数调用。 - emlai
检查一下: stackoverflow.com/questions/18222926/...


答案:


() 使用 值初始化 如果括号是空的,或者 直接初始化 如果非空。

{} 使用 列表初始化,这意味着 值初始化 如果大括号是空的,或者 聚合初始化 如果初始化对象是聚合。

既然你的 X 很简单 int,初始化与之间没有区别 () 要么 {}


10
2017-10-17 10:36



如果我理解正确的话就意味着我是在打字 X(): X(42){} 然后我调用inte构造函数,但如果我正在编写 X(): X{42}{} 那我只是初始化memebr变量而不调用另一个构造函数? - Govan
@Govan - 原始类型如 int 和 double 不是完全成熟的对象。他们没有建设者。 - David Hammen
@DavidHammen我的意思是X(int构造函数)不是原始的int constructior - Govan
@Govan自从 int 没有构造函数,初始化时没有构造函数被调用 X。都 X(42) 和 X{42} 将执行直接初始化,从那以后 X 是类型 int,这意味着隐式转换 42 至 int 将执行初始化 X。所以在简单的情况下 int,两者 () 和 {} 做同样的事。 - emlai
“因为X是类型的 int“ - 不,不是!它是一个完全成熟的类。不可否认,它只有一个类型的数据成员 int,但它有 三 用户定义的构造函数。 - Martin Bonner


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

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

支架可用于括号或等号的位置,并用于增加均匀性和减少混淆。

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


0
2017-10-17 10:46