zero initialization
零初始化
将对象的初始值设置为零。
句法
static T object ; | (1) | |
---|---|---|
T () ; T t = {} ; T {} ; | (2) | (since C++11) |
char array n = ""; | (3) | |
解释
在下列情况下执行零初始化:
1%29用于每个具有静态或线程本地的命名变量存储时间不受常数初始化%28自C++14%29以来,在任何其他初始化之前。
2%29值初始化的非类类型和值初始化类类型的成员的序列,这些类类型没有构造函数,包括集料不提供初始化器的。
3%29当字符数组为使用字符串文字初始化这太短了,数组的其余部分是零初始化的.
零初始化的影响是:
- 如果
T
是标量类型,对象%27s的初始值是积分常数零。显式转换到T
...
- 如果
T
是非并类类型,所有基类和非静态数据成员都是零初始化的,所有填充都初始化为零位。如果存在构造函数,则忽略。
- 如果
T
是一个联合类型,第一个非静态命名数据成员为零初始化,所有填充被初始化为零位。
- 如果
T
是数组类型,每个元素都是零初始化的。
- 如果
T
是引用类型,什么都不做。
注记
如上文所述非局部初始化自C++14%29以来,自C++14%29以来,%27T常量初始化%28的静态和线程局部变量在进行任何其他初始化之前都是零初始化的。如果非类非局部变量的定义没有初始化器,那么默认初始化不会做任何事情,而先前的零初始化结果将不会被修改。
零初始化指针是其类型的空指针值,即使空指针的值不是整数零。
例
二次
#include <string>
#include <iostream>
struct A {
int a,b,c;
};
double f[3]; // zero-initialized to three 0.0's
int* p; // zero-initialized to null pointer value
std::string s; // zero-initialized to indeterminate value
// then default-initialized to ""
int main(int argc, char* argv[])
{
A a = A(
std::cout << a.a << a.b << a.c << '\n';
static int n = argc; // zero-initialized to 0
// then copy-initialized to argc
delete p; // safe to delete a null pointer
}
二次
产出:
二次
000
二次
缺陷报告
以下行为更改缺陷报告追溯应用于先前发布的C++标准。
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
CWG 2026 | C++14 | zero-init was specified to always occur first, even before constant-init | no zero-init if constant init applies |
另见
- 默认初始化
- 直接初始化
- 值初始化
- 复制初始化
- 列表初始化
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。