如果我们写下这样的话:
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
仅第一个元素打印1
。为什么呢?
答案 0 :(得分:22)
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 但请注意这里使用()-braces。由于vector有一个std :: initializer_list的构造函数,调用vector {5,1}会产生一定的歧义,如果提供的话,总是优先使用{} -initializations的initializer_list构造函数来解决这个歧义。因此,使用{}将导致创建一个包含2个值为5和1的元素的向量,而不是值为1的5个元素。
答案 1 :(得分:0)
如果你能说出
之间的区别int a[5];
和
int a[5] = {0};
,后者是将本地数组初始化为 all zero 的常见做法,您也可以将相同的语法移植到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}