"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}
如果我们这样写:
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}