【问题标题】:How do I initialize an array when an object is created?创建对象时如何初始化数组?
【发布时间】:2011-04-17 05:14:30
【问题描述】:

我不确定如何将数组变量与对象一起使用。创建对象时如何初始化数组。作为对象数据成员的数组。

我希望使用初始化列表。

【问题讨论】:

  • 您所说的数组是对象的数据成员吗?还是您在谈论对象数组?
  • 我说的是作为对象数据成员的数组。
  • @ildjarn 可能是,但我的问题不仅限于非静态成员数组。我将尝试现有的解决方案。
  • 如果您将问题限制为对象创建,您的问题仅限于非静态成员。

标签: c++ arrays


【解决方案1】:

如果你的编译器支持,你可以这样做:

struct Foo
{
     int n[5];
     Foo() :n{1,2,3,4,5} {}
};

很快,这将成为标准。 GCC 现在支持了,不知道其他编译器是怎么做的。

【讨论】:

  • 太棒了,不知道这行得通,尽管它非常合乎逻辑(实际上与初始化非类成员数组的方式相同)。再见 memset。可惜你不能那样使用隐式数组长度,但它仍然很酷。
  • @Damon:您也可以将它与向量和其他标准库容器一起使用,在这种情况下,您实际上是在隐式调整它的大小。
  • 关于我知道的向量,只是数组工作 std::initializer_list 风格对我来说是全新的。这是个好消息,因为我使用的数组不少:-)我猜它不会隐式调整数组大小的原因是因为空括号数组是它们自己的习惯用法(如 [0] 数组),而且还因为理论上你可以有几个具有不同数量的初始化器的构造函数,所以编译器可能会发现选择“正确”的大小不明确(当然只选择使用的最大大小是正确的)。
  • @Damon:你是在暗示你使用的是std::memset()而不是std::fill_n()
  • 是的,效果很好,除了糟糕的语法和它设置字节的明显事实之外,它非常完美。我的编译器 (gcc) 完全优化了 memset 初始化,而是在数据段中存储不同的常量。 std::fill_n 在语法上可能更“干净”,但归结为一系列 movdqa 指令。在非初始化情况下,它们归结为或多或少相同的代码。现在当然用上面的初始化列表初始化一个数组是两全其美的。
【解决方案2】:

数组成员变量只能默认初始化,不能提供显式初始化值。

struct Foo {
  Foo() : bar() {}  // Default-initialize bar, for int this means initialize with 0
  int bar[10];
};

如果你想要别的,你必须在构造函数体中赋值。

struct Foo {
  Foo() : bar() {
    bar[3] = 1;
  }  
  int bar[10];
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-01
    • 2020-04-21
    • 2016-03-11
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多