C ++标准是否保证使用{} /()进行初始化将默认为“0”?

时间:2016-06-08 01:20:26

标签: c++ standards default

问题1:

struct S
{
   size_t size;
   int j;
   int k;
   int l;
};

S s={sizeof(S)};

Doest 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;
}

这里指向数组(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);

但是编辑失败了。如何将初始化值赋给指向数组的指针,所有元素具有相同的值?

2 个答案:

答案 0 :(得分:2)

  

问题1

是的,它由aggregate initialization保证 特别是:

  

如果初始化程序子句的数量 <成员数 [和base(自C ++ 17)] 或初始化程序列表完全为空,则剩余的成员 [和base(自C ++ 17)] 初始化 [通过默认初始值设定项,如果在类定义中提供,则以其他方式(自C ++ 14开始)] 通过空列表执行值初始化。如果引用类型的成员是其余成员之一,则程序格式错误(引用不能进行值初始化)。

  

问题2

使用std::vector

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

答案 1 :(得分:1)

问题1已经有了完美答案,我将回答问题2.

是的,你的观察是正确的。在()默认初始化元素转换为值初始化之后添加new。第一种形式对创建的对象没有任何作用(所以你观察随机数​​),但值初始化将初始化成员 - 在这种情况下,将元素设置为0.不幸的是,没有办法为动态int数组执行特定的初始化 - 您可以将它们保持未经初始化或对它们进行值初始化(为0)。

使用std::vector解决了这个问题。