Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 构造函数初始化列表求值顺序_C++_Gcc_C++ Faq - Fatal编程技术网

C++ 构造函数初始化列表求值顺序

C++ 构造函数初始化列表求值顺序,c++,gcc,c++-faq,C++,Gcc,C++ Faq,我有一个接受一些参数的构造函数。我假设它们是按照列出的顺序构造的,但在一个案例中,它们似乎是按照相反的顺序构造的,从而导致中止。当我反转参数时,程序停止中止。这是我正在使用的语法的一个例子。问题是,在这种情况下,a需要在b之前初始化。你能保证施工秩序吗 e、 g 它取决于类中成员变量声明的顺序。因此,在您的示例中,a将是第一个,然后,b将是第二个。引用标准,以澄清: 12.6.2.5 初始化应按以下顺序进行: … 然后,应按照类定义中声明的顺序初始化非静态数据成员 (同样,无论mem初始值设定

我有一个接受一些参数的构造函数。我假设它们是按照列出的顺序构造的,但在一个案例中,它们似乎是按照相反的顺序构造的,从而导致中止。当我反转参数时,程序停止中止。这是我正在使用的语法的一个例子。问题是,在这种情况下,a需要在b之前初始化。你能保证施工秩序吗

e、 g


它取决于类中成员变量声明的顺序。因此,在您的示例中,
a
将是第一个,然后,
b
将是第二个。

引用标准,以澄清:

12.6.2.5

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

  • 然后,应按照类定义中声明的顺序初始化非静态数据成员 (同样,无论mem初始值设定者的顺序如何)

目前,第12.6.2节第13.3节:

(13.3)-然后,按照类定义中声明的顺序初始化非静态数据成员 (同样,无论mem初始值设定者的顺序如何)


事实上,如果声明中的顺序与构造函数初始化器列表中的顺序不同,那么好的编译器会发出警告。例如,请参见gcc中的
-Wreorder
。它们是按照成员声明顺序构造的,而不是按照构造函数中的顺序构造的,原因是一个构造函数可能有多个构造函数,但只有一个析构函数。析构函数按结构的顺序销毁成员。我们的意思是…声明的相反顺序吗。不是“构造”,析构函数不可能看到构造函数来了解它,可以吗?你说你在询问构造函数参数,但它们在你到达构造函数之前就被计算了,并且它们是按照未指定的编译器确定的顺序进行计算的。但是你真的在问初始化列表的顺序,所以我为你更改了问题标题。我在一次采访中被问到这个问题:)采访者可能从这里得到了这个问题:)
class A
{
  public:
    A(OtherClass o, string x, int y) :
      a_(o), b_(a_, x, y) { }

    OtherClass a_;
    AnotherClass b_;
};