279

我有一个带有一些参数的构造函数。我曾假设它们是按列出的顺序构建的,但在一种情况下,它们似乎是反向构建的,导致中止。当我颠倒参数时,程序停止中止。这是我正在使用的语法示例。问题是,在这种情况下,a_ 需要在 b_ 之前初始化。能保证施工顺序吗?

例如

class A
{
  public:
    A(OtherClass o, string x, int y) :
      a_(o), b_(a_, x, y) { }

    OtherClass a_;
    AnotherClass b_;
};
4

3 回答 3

311

这取决于类中成员变量声明的顺序。在您的示例中,第一个也是如此a_,然后b_是第二个。

于 2009-08-07T04:04:02.840 回答
213

引用标准,以澄清:

12.6.2.5

初始化应按以下顺序进行:

...

  • 然后,非静态数据成员应按照它们在类定义中声明的顺序进行初始化(同样不管 mem-initializers 的顺序)。

...

于 2009-08-07T04:09:02.250 回答
26

对此的标准参考现在似乎是 12.6.2 第 13.3 节:

(13.3) — 然后,非静态数据成员按照它们在类定义中声明的顺序进行初始化(同样不管 mem-initializers 的顺序)。

于 2016-08-17T06:59:31.690 回答