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

Jay*_*esh 14 c++ initialization new-operator dynamic-memory-allocation c++11

如果我们写下这样的话:

int *arr = new int[5];
Run Code Online (Sandbox Code Playgroud)

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

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

int *arr = new int[5]{};
Run Code Online (Sandbox Code Playgroud)

那么,运营商{}之后的意义new何在?{}这段代码的目的是什么?

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

#include <iostream>

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

    delete[] a;
}
Run Code Online (Sandbox Code Playgroud)

输出:

1 0 0 0 0
Run Code Online (Sandbox Code Playgroud)

只有第一个元素打印1.为什么?

Jod*_*cus 22

int *arr = new int[5];
Run Code Online (Sandbox Code Playgroud)

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

int *arr = new int[5]{};
Run Code Online (Sandbox Code Playgroud)

是一个值初始化(在这种情况下装置的元件arr初始化为零).请参阅链接中的相应规则.特别是对于后一种情况,阵列将被零初始化.

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

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

int* a = new int[5]{1, 1, 1, 1, 1 };
Run Code Online (Sandbox Code Playgroud)

已推荐的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]<<' ';
}
Run Code Online (Sandbox Code Playgroud)

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