问题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);
但是编辑失败了。如何将初始化值赋给指向数组的指针,所有元素具有相同的值?
答案 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
解决了这个问题。