从POD结构继承的类中的默认构造函数的奇怪行为

时间:2011-09-26 14:26:17

标签: c++ default-constructor pod

此问题与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
}

为什么会这样?编译器是否有义务调用默认构造函数或仅应用于类? (我认为不是这样 - 只有差异在于成员和继承的默认访问限定符)

1 个答案:

答案 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中描述的行为(其中值设置为不确定的初始值)生效。