零初始化

来自cppreference.com
< cpp‎ | language

设置对象的初始值为零

目录

[编辑] 语法

static T object ; (1)
T () ;

T t = {} ;
T {} ;

(2)

(C++11 起)
char array [ n ] = ""; (3)

[编辑] 解释

零初始化在下列情形进行:

1) 对于每个拥有静态或线程局域存储期的具名变量之不与常量初始化对立者 (C++14 起),在任何其他初始化前。
2) 作为非类类型值初始化序列和无默认构造函数的类类型成员的值初始化序列的一部分,包含未提供初始化器的聚合体元素的值初始化。
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++ 标准。

报告 适用于 已发布的行为 正确行为
CWG 2026 C++14 零初始化被指定为始终首先发生,即使先于常量初始化 若应用常量初始化则无零初始化

[编辑] 参阅