2010-04-27 74 views
1

有沒有辦法讓編譯器創建默認構造函數,即使我提供了自己的顯式構造函數?如何讓編譯器在C++中創建默認的構造函數?

有時候我發現它們非常有用,並且發現它浪費時間來編寫例如複製構造函數,尤其適用於大型類。

+0

我不明白這個問題。這個普通的類class MyClass {public:int i;};'有一個默認的ctor,copy ctor和dtor。 – 2010-04-27 13:56:15

+2

@Binary Worrier:「即使我提供了我自己的顯式構造函數」。如果你給MyClass一個int構造函數,那麼它將不再有一個默認的無參數構造函數。 – 2010-04-27 14:10:22

+0

這是真的,我已經遠離C++了* far *太長了。道歉。 – 2010-04-27 14:30:50

回答

2

拷貝構造函數提供您是否定義任何其他構造函數或沒有。只要你不聲明一個拷貝構造函數,你就可以得到一個拷貝構造函數。

僅當您聲明無構造函數時才提供no-arg構造函數。所以你沒有問題,除非你想要一個無參數的構造函數,但是認爲寫一個是浪費時間。

IIRC,C++ 0x有一種將構造委託給另一個構造函數的方法。我不記得細節,但它可以讓你通過指定另一個構造函數,以及傳遞給它的參數來定義一個無參數構造函數。在某些情況下可能會節省輸入一些數據成員初始值設定項。但默認的無參數構造函數不會提供這些初始化方法。

3

你不能 - 當你提供自己的默認構造函數時,編譯器會關閉它的一些自動生成的默認構造函數,所以你可以防止默認構造某些類。不過,我認爲的C++ 0x將允許你明確地說出一個默認的編譯器實現,例如:

MyClass() = default; // 'delete' also allowed by upcoming standard to disable 

我不認爲任何編譯器支持這個還沒有 - 的C++ 0x(作爲下一個標準已經已知)還不是最終的,所以你現在只需要輸入你的默認構造函數。這不是很多代碼! MyClass() {}只要所有成員本身都是默認可構造的。

+0

你可以添加引用嗎? – qdii 2012-08-08 15:55:23

1

編譯器將始終生成默認拷貝構造函數,除非您提供自己的拷貝構造函數的定義。你的問題只是使用默認的無參數構造函數,如果存在任何構造函數定義,則不會生成該構造函數。但它不是很難提供無參數的構造函數的行爲完全像一個產生:

class yourClass 
{ 
    public: 
     yourClass(){} 
} 
+0

我想你想把'public:'放在構造函數上面,而不是像Java/C#風格的關鍵字。 – AshleysBrain 2010-04-27 14:17:38

+0

我更多的是指複製構造函數......如果你有很多屬性,那麼它就是更多的代碼。 – 2010-04-27 14:20:05

+0

@AshleyBrain @Itay Moav:謝謝。我現在在Java工作,所以我的習慣改變了:-) – 2010-04-27 14:44:41