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

What is the purpose of "{}" in "new int[5]{};"?

如果我们这样写:

int *arr = new int[5];

在这种情况下,系统为 int 类型的 5 个元素和 returns 动态分配指向序列第一个元素的指针。space。

但是,当我看到下面的代码时:

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。为什么?

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 但是请注意这里使用 ()-大括号。由于 vector 有一个用于 std::initializer_list 的构造函数,调用 vector{ 5, 1} 会产生一定的歧义,这个问题通过始终优先使用 initializer_list 构造函数来进行 {} 初始化(如果提供)来解决。因此,使用 { } 会导致创建一个包含 2 个值为 5 和 1 的元素的向量,而不是 5 个值为 1 的元素。

如果你能区分

int a[5];

int a[5] = {0};

,后者是将局部数组初始化为全零的常见做法,您也可以将相同的语法移植到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}