C++笔记:数组初始化列出了一个很好的数组初始化列表。我有一个
int array[100] = {-1};
我预期它应该完全由-1组成,但实际上只有第一个值是-1,其余都是0和随机值混合。
代码:
int array[100] = {0};
这段代码完全正常,并将每个元素设置为0。
我错过了什么吗?如果值不为零,不能初始化吗?
其次,这种默认的初始化方式(如上所述)比通常需要遍历整个数组并赋值的方法更快,还是它们执行的是相同的操作?
C++笔记:数组初始化列出了一个很好的数组初始化列表。我有一个
int array[100] = {-1};
我预期它应该完全由-1组成,但实际上只有第一个值是-1,其余都是0和随机值混合。
代码:
int array[100] = {0};
这段代码完全正常,并将每个元素设置为0。
我错过了什么吗?如果值不为零,不能初始化吗?
其次,这种默认的初始化方式(如上所述)比通常需要遍历整个数组并赋值的方法更快,还是它们执行的是相同的操作?
valarray <int>seven7s=(7777777,7);
1) 当您使用初始化程序时,对于结构体或类似数组的未指定值实际上是默认构造的。对于像int这样的原始类型,这意味着它们将被清零。请注意,这递归地应用:您可以有一个包含数组的结构体数组,如果您仅指定第一个结构体的第一个字段,则所有其余字段都将使用零和默认构造函数进行初始化。
2) 编译器可能会生成至少与手动编写的初始化代码一样好的初始化代码。当可能时,我倾向于让编译器为我执行初始化。
{0}
对于结构体和数组都不是特殊情况。规则是没有初始化器的元素会被初始化为如果它们有一个初始化器,则为0
。如果有嵌套聚合体(例如struct x array[100]
),则初始化器按“行主”顺序应用于非聚合体;在这样做时,可以选择省略大括号。struct x array[100] = { 0 }
在 C 中是有效的;在 C++ 中也是有效的,只要struct X
的第一个成员接受0
作为初始化器即可。 - M.M{ 0 }
并不是特殊的,但是要定义一个不能用它进行初始化的数据类型却更加困难,因为没有构造函数,也就无法阻止0
被隐式转换并赋值给某些东西。 - Alex Celeste