[英]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_SetStringMember
是std::set
類的對象,該類具有自己的構造函數。 它由其構造函數正確初始化。
John正確文章的又一個補遺:
這些變量初始化的順序就是聲明它們的順序,因此實際上,如果要明確,則應這樣做:
Test::Test() : m_SetStringMember(), m_initMe(0) {}
確保初始化列表中的順序與聲明它們的順序匹配是一種很好的做法,甚至可以讓編譯器警告您。 很多時候,變量最終會相互依賴,因此順序很重要。
此外,如果您未指定默認值,則將使用類默認構造函數(如果您不創建默認編譯器,並且假設它可用,則編譯器將為您生成一個),即- -旁注:在創建c ++類構造函數的通用策略中檢查3規則。 如果變量是POD(普通舊數據類型-int,float等),則它將默認為0。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.