繁体   English   中英

成员初始值设定项列表符号:花括号 vs 圆括号

[英]Member initializer list notation: curly braces vs parentheses

考虑以下来自 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) 那么这两种表示法之间是否存在语义差异? 有没有其他方法可以初始化这些变量(在初始化列表的上下文中)?

表格

Vector(int s) :elem(new double[s]), sz(s) { }

在所有版本的 C++ 中都是正确的。 带花括号的那个,比如

Vector(int s) :elem{new double[s]}, sz{s} { }

于 2011 年引入 C++ 标准,在旧标准中无效。

在您询问的上下文中,没有区别。 但是,2011 标准中也引入了其他语言和库功能,它们依赖于第二种形式并且不适用于第一种形式。

没有其他方法可以在构造函数的初始化列表中初始化基类成员。 可以分配给构造函数体中的成员,但这不是初始化语法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM