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

问题描述:

如果我们写出类似:“new int [5] {};”中的“{}”的用途是什么?

int *arr = new int[5]; 

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

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

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

+8

我建议你花些时间阅读[this'new' reference](http://en.cppreference.com/w/cpp/language/new)。在描述语法的表格中,请注意* initializer *部分。然后向下滚动到关于[施工](http://en.cppreference.com/w/cpp/language/new#Construction)的部分以了解更多信息。 –

+1

此语法自C++ 11以来一直在使用。它允许使用大括号内指定的值初始化数组,或者在此情况下使用零来初始化数组。 –

+5

使用std :: vector! – 2017-10-13 07:02:15

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 ::矢量支持你想要的语法:

#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}会施加一定的歧义,通过始终优先考虑{} - 初始化的initializer_list构造函数(如果提供)来解决该问题。因此,使用{}会导致产生具有值5的2个元素和1,而不是值1

+0

我可以用我自己的值初始化一个数组吗? – Jayesh

+0

@Jayesh:是的。任何表达式,无论是简单的数字,命名常量,变量,数学表达式还是函数调用都可以在该列表中使用。 – MSalters

5层的元件的载体。如果你能告诉

int a[5]; 

int a[5] = {0}; 
之间的差

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

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

,使用列表初始化原因所有未指定的数组:

除了从std::vector溶液中,最简单的(共同)非STL溶液通过阵列迭代一次元素被设置为零,例如

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