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是一个空的括号集到你的CPreviewFrame构造器值的初始化器列表中——BITMAP按照第 8.5/7 节初始化对象。根据第 8.5/5 节,这意味着 的所有非静态成员都BITMAP将被初始化为零,因为它们不是数组、联合或类类型。

但是,在您的初始示例中,您仅在构造函数的实际主体中初始化了结构的bmBits成员......由于没有为结构本身指定初始化器,因此其余数据成员的值是不确定的。由于类的每个非静态数据成员都是在调用构造函数的实际主体之前初始化的,因此缺少显式初始化器,它是类的非静态 POD 结构数据成员,意味着8.5/9 中描述的行为(其中值设置为不确定的初始值)生效。BITMAPCPreviewFrameBITMAPBITMAPBITMAPCPreviewFrame

于 2011-09-26T14:43:25.100 回答