首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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的静态和线程局部变量在进行任何其他初始化之前都是零初始化的。如果非类非局部变量的定义没有初始化器,那么默认初始化不会做任何事情,而先前的零初始化结果将不会被修改。

零初始化指针是其类型的空指针值,即使空指针的值不是整数零。

二次

代码语言:javascript
复制
#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
}

二次

产出:

二次

代码语言:javascript
复制
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

另见

  • 默认初始化
  • 直接初始化
  • 值初始化
  • 复制初始化
  • 列表初始化
代码语言:txt
复制
 ? cppreference.com

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

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com