构造函数初始化列表中使用的变量的顺序是否重要?

时间:2016-01-13 08:28:30

标签: c++ memory constructor initialization-list

考虑以下课程

class A 
{
int a;
double b;
float c;
A():a(1),c(2),b(3)
{}
}

我们是否必须按照我们在类中声明的顺序使用初始化列表中的变量?初始化列表中的变量顺序是否会对该类/变量的内存分配产生影响? (考虑一下场景,如果类有很多bool变量,很多双变量等等。)

3 个答案:

答案 0 :(得分:5)

  

我们是否必须按照我们在类中声明的顺序使用初始化列表中的变量?

初始化列表顺序对初始化顺序没有影响。因此,它避免了在初始化列表中使用实际顺序的误导行为。

存在依赖关系时出现问题:

class A 
{
  int a;
  double b;
  float c;
  // initialization is done in that order: a, b, c
  A():a(1), c(2), b(c + 1) // UB, b is in fact initialized before c
  {}
};
  

初始化列表中的变量顺序是否会对该类/变量的内存分配产生影响?

初始化顺序列表不会对布局或初始化顺序产生影响。

答案 1 :(得分:4)

首先,

  

我们是否必须按照我们在类中声明的顺序使用初始化列表中的变量?

不,但你最好这样做以避免混淆。因为列表中member initializers的顺序无关紧要。

  

列表中成员初始值设定项的顺序是无关紧要的:实际的   初始化顺序如下:

     

1)如果构造函数用于   最派生的类,虚拟基类在中初始化   它们出现在深度优先从左到右遍历的顺序   基类声明(从左到右指的是外观)   base-specifier lists)

     

2)然后,在中初始化直接基类   它们出现在这个类的基本说明符列表中的从左到右的顺序

     

3)然后,按照以下顺序初始化非静态数据成员   类定义中的声明。

     4)最后,身体的   构造函数被执行

第二,

  

初始化列表中的变量顺序是否会对该类/变量的内存分配产生影响?

不,因为它根本不重要。

答案 2 :(得分:2)

  

变量将按照类中的声明顺序进行初始化。

初始化列表中的变量顺序不会影响。

在我们的示例中,初始化变量的顺序如下:a, b, c

  

初始化列表中的变量顺序是否会产生任何影响   关于那个类/变量的内存分配?

不起作用。