2012-08-16 97 views
7

說我有這個類:爲成員變量自動調用默認構造函數嗎?

//Awesome.h 
class Awesome 
{ 
    public: 
     Awesome(); 
    private: 
     membertype member; 
} 

//Awesome.cpp 
#include "Awesome.h" 

Awesome::Awesome() 
:member() 
{ 
} 

如果我省略的Awesome構造函數初始化列表中的member(),將在member構造函數中自動調用?並且只有當我在初始化列表中不包含member時纔會調用它?

+0

可能重複的[C++類成員的默認值](http://stackoverflow.com/questions/2614809/what-is-the-default-value-for-c-class-members ) – FailedDev 2012-08-16 18:23:40

+0

取決於'membertype',但通常是。 – AJG85 2012-08-16 18:33:17

回答

7

從§8.5

如果對象沒有指定初始化,對象是 缺省初始化;如果未執行初始化,則具有自動或動態存儲持續時間的對象具有不確定的值。 [注: 具有靜態或線程存儲時間的對象是零初始化的, 見3.6.2。末端音符]

更新以備將來參考:進一步缺省初始化定義的含義

爲默認初始化類型T的對象是指:
- 如果T是一個如果T沒有 可訪問的默認構造函數,則調用T的默認構造函數 (並且初始化不合格);
- 如果T是一個數組類型,則每個 元素都被默認初始化;
- 否則,不會執行初始化 。
如果一個程序要求默認初始化 一個const限定類型T的對象,T應該是一個具有用戶提供的默認構造函數的類類型。

此外它從值變化初始化參照此: -

要值初始化類型T的對象是指:
- 如果T是 (可能CV修飾)類型(第9章)與用戶提供的 構造函數(12。1),那麼T的默認構造函數被調用(並且 ,如果T沒有可訪問的默認構造函數 ,則初始化不合格);
- 如果T是沒有用戶提供的構造函數的(可能是cv合格的)非聯合類 類型,則該對象是 零初始化,並且如果T隱含聲明的默認構造函數 不重要,則該構造函數叫做。
- 如果T是一個數組 類型,則每個元素都進行了值初始化;
- 否則, 對象將被初始化爲零。

13

是的。當初始化列表中沒有給出變量時,它是默認自動構建的。

默認敷設渠道裝置,即如果membertypeclassstruct,那麼這將是默認池莉構建,如果它是一個內置的陣列,則每個元素將被默認構造和如果它是一個內部類型,那麼將不會執行初始化(除非Awesome對象具有靜態或線程本地存儲持續時間)。最後一種情況意味着,如果Awesome對象在堆棧上創建或在堆上分配,則該成員變量可以(並且通常會)包含不可預知的垃圾。