请考虑以下来自pg的代码片段。 17的 C ++之旅:
class Vector {
public:
Vector(int s) :elem{new double[s]}, sz{s} { } //construct a Vector
double& operator[](int i) { return elem[i]; } //element access: subscripting
int size() { return sz; }
private:
double* elem; // pointer to the elements
int sz; // the number of elements
};
这里我关注第三行的成员初始化列表,其中Stroustrup将冒号与两个初始化语句elem{new double[s]}
和sz{s}
分开。
问题:为什么在这里使用括号(即{..}
)来生成这两个初始化语句?我已经在网络上的其他地方看到人们用括号创建初始化列表,这样这也可以(AFAIK)合法地阅读elem(new double[s])
和sz(s)
。那么这两个符号之间是否存在语义差异?有没有其他方法可以初始化这些变量(在初始化列表的上下文中)?
答案 0 :(得分:3)
表格
Vector(int s) :elem(new double[s]), sz(s) { }
在所有版本的C ++中都是正确的。有花括号的那个,比如
Vector(int s) :elem{new double[s]}, sz{s} { }
于2011年被引入C ++标准,在旧标准中无效。
在您询问的上下文中,没有区别。但是,还有其他语言和库功能,也引入了2011标准,依赖于第二种形式而不能与第一种形式一起使用。
在构造函数的初始化列表中没有其他方法来初始化base的成员。可以分配给构造函数体中的成员,但这不是初始化语法。