数组不会在c ++中使用花括号进行初始化

时间:2013-12-13 21:17:24

标签: c++ arrays

我正在学习c ++而且我遇到了以下奇怪的事情:

如果我像本书那样初始化数组

int my_array[5] = {10}

每个数组字段仍然初始化为零,当它应该是十。

如果我在循环中初始化它,它按预期工作

发生了什么事?我使用Ubuntu并使用g ++进行编译

3 个答案:

答案 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
}