C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?

In C++ are elements of an array of pointer type by default guaranteed to be initialized to nullptr?

本文关键字:是否 初始化 nullptr 元素 情况下 默认 指针 数组 类型 C++      更新时间:2023-10-16

如果我有这样的代码

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

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

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

是的,这是有保证的。

Node()构造一个临时对象并执行值初始化。结果,成员数组subnodes的所有元素都初始化为空指针。x是从临时对象进行复制初始化的,其成员也会获得相同的初始化结果。(由于复制省略x可能直接进行值初始化,无论如何结果不会更改。

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

零初始化的效果包括:

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

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

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