2013-05-02 155 views
2

有人可以解釋我如何在c + +中的內存分配和初始化工作?沒有構造函數的C++類成員初始化

File Test.h 
----------- 
class Test 
{ 
    public: 
     Test(); 

     void clearSet(); 

    private: 
     std::set<std::string> m_SetStringMember; 
     int m_initMe; 
} 

File Test.cpp 
------------- 

Test::Test():m_initMe(0) 
{} 

Test::clearSet() 
{ 
    m_SetStringMember.clear(); 
} 

什麼我不明白的是:
intm_initMe是正確初始化在構造函數中,因此在內存的有效ADRESS和有效值。
m_SetStringMember會發生什麼情況?
它是否必須在內存中有一個有效的地址?
它是否必須具有有效的默認值?
std::set<std::string>()的默認構造函數設置?
或者我必須在構造函數中明確設置m_SetStringMember = std::set<std::string>()

+0

它具有不確定的價值。同樣的事情適用於'm_SetStringMember',但它通過默認的構造函數調用,它會給它一個有效的狀態。 – 2013-05-02 09:15:25

回答

1

m_SetStringMember是具有它自己的構造函數的類std::set的對象。它的構造函數正確地初始化了它。

+0

因爲它被分配在堆棧上!如果你有一個指針,那將是垃圾。 – 2013-05-02 09:15:53

+4

@ bash.d:如果它是一個指針,它不會是類std :: set的對象。 – 2013-05-02 09:17:33

+1

對不起?如果我'std :: set * m_SetStringMember;'它必須使用'new'分配,否則它將包含垃圾。 ' – 2013-05-02 09:19:55

4

但是,m_SetStringMember會發生什麼? 它是否必須在內存中有一個有效的地址?

是的,但地址與構造函數無關。只有編譯器或堆分配器給出了有效地址後,構造器纔會初始化對象。

是否必須具有有效的默認值?

由STD()的默認構造函數:: set設置?

還是我必須要明確設置m_SetStringMember = 的std ::設置()在構造函數?

如果你想明確這樣做

Test::Test() : m_initMe(0), m_SetStringMember() {} 

,但同樣的事情會被默認OO發生。

+0

只需要注意,編譯器並不提供有效的地址。這是一個運行時間活動。 – 2013-05-02 09:25:56

0

一個更增編約翰的正確後:

在這些變量將初始化是在聲明它,所以實際上,如果你想成爲明確的,你應該這樣做的訂單的訂貨:

Test::Test() : m_SetStringMember(), m_initMe(0) {} 

確保初始化列表中的順序與您聲明它們的順序相匹配是一個很好的練習,甚至可以讓編譯器警告您。很多時候你的變量最終會依賴於彼此,因此順序很重要。另外,如果你沒有指定一個默認值,那麼將使用類的默認構造函數(如果你沒有創建它,那麼編譯器會爲你生成一個,並假設它是可用的,即沒有任何訪問限制) - 方面注意:請查看關於創建C++類構造函數的通用策略的3規則。如果變量是POD(普通舊數據類型 - 整數,浮點數等),那麼它將默認爲0.即使您不初始化具有內存的「m_initMe」(當您創建對象時),它也會默認爲0.

相關問題