2011-09-26 38 views
2

此問題與this one有關。從POD繼承的類中的默認構造函數的奇怪行爲結構

正如我在前面的問題中提到的,我決定從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的數據成員沒有初始化!我加手動初始化位圖和它的工作 - 所有數據成員被初始化零:

CPreviewFrame::CPreviewFrame(): 
    BITMAP(), 
    m_bufferSize(0) 
{ 
    //bmBits = NULL; //it's not needed anymore probably 
} 

它爲什麼會發生?編譯器是否有義務調用默認構造函數或僅將它應用於類? (它不能這樣我想 - 唯一的區別在於成員和繼承的默認訪問限定符)

回答

4

如果您沒有爲POD-struct提供顯式初始化程序,那麼該對象具有不確定的初始值C++標準的8.5/9節。將BITMAP的初始值設定項(BITMAP)作爲一組空括號添加到CPreviewFrame構造函數值的初始值設定項列表中 - 根據第8.5節/ 7節初始化BITMAP對象。根據8.5/5節,這將意味着BITMAP的所有非靜態成員將被初始化爲零,因爲它們不是數組,類型或聯合類型。

在你最初的例子中,雖然,你只初始化BITMAP結構的bmBits成員在CPreviewFrame構造......留下的BITMAP數據成員的其餘部分與是不確定的,因爲沒有初始化值的實際車被指定爲BITMAP結構本身。由於類的每個非靜態數據成員在調用構造函數的實體之前被初始化,因此BITMAP(它是CPreviewFrame類的非靜態POD-struct數據成員)缺少顯式初始化程序,這意味着8.5/9中描述的行爲的值將被設置爲不確定的初始值。