“new int [5] {};”中“{}”的目的是什么?

时间:2017-10-13 06:41:16

标签: c++ c++11 initialization new-operator dynamic-memory-allocation

如果我们写下这样的话:

int *arr = new int[5];

在这种情况下,系统为5个int类型的元素动态分配空间,并返回指向序列第一个元素的指针。

但是,一旦我看到以下代码:

int *arr = new int[5]{};

那么,{}运算符之后的new是什么意思?这段代码中{}的目的是什么?

我用自己的值初始化了数组,如下所示:

#include <iostream>

int main()
{
    int* a = new int[5]{1};
    for(int i = 0; i < 5; i++)
        std::cout<< a[i]<<' ';

    delete[] a;
}

输出:

1 0 0 0 0

仅第一个元素打印1。为什么呢?

2 个答案:

答案 0 :(得分:22)

int *arr = new int[5];

执行default initialization(在这种情况下意味着arr的元素未初始化),而

int *arr = new int[5]{};

value initialization(在这种情况下意味着arr的元素零初始化)。请参阅链接中的相应规则。特别是对于后一种情况,该数组将被零初始化。

无论如何,如果没有其他正当理由,首选使用std :: vector。

编辑:关于你的第二个问题:这是由于初始化规则。你必须写

int* a = new int[5]{1, 1, 1, 1, 1 };

已经推荐的std :: vector支持你想要的语法:

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> a(5, 1);
    for(int i = 0; i < 5; i++)
        std::cout<< a[i]<<' ';
}

https://ideone.com/yhgyJg 但请注意这里使用()-braces。由于vector有一个std :: initializer_list的构造函数,调用vector {5,1}会产生一定的歧义,如果提供的话,总是优先使用{} -initializations的initializer_list构造函数来解决这个歧义。因此,使用{}将导致创建一个包含2个值为5和1的元素的向量,而不是值为1的5个元素。

答案 1 :(得分:0)

如果你能说出

之间的区别
int a[5];

int a[5] = {0};

,后者是将本地数组初始化为 all zero 的常见做法,您也可以将相同的语法移植到new

std::vector解决方案外,最简单(和常见)的非STL解决方案是迭代数组一次:

for (int i = 0; i < sizeof(a)/sizeof(int); i ++)
    a[i] = 1;

仅供参考,使用列表初始化会将所有未指定的数组元素设置为零,例如

int a[5] = {[1] = 3};
// Now a is {0, 3, 0, 0, 0}