例如,在此处拨打Area()
是否安全:
Polygon::Polygon( Coord x0, Coord y0, Coord x1, Coord y1 )
: m_BoundingBox( x0, y0, x1, y1 ), m_Area( m_BoundingBox.Area() )
{
}
也就是说,可以假设构造函数的: ,
部分中的成员是按照它们列出的顺序构造和初始化的吗?
答案 0 :(得分:13)
这取决于类定义中成员m_BoundingBox
和m_Area
的顺序。
标准规定:
12.6.2 / 10 在非委托构造函数中,初始化按以下顺序进行:
- 首先,仅用于构造函数 大多数派生类(1.8),虚拟基类都在初始化 命令它们出现在深度优先从左到右的遍历中 基类的有向非循环图,其中“从左到右”是 派生类中基类的出现顺序 基说明符列表。
- 然后,在中初始化直接基类 声明顺序,因为它们出现在base-specifier-list中 (无论mem-initializers的顺序如何)。
- 然后,非静态 数据成员按照它们在声明中的顺序初始化 类定义(再次无论顺序如何 MEM-初始化)。
因此,成员不会按照它们在mem-initializer中出现的顺序进行初始化,而是按照类定义中的odrer进行初始化。
在这里你可以看到online example如果元素在类中的顺序或顺序错误会发生什么。
答案 1 :(得分:3)
不,它们按照class
块中声明它们的顺序进行初始化。初始化列表中的顺序无效(这就是许多编译器在不匹配时发出警告的原因)。