类内默认值初始化顺序

时间:2012-07-03 13:15:19

标签: c++ constructor c++11 initialization

类成员什么时候在c ++ 11中获取默认值?以下代码是否合法?

class C {
    void* buffer;
    uint16_t& crc = *reinterpret_cast <uint16_t*> (buffer);
public:
    explicit C (void* p) : buffer (p) {}
};

我希望,crc的默认值只是语法糖,所以crc在缓冲区之后被初始化。我是对的吗?

2 个答案:

答案 0 :(得分:3)

非静态数据成员的初始化顺序在12.6.2初始化基础和成员[class.base.init]的第10段中规定。 (强调我的):

  

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

     

[......关于基地的事情]

     

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

     

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

正如您所看到的,是否使用所谓的 mem-initializer (即在构造函数内部,在其正文之前)或大括号或等于初始化程序<来初始化成员< / em>(即在类定义中)或者根本没有任何内容与初始化顺序无关。

答案 1 :(得分:1)

订单在C ++11§12.6.2[class.base.init] / 10中指定。它仅取决于您声明数据成员的顺序。由于buffer出现在crc之前,所以很好。

  

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