在线文档教程
C++
语言 | Language

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++标准。

DRApplied toBehavior as publishedCorrect behavior
CWG 2026C++14zero-init was specified to always occur first, even before constant-initno zero-init if constant init applies

另见

  • 默认初始化

  • 直接初始化

  • 值初始化

  • 复制初始化

  • 列表初始化

© cppreference.com

在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。

http://en.cppreference.com/w/cpp/language/0[医]初始化