在 "new int[5]{};" 中,"{}" 的作用是什么?

14

如果我们像这样写:

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

只有第一个元素被打印出来了,为什么?


8
我建议您花时间阅读这个新的参考文献,在描述语法的表格中,注意initializer部分。然后向下滚动到有关Construction的部分以了解更多信息。 - Some programmer dude
1
这个语法自C++11以来一直在使用。它允许使用花括号内指定的值或者在这种情况下使用零来初始化数组。 - dsp_user
5
请使用 std::vector! - user2672107
与 https://dev59.com/_3RB5IYBdhLWcg3wcm6d 相同,但使用 C++11 语法。 - juanchopanza
2个回答

22
int *arr = new int[5];

执行默认初始化(在本例中意思是arr的元素为未初始化的),而

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

这是一个值初始化(在这种情况下意味着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}会导致一定的歧义,如果提供了{}初始化器,则始终优先选择初始化列表构造函数进行解析。因此,使用{}将创建一个具有值为5和1的2个元素的向量,而不是5个元素的值为1。


我可以使用自己的值初始化一个数组吗? - Jayesh
是的。例如,对于单个数组值,请使用列表初始化:http://en.cppreference.com/w/cpp/language/list_initialization编辑:对于语言律师来说:这实际上是聚合初始化,因为数组是聚合体。 - Jodocus
@Jayesh:是的。该列表中允许包含任何表达式,无论是简单的数字、命名常量、变量、数学表达式还是函数调用。 - MSalters

0
如果您可以区分以下内容的差异:
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}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接