零初始化
来自 cppreference.cn
将对象的初始值设置为零。
目录 |
[编辑] 语法
请注意,这不是零初始化的语法,该初始化在语言中没有专门的语法。 这些是其他类型初始化的示例,这些初始化可能会执行零初始化。
static T object ; |
(1) | ||||||||
T () ; T t T |
(2) | ||||||||
CharT array [ n ] = " short-sequence "; |
(3) | ||||||||
[编辑] 解释
在以下情况下执行零初始化
零初始化的效果是
- 如果
T
是联合体类型
- 所有填充位都初始化为零位,并且
- 对象的第一个非静态具名数据成员被零初始化。
- 如果
T
是数组类型,则每个元素都被零初始化。 - 如果
T
是引用类型,则不执行任何操作。
[编辑] 注释
如非局部初始化中所述,静态和线程局部(自 C++11 起) 且未进行常量初始化的变量在任何其他初始化发生之前会被零初始化。 如果非类非局部变量的定义没有初始化器,则默认初始化不执行任何操作,从而使先前的零初始化的结果保持不变。
零初始化的指针是其类型的空指针值,即使空指针的值不是整数零。
[编辑] 示例
运行此代码
#include <iostream> #include <string> struct A { int a, b, c; }; double f[3]; // zero-initialized to three 0.0's int* p; // zero-initialized to null pointer value // (even if the value is not integral 0) std::string s; // zero-initialized to indeterminate value, then // default-initialized to "" by the std::string default constructor int main(int argc, char*[]) { delete p; // safe to delete a null pointer static int n = argc; // zero-initialized to 0 then copy-initialized to argc std::cout << "n = " << n << '\n'; A a = A(); // the effect is same as: A a{}; or A a = {}; std::cout << "a = {" << a.a << ' ' << a.b << ' ' << a.c << "}\n"; }
可能的输出
n = 1 a = {0 0 0}
[编辑] 缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 已发布行为 | 正确行为 |
---|---|---|---|
CWG 277 | C++98 | 指针可能使用非常量 值 0 的表达式初始化,这不是空指针常量 |
必须使用整数初始化 值 0 的常量表达式 |
CWG 694 | C++98 | 类类型的零初始化忽略了填充 | 填充被初始化为零位 |
CWG 903 | C++98 | 标量类型的零初始化将初始值设置为值 从值为 0 的整数常量表达式转换而来 |
对象被初始化为值 从整数文字 0 转换而来 |
CWG 2026 | C++98 | 零初始化被指定为始终 首先发生,甚至在常量初始化之前 |
如果应用 常量初始化,则不进行零初始化 |
CWG 2196 | C++98 | 类类型的零初始化忽略了基类子对象 | 它们也被零初始化 |
CWG 2253 | C++98 | 尚不清楚零初始化是否 适用于未命名的位域 |
它适用(所有填充位 都初始化为零位) |