C++中构造函数的初始化顺序

3 c++ memory constructor initialization

通过使用以下类在C++中实例化对象,我会得到分段错误或中止,具体取决于声明成员变量的顺序.E. g.在mAnotherCountVar之后输入mMemberVar和mAnotherMemberVar会导致段错误.从这个列表中我从成员变量中删除了一个std :: ofstream,这导致了与其位置无关的分段错误.

我认为订单不是直接问题,但您认为原因是什么?这个类是一个巨大的项目的一部分,但是这个类中的这个地方是第一次出现错误的地方.

class COneClass : public IInterface
{
public:

  COneClass();

  virtual ~COneClass();

  static const unsigned int sStaticVar;
  static const unsigned int sAnotherStaticVar;


private:
  COneClass();
  COneClass(const COneClass& );
  COneClass& operator=(const COneClass& );

  int mMemberVar;
  int mAnotherMemberVar;
  bool mIsActive;
  bool mBoolMemberVar;
  bool mAnotherBoolMemberVar;
  unsigned int mCountVar;
  unsigned int mAnotherCountVar;
};

COneClass::COneClass() :
  mMemberVar(0),
  mAnotherMemberVar(0),
  mIsActive(false), 
  mBoolMemberVar(false),
  mAnotherBoolMemberVar(false),
  mCountVar(sStaticVar),
  mAnotherCountVar(sAnotherStaticVar)
{
}
Run Code Online (Sandbox Code Playgroud)

t.g*_*.g. 5

类成员由声明它们的顺序初始化.init列表中的顺序无关紧要.在你的情况下,它是这个顺序:mMemberVar - > mAnotherMemberVar - > mIsActive - > mBoolMemberVar - > mAnotherBoolMemberVar - > mCountVar - > mAnotherCountVar;

  • 扩展SSS所说的 - 原因很简单,虽然可能不直观:当对象被破坏时,必须以相反的构造顺序调用任何成员对象的析构函数.因为您可以使用具有不同初始化列表的2个或更多构造函数,所以不能使用初始化列表来定义构造顺序,因此使用唯一的固定顺序 - 即类定义中的声明顺序.(参见Scott Meyer,Effective C++,第13项.) (3认同)

Nei*_*son 5

也许这是"静态初始化顺序惨败"的情况,http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.16,是因为使用静态成员初始化mCountVar和mAnotherCountVar?

您可以在列表中初始化为零,然后在构造函数的主体中进行赋值.