2012-02-17 141 views
0

這是什麼?我有一個模糊的理解,即一個合成構造函數是由編譯器隱式創建的構造函數,它也初始化其成員類對象,但可能滿足或不滿足程序實現的需要。這個定義是否正確?什麼是合成構造函數?

在什麼情況下它會被合成,而不是什麼情況?

+0

的可能重複[何時編譯器一類的特殊成員提供的定義?](http://stackoverflow.com/questions/8621052/when-does-the-compiler-提供定義的特殊成員的一類) – Xeo 2012-02-17 04:12:42

+0

http://stackoverflow.com/q/1810163/14065 – 2012-02-17 04:47:23

回答

0

以下文章比我所能回答的問題更好。我引用了這篇文章中的一段短文,讓你瞭解它的味道。鏈接出現在報價下方。

順便提及,「C++參考指南」,從我引用的權利要求書中有529頁有營養的C++中它的信息;您可能需要爲其添加書籤。

構造函數初始化的對象。默認的構造函數是可以在沒有任何參數的情況下調用 。如果某個類沒有用戶聲明的構造函數,並且該類不包含const或 引用數據成員,則C++隱式地爲其聲明一個默認構造函數 。

這樣的隱式聲明默認構造函數執行創建這種類型的對象所需的 初始化操作。 但是,請注意,這些操作不涉及初始化用戶聲明的數據成員 。

例如:++合成爲C類構造函數,因爲它包含一個虛擬 成員函數

class C 
{ 
    private: 
     int n; 
     char *p; 
    public: 
     virtual ~C() {} 
}; 

void f() 
{ 
    C obj; // 1 implicitly-defined constructor is invoked 
} 

℃。在構建時,C++初始化一個隱藏的 數據成員,稱爲虛擬指針,每個多態類別爲 。該指針保存調度表的地址,其中包含該類的所有虛擬成員函數的地址。

合成構造函數不會初始化數據成員n和p,也不會爲後者指向的數據分配內存。 這些數據成員有一個不確定的值,一旦obj被構建,即 。這是因爲合成的默認構造函數 只執行 實現(而不是程序員)構建對象所需的初始化操作。

http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=15

+3

不知我是否應該標記爲「低質量」只發布鏈接並從它引用...:P – Xeo 2012-02-17 04:19:26

+1

我本可以發佈一個鏈接,但你知道它的工作效果如何。這篇文章的作者說它比我更好,文章完全回答了OP的問題。 – 2012-02-17 04:20:35

+0

@CodyGray:[什麼是社區Wiki?](http://blog.stackoverflow.com/2011/08/the-future-of-community-wiki/)我可以想到的唯一理由來做出這樣的答案CW將使社區合作成爲可能,我認爲這不是必要的。 – 2012-02-17 04:44:24

相關問題