零初始化
来自cppreference.com
设置对象的初始值为零
目录 |
[编辑] 语法
static T object ;
|
(1) | ||||||||
T () ;
T t |
(2) | (C++11 起) | |||||||
char array [ n ] = "";
|
(3) | ||||||||
[编辑] 解释
零初始化在下列情形进行:
3) 当字符数组以较短的字符串字面量初始化时,数组剩余部分被零初始化。
零初始化的效果是:
- 若
T
是标量类型类型,则对象初值为显式转换到T
的整数零。
- 若
T
是非联合体类类型,则所有基类和非静态数据成员别零初始化,且所有填充位被初始化为零位。忽略构造函数,若它存在。
- 若
T
是联合体类型,则首个具名非静态数据成员被零初始化且所有填充位被初始化到零位。
- 若
T
是数组类型,则每个元素都被零初始化
- 若
T
是引用类型,则不做任何事。
[编辑] 注意
如非局部初始化中所描述,静态和线程局域变量之未被常量初始化者 (C++14 起)在任何其他初始化发生前零初始化。若非类类型非局部变量无初始化器,则默认初始化不做任何事,不修改先前零初始化的结果。
零初始化的指针是其类型的空指针值,即使空指针的值非整数零。
[编辑] 示例
运行此代码
#include <string> #include <iostream> struct A { int a,b,c; }; double f[3]; // 零初始化为三个 0.0 int* p; // 零初始化为空指针值 std::string s; // 零初始化为不确定值再默认初始化为 "" int main(int argc, char* argv[]) { A a = A(); std::cout << a.a << a.b << a.c << '\n'; static int n = argc; // 零初始化为 0 // 然后复制初始化为 argc delete p; // 删除空指针是安全的 }
输出:
000
[编辑] 缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
DR | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
CWG 2026 | C++14 | 零初始化被指定为始终首先发生,即使先于常量初始化 | 若应用常量初始化则无零初始化 |