C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
In C++ are elements of an array of pointer type by default guaranteed to be initialized to nullptr?
如果我有这样的代码
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++ 中的默认初始化。有时默认初始化会做一些奇怪的事情,例如,如果您没有初始化整数,它会使用下一个可用的内存地址初始化它,这毫无意义。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 对象初始化中是否允许指向此成员的指针?
- 初始值设定项列表是否只接受使用相同类型的值初始化变量?
- 是否可以防止省略聚合初始化成员?
- 我们是否需要为 C++ 中的多个函数初始化多个模板?
- 为什么需要检查 GLAD 或 GLEW 是否正确初始化?
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- 是否可以使用右值初始化数据成员?
- 当 map 是一个整数数组并且由 operator[] 创建时,它是否初始化其映射类型
- C++,检查当我无法使用 NULL/0 时是否初始化了变量
- make_unique值是否初始化字符数组
- new[] 是否初始化内置数组
- 此零是否初始化数据项
- 检查变量是否初始化
- 是否初始化基元-c++
- std::map 中基元类型的值是否初始化
- Windows 的线程本地存储是否初始化值?
- 不管是否初始化,使用sizeof(p[0])真的无害吗?