数组在 c++ 中不使用大括号初始化
Array doesn't initialize with a curly braces in c++
我正在学习c++,遇到了以下奇怪的事情:
如果我像书中所说的那样初始化数组
int my_array[5] = {10}
每个数组字段仍然初始化为0,而它应该是10。
如果我在循环中初始化它,它将按预期工作
发生了什么?我使用Ubuntu并使用g++编译
您观察到的是正确的:根据标准,数组的其余项被初始化为0。
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没有可访问的默认构造函数,则初始化形式不正确);
。。。跳过所有int不是
--否则,对象被初始化为零
这就是int
类型的变量所发生的情况。
当使用小于数组的列表进行初始化时,只有指定的元素会按预期进行初始化;其余部分被初始化为0。
要初始化所有值,请使用循环或std::fill_n
,如下所示。
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
}
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 为什么在C++中首先初始化成员类
- 同时具有"聚合初始化"和"模板推导"
- 初始化具有非默认构造函数的std::数组项的更好方法
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 在C和C++中初始化结构中的数组
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 在函数内部的声明中初始化数组,并在外部使用它
- 继承:构造函数,初始化C++11中基类的类C数组成员