【问题标题】:What is the purpose of "{}" in "new int[5]{};"?“new int[5]{};”中“{}”的用途是什么?
【发布时间】:2018-03-25 05:39:45
【问题描述】:

如果我们这样写:

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

【问题讨论】:

  • 我建议您花时间阅读this new reference。在描述语法的表中,请注意 initializer 部分。然后向下滚动到关于Construction 的部分以了解更多信息。
  • 该语法从 c++ 11 开始使用。它允许使用花括号内指定的值或在本例中使用零来初始化数组。
  • 使用 std::vector!
  • stackoverflow.com/questions/620137/… 相同,但使用 C++11 语法。

标签: c++ c++11 initialization new-operator dynamic-memory-allocation


【解决方案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 的元素。

【讨论】:

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

如果你能分辨出两者之间的区别

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}

【讨论】:

    猜你喜欢
    • 2019-08-14
    • 2010-09-26
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 2011-09-07
    • 2021-02-08
    • 2016-01-24
    相关资源
    最近更新 更多