我正在学习c ++而且我遇到了以下奇怪的事情:
如果我像本书那样初始化数组
int my_array[5] = {10}
每个数组字段仍然初始化为零,当它应该是十。
如果我在循环中初始化它,它按预期工作
发生了什么事?我使用Ubuntu并使用g ++进行编译
答案 0 :(得分:9)
您观察到的是正确的:根据标准,数组的其余项目被初始化为0.
答案 1 :(得分:6)
C ++ 03(假设你在Ubuntu系统上有一个旧版本的GCC)标准说:
8.5.1 / 7
如果列表中的初始值设定项少于成员 在汇总中,那么每个未明确初始化的成员都应该是 价值初始化(8.5)。
数组是聚合:
8.5.1 / 1
聚合是数组或类(第9节),没有用户声明 构造函数(12.1),没有私有或受保护的非静态数据成员 (第11条),没有基类(第10条),也没有虚函数 (10.3)。
关于什么值初始化意味着:
对T类型的对象进行值初始化意味着:
- 如果T是具有用户声明的构造函数(12.1)的类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的); < / p>
...并且跳过int不是......
- 否则,该对象零初始化
对于int
类型的变量,会发生什么。
答案 2 :(得分:5)
使用小于数组的列表进行初始化时,只会按预期初始化指定的元素;其余的被初始化为0。
要初始化所有值,请使用循环或std::fill_n
,如图here所示。
std::fill_n(my_array, 5, 10); // array name, size, value
在内部,std::fill_n
相当于一个循环。从第一个链接:
template <class OutputIterator, class Size, class T>
OutputIterator fill_n (OutputIterator first, Size n, const T& val)
{
while (n>0) {
*first = val;
++first; --n;
}
return first; // since C++11
}