Этот вопрос относится к этому .
Как я упоминал в предыдущем вопросе, я решил унаследовать свой класс от структуры 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
}
Почему это происходит? Разве компилятор не обязан вызывать конструктор по умолчанию или он применяется только к классам? (я так не думаю - единственная разница в квалификаторах доступа по умолчанию для членов и для наследования)