簡體   English   中英

沒有構造函數的C ++類成員初始化

[英]c++ class member initialization without constructor

有人可以解釋一下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(); 
}

我的理解是:
int成員m_initMe在構造函數中已正確初始化,因此在內存中具有有效的地址和有效的值。
但是m_SetStringMember會發生什么?
它是否必須有一個有效的內存地址?
它必須具有有效的默認值嗎?
由默認構造函數std::set<std::string>()嗎?
還是我必須在構造函數中顯式設置m_SetStringMember = std::set<std::string>()

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

是的,但是地址與構造函數無關。 構造器僅在編譯器或堆分配器為對象指定了有效地址后,才對其進行初始化。

它必須具有有效的默認值嗎?

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

還是我必須在構造函數中顯式設置m_SetStringMember = std :: set()?

如果您想明確,請執行此操作

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

但是默認情況下會發生同樣的事情。

m_SetStringMemberstd::set類的對象,該類具有自己的構造函數。 它由其構造函數正確初始化。

John正確文章的又一個補遺:

這些變量初始化的順序就是聲明它們的順序,因此實際上,如果要明確,則應這樣做:

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

確保初始化列表中的順序與聲明它們的順序匹配是一種很好的做法,甚至可以讓編譯器警告您。 很多時候,變量最終會相互依賴,因此順序很重要。

此外,如果您未指定默認值,則將使用類默認構造函數(如果您不創建默認編譯器,並且假設它可用,則編譯器將為您生成一個),即- -旁注:在創建c ++類構造函數的通用策略中檢查3規則。 如果變量是POD(普通舊數據類型-int,float等),則它將默認為0。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM