“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
。为什么?
答
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
答
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}
我建议你花些时间阅读[this'new' reference](http://en.cppreference.com/w/cpp/language/new)。在描述语法的表格中,请注意* initializer *部分。然后向下滚动到关于[施工](http://en.cppreference.com/w/cpp/language/new#Construction)的部分以了解更多信息。 –
此语法自C++ 11以来一直在使用。它允许使用大括号内指定的值初始化数组,或者在此情况下使用零来初始化数组。 –
使用std :: vector! – 2017-10-13 07:02:15