此问题与this one有关。
正如我在上一个问题中提到的,我决定从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
}
在想法编译器必须生成调用基本类型的默认构造函数的代码,即使它没有在init列表中手动调用。但是在调试时我注意到BITMAP的数据成员没有初始化!我为BITMAP添加了手动初始化并且它有效 - 所有数据成员都由零初始化:
CPreviewFrame::CPreviewFrame():
BITMAP( ),
m_bufferSize( 0 )
{
//bmBits = NULL; //it's not needed anymore probably
}
为什么会这样?编译器是否有义务调用默认构造函数或仅应用于类? (我认为不是这样 - 只有差异在于成员和继承的默认访问限定符)
答案 0 :(得分:4)
如果没有为POD结构提供显式初始值设定项,则该对象根据C ++标准的第8.5 / 9节具有不确定的初始值。将BITMAP
的初始化程序(一组空括号)添加到CPreviewFrame
构造函数值的初始化程序列表中 - 按照第8.5 / 7节初始化BITMAP
对象。根据第8.5 / 5节,这将意味着BITMAP
的所有非静态成员将被零初始化,因为它们不是数组,联合或类类型。
在您的初始示例中,您只初始化了bmBits
构造函数的实际主体中BITMAP
结构的CPreviewFrame
成员...其余的数据 - BITMAP
的成员,其值不确定,因为没有为BITMAP
结构本身指定初始值设定项。由于在调用构造函数的实际主体之前初始化了类的每个非静态数据成员,因此缺少BITMAP
的显式初始化程序,它是您的非静态POD结构数据成员CPreviewFrame
类,表示8.5 / 9中描述的行为(其中值设置为不确定的初始值)生效。