我正在学习c ++,我遇到了以下奇怪的事情:
如果我按照书中的说法初始化数组
int my_array[5] = {10}
Run Code Online (Sandbox Code Playgroud)
每个数组字段仍然初始化为零,当它应该是十.
如果我在循环中初始化它,它按预期工作
怎么了?我正在使用Ubuntu并使用g ++进行编译
您观察到的是正确的:根据标准,阵列的其余项目初始化为0.
小智 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没有可访问的默认构造函数,则初始化是错误的);
...并且跳过一切int不是......
- 否则,对象被零初始化
对于类型变量,会发生什么int.
当使用小于数组的列表进行初始化时,只会按预期初始化指定的元素; 其余的被初始化为0.
要初始化所有值,使用循环,或者std::fill_n,如图所示这里.
std::fill_n(my_array, 5, 10); // array name, size, value
Run Code Online (Sandbox Code Playgroud)
在内部,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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3203 次 |
| 最近记录: |