在`:,`中稍后使用构造函数的`:,`部分中初始化的成员是否安全?

时间:2015-08-03 23:15:38

标签: c++ constructor

例如,在此处拨打Area()是否安全:

Polygon::Polygon( Coord x0, Coord y0, Coord x1, Coord y1 )
    : m_BoundingBox( x0, y0, x1, y1 ), m_Area( m_BoundingBox.Area() )
{
}

也就是说,可以假设构造函数的: ,部分中的成员是按照它们列出的顺序构造和初始化的吗?

2 个答案:

答案 0 :(得分:13)

这取决于类定义中成员m_BoundingBoxm_Area的顺序。

标准规定:

  

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

     

- 首先,仅用于构造函数   大多数派生类(1.8),虚拟基类都在初始化   命令它们出现在深度优先从左到右的遍历中   基类的有向非循环图,其中“从左到右”是   派生类中基类的出现顺序   基说明符列表。

     

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

     

- 然后,非静态   数据成员按照它们在声明中的顺序初始化   类定义(再次无论顺序如何   MEM-初始化)。

因此,成员不会按照它们在mem-initializer中出现的顺序进行初始化,而是按照类定义中的odrer进行初始化。

在这里你可以看到online example如果元素在类中的顺序或顺序错误会发生什么。

答案 1 :(得分:3)

不,它们按照class块中声明它们的顺序进行初始化。初始化列表中的顺序无效(这就是许多编译器在不匹配时发出警告的原因)。