2

この質問はこれに関連しています

前の質問で述べたように、拡張機能を提供するために、クラスを Win 構造 BITMAP から継承することにしました。

コンパイルされたプログラムの動作に関心の詳細があることに気付きました。まず、以下のようにクラスのデフォルト コンストラクターを定義しました。

CPreviewFrame::CPreviewFrame():
   m_bufferSize( 0 )
{
   bmBits = NULL; //ensure that compiler in debug won't init it with 0xccccc... and delete[] will do the job
}

アイデアでは、コンパイラは、初期化リストで手動で呼び出されなかった場合でも、基本型のデフォルト コンストラクターを呼び出すコードを生成する必要がありました。しかし、デバッグ中に BITMAP のデータ メンバーが初期化されていないことに気付きました。BITMAP の手動初期化を追加したところ、機能しました。すべてのデータ メンバーがゼロで初期化されました。

CPreviewFrame::CPreviewFrame():
   BITMAP( ),
   m_bufferSize( 0 )
{
   //bmBits = NULL; //it's not needed anymore probably
}

なぜそれが起こるのですか?コンパイラはデフォルトのコンストラクタを呼び出す義務がありますか、それともクラスにのみ適用されますか? (そうは思えません-違いは、メンバーと継承のデフォルトのアクセス修飾子だけです)

4

1 に答える 1

4

POD 構造体に明示的な初期化子を指定しない場合、オブジェクトは C++ 標準のセクション 8.5/9 に従って不確定な初期値を持ちます。BITMAPコンストラクターのイニシャライザー リストに括弧の空のセットであるイニシャライザーを追加すると、セクション 8.5/7 に従ってオブジェクトCPreviewFrameが値初期化されます。セクション 8.5/5 によると、配列、共用体、またはクラス型ではないため、BITMAPすべての非静的メンバーがゼロで初期化されることを意味します。BITMAP

ただし、最初の例では、コンストラクターの実際の本体で構造体のbmBitsメンバーのみを初期化しました...構造体自体に初期化子が指定されていないため、残りのデータメンバーは不確定な値のままになります。クラスの各非静的データ メンバーは、コンストラクターの実際の本体が呼び出される前に初期化されるため、クラスの非静的 POD 構造体データ メンバーである の明示的な初期化子がないことは、値が不確定な初期値に設定される 8.5/9 で説明されている動作が有効になります。BITMAPCPreviewFrameBITMAPBITMAPBITMAPCPreviewFrame

于 2011-09-26T14:43:25.100 に答える