例如,Area()在这里打电话是否安全:
Polygon::Polygon( Coord x0, Coord y0, Coord x1, Coord y1 )
: m_BoundingBox( x0, y0, x1, y1 ), m_Area( m_BoundingBox.Area() )
{
}
Run Code Online (Sandbox Code Playgroud)
也就是说,可以假设: ,构造函数部分中的成员按照列出的顺序构造和初始化吗?
Chr*_*phe 13
它取决于成员的顺序m_BoundingBox和 m_Area类定义.
标准规定:
12.6.2/10在非委托构造函数中,初始化按以下顺序进行:
- 首先,仅对于派生程度最高的类(1.8)的构造函数,虚拟基类按照它们出现在基类的有向无环图的深度优先从左到右遍历的顺序进行初始化,其中"左" -to-right"是派生类base-specifier-list中基类出现的顺序.
- 然后,直接基类按声明顺序初始化,因为它们出现在base-specifier-list中(无论mem-initializers的顺序如何).
- 然后,非静态数据成员按照它们在类定义中声明的顺序进行初始化(同样不管mem-initializers的顺序如何).
因此,成员不会按照它们在mem-initializer中出现的顺序进行初始化,而是按照类定义中的odrer进行初始化.
在这里,您可以看到一个在线示例,说明如果元素在类中的顺序或顺序错误,会发生什么.