数组在 c++ 中不使用大括号初始化

Array doesn't initialize with a curly braces in c++

本文关键字:初始化 c++ 数组      更新时间:2023-10-16

我正在学习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
}