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_pData の初期化の後に m_nDataLength の初期化が行われるとどうなりますか?

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;

その場合、コードにはバグがあります。

私のアドバイスは次のとおりです。

  • 初期化の順序が問題にならないようにコンストラクタを記述します。
  • これができない場合 (注: 過去 10 年間に発生したのは 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 に答える