在构造函数初始化器中初始化成员数组

新手上路,请多包涵
class C
{
public:
 C() : arr({1,2,3}) //doesn't compile
{}
    /*
    C() : arr{1,2,3} //doesn't compile either
{}
    */
private:
 int arr[3];
};

我相信原因是数组只能使用 = 语法进行初始化,即:

 int arr[3] = {1,3,4};

问题

  1. 我该如何做我想做的事情(即在构造函数中 初始化 一个数组(而不是在主体中分配元素))。甚至可能吗?
  2. C++03 标准对在 ctor 初始化程序中初始化聚合(包括数组)有什么特别的说明吗?或者上述代码的无效是其他一些规则的必然结果?
  3. C++0x 初始化列表能解决问题吗?

PS 请不要提及向量,boost::arrays,以及它们对数组的优越性,我很清楚。

原文由 Armen Tsirunyan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 557
2 个回答
  1. 我该如何做我想做的事情(即在构造函数中初始化一个数组(而不是在主体中分配元素))。甚至可能吗?

是的。它使用包含数组的结构。你说你已经知道了,但是我不明白这个问题。这样,您 可以在构造函数中初始化一个数组,而无需在主体中进行赋值。这就是 boost::array 所做的。

C++03 标准对在 ctor 初始化程序中初始化聚合(包括数组)有什么特别的说明吗?或者上述代码的无效是其他一些规则的必然结果?

mem-initializer 使用直接初始化。第 8 条的规则禁止这种事情。我不太确定以下情况,但一些编译器确实允许这样做。

 struct A {
  char foo[6];
  A():foo("hello") { } /* valid? */
};

有关详细信息,请参阅 此 GCC PR

C++0x 初始化列表能解决问题吗?

是的,他们有。但是,我认为您的语法无效。您必须直接使用大括号来触发列表初始化

struct A {
  int foo[3];
  A():foo{1, 2, 3} { }
  A():foo({1, 2, 3}) { } /* invalid */
};

原文由 Johannes Schaub - litb 发布,翻译遵循 CC BY-SA 2.5 许可协议

这对我在 Windows 上使用 C++17 有效:

文件 A.h

 class A
{
  private:
    float arrayVar[3];
}

文件 A.cpp

 A::A() : arrayVar{ 0.0f, 0.0f, 0.0f } { }

原文由 Ed Graham 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题