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

Mar*_*ski 1 c++ arrays

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

如果我按照书中的说法初始化数组

int my_array[5] = {10}
Run Code Online (Sandbox Code Playgroud)

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

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

怎么了?我正在使用Ubuntu并使用g ++进行编译

Jar*_*der 9

您观察到的是正确的:根据标准,阵列的其余项目初始化为0.

  • @MarkoKacanski 该方法最适合值 0,因为编译器可以按任何顺序将所有值分配为 0,并且本质上是优化自身。在增量 for 循环中执行相同操作的效果要差得多,因为您要为所有元素指定迭代器、顺序和值。但是,这是(我知道的)初始化为非零值的唯一方法。(`std::fill_n` 内部工作原理相同) (2认同)
  • 马可,你的书说的是真的,尽管如果这就是关于此事的全部内容,那就是误导性的。第一个元素初始化为零的原因与其余元素初始化为零的原因不同。你的书应该提到这种区别,也许可以使用你在问题中引用的例子。我曾经和你一样假设过。 (2认同)

小智 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.


Tro*_*jan 5

当使用小于数组的列表进行初始化时,只会按预期初始化指定的元素; 其余的被初始化为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)