C++标准是否保证默认情况下使用 {}/() 进行初始化会给出"0"?
Does C++ standard guarantee that,using {}/() for initialization will give "0" by default?
>问题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
可以解决此问题。
相关文章:
- 列表初始化是否将原子初始化为零
- 使用函数声明进行函数指针初始化 - 是否可能
- 值初始化是否适用于原子对象?
- 聚合的值初始化是否使用其成员的默认初始值设定项?
- C 11联合会的空列表初始化 - 是否保证可以初始化工会的全长
- 找出静态初始化是否结束
- 非本地非内联变量的初始化:是否严格在"main()"函数调用之前进行
- 空字符数组的初始化是否有效
- 变量零初始化-是否有未定义的行为
- 0-原子的初始化是否保证将值成员设置为0
- POD 类对象初始化是否需要构造函数
- 在C++中使用类似 c 的初始化或构造函数初始化是否被认为更好
- 类内成员初始化是否删除赋值运算符
- C++11;非静态数据成员初始化是否可以访问其他数据成员
- 列表初始化是否为隐式转换
- 复制列表初始化是否在概念上调用复制 ctor
- 如何测试/验证零初始化是否发生
- C++默认初始化是否保留先前的零初始化
- 使用新结构体进行聚合初始化是否有效
- 检测CRT初始化是否在注入过程中完成