在 c++ () 或 {} 中委托构造函数
Delegating constructors in c++ () or {}
我阅读了 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}{}
圆括号和大括号之间有什么区别吗?
如果没有区别,我也可以在其他函数调用中使用大括号吗?或者它只是在构造函数委托中?
最后,为什么我们应该同时拥有这两种语法?有点暧昧
()
如果非空则使用 value initialization if the parentheses are empty, or direct initialization。
{}
如果初始化对象是聚合,则使用 list initialization, which implies value initialization if the braces are empty, or aggregate initialization。
由于您的 X
是一个简单的 int
,因此使用 ()
或 {}
初始化它没有区别。
可以用圆括号或大括号指定初始化值。
大括号初始化是在 C++11 中引入的,它意味着 "uniform initialization" 可用于所有非静态变量。
可以在括号或等号的位置使用大括号,引入大括号是为了提高一致性并减少混淆。
它只是一个语法结构,不会带来性能优势或损失。
我阅读了 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}{}
圆括号和大括号之间有什么区别吗?
如果没有区别,我也可以在其他函数调用中使用大括号吗?或者它只是在构造函数委托中?
最后,为什么我们应该同时拥有这两种语法?有点暧昧
()
如果非空则使用 value initialization if the parentheses are empty, or direct initialization。
{}
如果初始化对象是聚合,则使用 list initialization, which implies value initialization if the braces are empty, or aggregate initialization。
由于您的 X
是一个简单的 int
,因此使用 ()
或 {}
初始化它没有区别。
可以用圆括号或大括号指定初始化值。
大括号初始化是在 C++11 中引入的,它意味着 "uniform initialization" 可用于所有非静态变量。
可以在括号或等号的位置使用大括号,引入大括号是为了提高一致性并减少混淆。
它只是一个语法结构,不会带来性能优势或损失。