C++标准是否保证默认情况下使用 {}/() 进行初始化会给出"0"?

Does C++ standard guarantee that,using {}/() for initialization will give "0" by default?

本文关键字:初始化 是否 标准 默认 情况下 C++      更新时间:2023-10-16

>问题1:

struct S
{
   size_t size;
   int j;
   int k;
   int l;
};
S s={sizeof(S)};

C++标准说,上面的{}会将"j,k,l"初始化为0吗?似乎可以,它是 cpp 标准的一部分吗?

问题2:

int main()
{
    int* pi=new int[5];
    for(int i=0;i<5;++i)
        cout<<pi[i]<<',';
    return 0;
}

这里指向 array(pi) 的指针中的元素没有初始化,我的运行结果可能看起来像

6785200,6782912,0,0,0,

但是如果我将其更改为

int main()
{
    int* pi=new int[5]();//use ()
    for(int i=0;i<5;++i)
        cout<<pi[i]<<',';
    return 0;
}

然后,所有 pi 元素都是"0"。似乎"()"会给元素一个"0"值。这是 cpp 标准的一部分吗?

我还尝试使用"()"给出另一个值,如下所示:

int* pi=new int[5](7);

但它无法编译。如何将初始化值分配给指向所有元素具有相同值的数组的指针?

问题1

是的,它通过聚合初始化来保证特别:

如果初始值设定项子句的数量小于成员数 [和基数(自 C++17 起)]或初始值设定项列表完全为空,则其余成员 [和基数(自 C++17 起)] 由空列表初始化 [通过其默认初始值设定项,如果在类定义中提供,否则(自 C++14 起)] 由空列表初始化,这将执行值初始化.如果引用类型的成员是这些剩余成员之一,则程序格式不正确(引用不能进行值初始化)。

.

问题2

使用std::vector

std::vector<int> pi(5, 7);

问题 1 已经有一个完美的答案,我将回答问题 2。

是的,你的观察是正确的。在new后添加()会将元素的默认初始化转换为值初始化。第一个表单对创建的对象不执行任何操作(因此您观察到随机数),但值初始化将初始化成员 - 在本例中,会将元素设置为 0。不幸的是,没有办法对动态 int 数组执行特定的初始化 - 您可以让它们保持非初始化或值初始化它们(为 0)。

使用std::vector可以解决此问题。