C++ 创建对象时如何初始化数组?

C++ 创建对象时如何初始化数组?,c++,arrays,C++,Arrays,我不知道如何在对象中使用数组变量。创建对象时如何初始化数组。作为对象的数据成员的数组 我希望使用初始化列表。数组成员变量只能默认初始化,不能提供显式初始化值 struct Foo { Foo() : bar() {} // Default-initialize bar, for int this means initialize with 0 int bar[10]; }; 如果还需要其他内容,则必须在构造函数体中赋值 struct Foo { Foo() : bar() {

我不知道如何在对象中使用数组变量。创建对象时如何初始化数组。作为对象的数据成员的数组


我希望使用初始化列表。

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

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];
};

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

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];
};

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

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

很快,这将成为标准。GCC现在支持它,我不确定其他编译器会做什么。

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

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

很快,这将成为标准。GCC现在支持它,我不确定其他编译器会做什么。

你是说作为对象数据成员的数组吗?或者你说的是对象数组?我说的是对象的数据成员数组。可能是@ildjarn的重复,但我的问题不限于非静态成员数组。我将尝试那里的解决方案。如果您将问题限制在对象创建上,那么您的问题仅限于非静态成员。您是说作为对象的数据成员的数组吗?或者你说的是对象数组?我说的是对象的数据成员数组。可能是@ildjarn的重复,但我的问题不限于非静态成员数组。我将尝试那里的解决方案。如果您将问题限制在对象创建上,那么您的问题仅限于非静态成员。太棒了,我不知道这是可行的,尽管它是超逻辑的(实际上与您初始化非类成员数组的方式相同)。再见,memset。遗憾的是,你不能以这种方式使用隐式数组长度,但它仍然很酷。@Damon:你也可以将它用于向量和其他标准库容器,在这种情况下,你实际上是在隐式调整它的大小。关于向量,我知道,数组工作std::initializer\u list样式对我来说是全新的。这是一个好消息,因为我使用了不少数组:-)我想它不会隐式调整数组大小的原因是因为空括号数组是它们自己的习惯用法(如[0]数组),而且从理论上讲,您可以有几个具有不同数量初始值设定项的构造函数,因此编译器可能会选择“正确的”大小不明确(当然,只选择使用的最大大小是正确的)。@Damon:你是说你使用的是
std::memset()
而不是
std::fill\n()
?是的,这很好,除了糟糕的语法和设置字节的明显事实之外,它非常完美。我的编译器(gcc)完全优化了memset初始化,而是在数据段中存储不同的常量。std::fill_n在语法上可能是“更干净的”,但归结为一系列movdqa指令。在非初始化情况下,它们归结为或多或少相同的代码。当然,用上面的初始化列表初始化一个数组是两个世界中最好的一个。真棒,我不知道这是可行的,尽管它是超逻辑的(实际上与初始化一个非类成员数组的方式相同)。再见,memset。遗憾的是,你不能以这种方式使用隐式数组长度,但它仍然很酷。@Damon:你也可以将它用于向量和其他标准库容器,在这种情况下,你实际上是在隐式调整它的大小。关于向量,我知道,数组工作std::initializer\u list样式对我来说是全新的。这是一个好消息,因为我使用了不少数组:-)我想它不会隐式调整数组大小的原因是因为空括号数组是它们自己的习惯用法(如[0]数组),而且从理论上讲,您可以有几个具有不同数量初始值设定项的构造函数,因此编译器可能会选择“正确的”大小不明确(当然,只选择使用的最大大小是正确的)。@Damon:你是说你使用的是
std::memset()
而不是
std::fill\n()
?是的,这很好,除了糟糕的语法和设置字节的明显事实之外,它非常完美。我的编译器(gcc)完全优化了memset初始化,而是在数据段中存储不同的常量。std::fill_n在语法上可能是“更干净的”,但归结为一系列movdqa指令。在非初始化情况下,它们归结为或多或少相同的代码。当然,用上面的初始化列表初始化数组是两全其美的选择。