2016-08-27 93 views
3

甲隱含默認構造具有空體和一個空初始化列表(原始類型未定義,默認構造函數被調用用戶定義的類型)。C++隱式默認構造函數的要點是什麼?

post

MyClass *c = new MyClass(); 

確實做了件明智的值初始化,但這樣做

MyClass c; 

時是什麼調用默認的構造函數的意義呢?

調用隱式默認構造函數以確保調用用戶定義類型(可能有不平凡的默認構造函數)的默認構造函數嗎?


更新

似乎編譯器生成的隱式默認構造函數被調用後,該對象可能無法始終如一地實例化,即原始類型未定義,和用戶定義的類型可能(或可能不)取決於程序員是否提供了默認的構造函數。

那麼爲什麼編譯器生成,當所謂的可能實例化一個對象處於未知狀態,一個隱含的默認構造函數?

+0

代碼在編譯時創建。 C++是一種非常靜態的語言。 –

+0

您知道第一個版本會在您停止使用該變量後創建內存泄漏,除非您使用'delete c;'? –

+1

您的示例演示了堆分配與堆棧分配,並且與構造函數的默認或隱含無關。我認爲你不明白默認的構造函數是什麼,隱含的默認構造函數是什麼意思。你首先需要弄清楚。請參閱:[cppreference - 默認構造函數](http://en.cppreference.com/w/cpp/language/default_constructor)只是爲了確保我們在相同的波長 – Drop

回答

5

隱含的默認構造函數的點是相同的點作爲任何其他構造。

東西需要構建一個給定類的每個實例。班級實例本身不會顯得空虛。某處某處有構建物體的工作。

如果未聲明顯式構造函數,則隱式默認構造函數會自動定義,該缺省構造類的超類和任何類成員。

這裏,如果類成員是沒有顯式構造函數的基本類型,那麼「default-constructs」也包含「do nothing」選項。所以,最終,隱含的默認構造函數可能最終無能爲力。但是它仍然被定義,如果沒有指定顯式構造函數(當然,如果隱式默認構造函數沒有被顯式刪除)。

4

無論你這樣做:

MyClass c; 

或本:

MyClass *c = new MyClass(); 

要調用默認的構造函數。

你說得對,隱含的默認構造函數會保留原始類型,如intdouble未初始化。但它確實初始化任何其他成員變量,如字符串,通過調用其默認構造函數(隱性或顯性)。

+1

如果'MyClass'沒有用戶定義的構造函數,那麼'MyClass * c = new MyClass();'將初始化該對象,原始成員將被初始化爲零。 –

0

我在維基百科閱讀Virtual Method Table

因此,編譯器也必須產生在 構造每個類的初始化一個新對象vpointer其類的虛函數表的 地址「隱藏」的代碼。

也許這就是擁有默認隱式構造函數的原因之一 - 當存在具有虛擬方法的類層次結構時,每個實例都需要正確設置vpointer。

相關問題