この質問はこれに関連しています。
前の質問で述べたように、拡張機能を提供するために、クラスを 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
}
なぜそれが起こるのですか?コンパイラはデフォルトのコンストラクタを呼び出す義務がありますか、それともクラスにのみ適用されますか? (そうは思えません-違いは、メンバーと継承のデフォルトのアクセス修飾子だけです)