4

以下内容有效吗?

class myClass
{
   private:
     ...
     int m_nDataLength;
     boost::shared_array<int> m_pData;
     ...

   public:
     myClass(): ..., m_nDataLength(10), m_pData(new int[m_nDataLength]), ...
     {
     }
}

我是否正确地假设初始化将完全按照我在 ctor 中给出的顺序发生?如果不是,如果 m_nDataLength 的初始化发生在 m_pData 之后怎么办?

4

3 回答 3

10

虽然您的示例中的初始化确实按照您想要的顺序发生,但这不是您假设的原因:初始化按照类定义中数据成员声明的顺序发生。原因是析构函数必须以反向顺序销毁成员,无论使用哪个构造函数创建对象。为此,必须使用一种独立于构造函数的方式来定义构造顺序。

这意味着,如果不是

class myClass
{
   private:
     ...
     int m_nDataLength;
     boost::shared_array<int> m_pData;

有人会将您的代码更改为

class myClass
{
   private:
     ...
     boost::shared_array<int> m_pData;
     int m_nDataLength;

那么代码会有一个错误。

我的建议是:

  • 编写您的构造函数,以便初始化顺序无关紧要。
  • 如果你不能这样做(注意:对我来说,这在过去十年中发生了不到 5 次),请在声明数据成员时完全清楚。

这样的事情应该做:

class myClass
{
   private:
     ...
     int m_nDataLength;                 // Note: Declaration order
     boost::shared_array<int> m_pData;  //       matters here!
于 2009-10-08T12:36:14.783 回答
9

初始化将按类中的顺序初始化字段,因此:如果您更改

private:
  ...
  int m_nDataLength;
  boost::shared_array<int> m_pData;

作为

private:
  ...
  boost::shared_array<int> m_pData;
  int m_nDataLength;

它不会工作。在构造函数中,顺序不适用。

于 2009-10-08T12:36:00.343 回答
5

不,类成员的初始化按照成员出现在类定义中的顺序进行。如果一个成员出现在初始化列表中,那么它控制用于初始化该成员的表达式(即使它使用尚未初始化的成员),但它出现在初始化列表中的位置不会影响它的初始化时间。

于 2009-10-08T12:36:01.677 回答