6

如果我有这样的代码

class Node {
public:
    Node *subnodes[10];
};
Node x = Node();

该代码运行后是否有保证x->subnodes[0] == nullptr

我不是 C++ 专家,我发现 C++ 规范令人生畏。这在实践中可行,但是规范是否保证在这种情况下将 nullptr 放入数组的每个元素中(而不是说,可能是垃圾)?到目前为止,我还没有通过找到权威的规范语言来说服自己,并且在野外我看到很多代码示例似乎不相信这是真的。所以,在一段时间未能提出答案后,我转向你,堆栈溢出。提前致谢。

4

2 回答 2

4

是的,这是有保证的。

Node()构造一个临时对象并执行值初始化。结果,成员数组的所有元素subnodes都被零初始化为空指针。x从临时对象复制初始化,其成员也得到相同的初始化结果。(因为复制省略 x可能会直接进行值初始化,反正结果不会改变。)

如果 T 是具有既不是用户提供也不是删除的默认构造函数的类类型(即,它可能是具有隐式定义或默认构造函数的类),则该对象为零初始化,然后是默认值-如果它具有非平凡的默认构造函数,则初始化;

零初始化的效果是:

  • 如果 T 是标量类型,则对象的初始值是显式转换为 T 的整数常量零。
  • 如果 T 是非联合类类型,则所有基类和非静态数据成员都初始化为零,并且所有填充都初始化为零位。构造函数(如果有)将被忽略。
  • ...
  • 如果 T 是数组类型,则每个元素都进行零初始化。
  • ...

顺便说一句:对于像这样的默认初始化Node x;,成员数组的元素将被初始化为不确定的值。

于 2020-06-25T01:28:41.530 回答
-1

虽然保证将其初始化为 nullptr,但我不建议依赖 c++ 中的默认初始化。有时默认初始化会做一些奇怪的事情,例如,如果你没有初始化一个整数,它会用下一个可用的内存地址初始化它,这使得零意义。

于 2020-06-25T02:38:08.193 回答