c ++类成员初始化序列

时间:2016-11-16 13:19:18

标签: c++ class initialization private public

我知道在class中,成员按照列出的顺序进行初始化。这是否适用于将变量分组到publicprivate等?令我感到困惑的是,我无法弄清楚是否存在private成员之类的偏好按照public成员之前列出的顺序进行初始化,而不管私有变量在公共关系中列出的位置如何类声明(我知道对基类成员存在这样的偏见)

2 个答案:

答案 0 :(得分:3)

类初始化的规则在[class.base.init] / 11

中详细说明
  

在非委托构造函数中,初始化按以下顺序进行:

     
      
  • 首先,仅对于派生程度最高的类(1.8)的构造函数,虚拟基类按照它们出现在基本有向无环图的深度优先从左到右遍历的顺序进行初始化类,其中“从左到右”是派生类base-specifier-list中基类出现的顺序。

  •   
  • 然后,直接基类按声明顺序初始化,因为它们出现在base-specifier-list中(无论mem-initializers的顺序如何)。

  •   
  • 然后,非静态数据成员按照在类定义中声明的顺序进行初始化(再次与mem-initializers的顺序无关)。

    < / LI>   
     

8最后,执行构造函数体的复合语句。

     

[注意:声明顺序的目的是确保以初始化的相反顺序销毁基础和成员子对象。 - 后注]

强调我的

因此,当我们查看子弹3时,它明确指出该成员是按照定义中出现的顺序构建的。这意味着无论privatepublic或它们如何在类成员初始化列表中列出,它们都将按照它们的声明顺序构建。

答案 1 :(得分:1)

非静态数据成员按声明的顺序初始化。

通过编译以下代码,如果您启用了警告,则可以对此进行测试:

// Example program
#include <iostream>
#include <string>

class Test {

private:
    int a;

public:
    int b;

    Test() : a(0), b(0) {}

};

class TestPrivatePriority {

public:
    int b;

    TestPrivatePriority() : a(0), b(0) {}

private:
    int a;

};

class TestPublicPriority {

private:
    int a;

public:
    int b;

    TestPublicPriority() : b(0), a(0) {}

};

int main()
{
  Test t;
  TestPrivatePriority t1;
  TestPublicPriority t2;

  return 0;
}

这将产生以下不言自明的警告:

In constructor 'TestPrivatePriority::TestPrivatePriority()':
25:9: warning: 'TestPrivatePriority::a' will be initialized after [-Wreorder]
20:9: warning:   'int TestPrivatePriority::b' [-Wreorder]
22:5: warning:   when initialized here [-Wreorder]
 In constructor 'TestPublicPriority::TestPublicPriority()':
35:9: warning: 'TestPublicPriority::b' will be initialized after [-Wreorder]
32:9: warning:   'int TestPublicPriority::a' [-Wreorder]
37:5: warning:   when initialized here [-Wreorder]