有四個基本上隱式聲明的特殊函數。隱式聲明的特殊成員函數
- 默認的構造
- 默認析構函數
- 默認賦值運算符
- 默認成員明智的副本操作
問:
如果他們中的任何一個用戶自定義, [例如:析構函數]三個函數的其餘部分將不會被聲明。這是正確的嗎? 或 它只適用於默認的構造函數,並複製構造函數?
有四個基本上隱式聲明的特殊函數。隱式聲明的特殊成員函數
問:
如果他們中的任何一個用戶自定義, [例如:析構函數]三個函數的其餘部分將不會被聲明。這是正確的嗎? 或 它只適用於默認的構造函數,並複製構造函數?
如果您聲明自己構造的任何類型(包括拷貝構造函數),那麼默認構造函數不再是隱式聲明。其餘的是(除非你自己宣佈了其中一個)。
但是,如果您發現自己聲明2,3或4中的任何一個,那麼即使編譯器隱式聲明瞭它們,也很可能應該聲明另外兩個。這被稱爲rule of three。
編輯在C++ 11也有隱含聲明移動拷貝構造函數和移動賦值運算符,所以三的規則變成五個規則。
不,您不必僅僅因爲您聲明瞭其他人而明確聲明其他人。但是,如果您聲明2)
,3)
,4)
之一,那麼您可能還需要聲明其他人。
這叫做the rule of three。我相信它在C++ 11中被稱爲the rule of five。
我認爲他們已經在[「的法則五」(解決http://stackoverflow.com/questions/4782757/rule-of-three-becomes -rule-的五-與-C11)。 – 2012-07-26 14:22:23
謝謝,添加=) – 2012-07-26 14:26:49
如果您定義了自己的Foo()
,則仍會聲明默認的~Foo()
,反之亦然。與賦值運算符和複製構造函數一樣。只要記住,如果你定義了一個帶參數的構造函數,你將失去默認的構造函數。你必須這樣做是爲了得到一個太:
class Foo
{
public:
Foo(); //Declares a default constructor.
Foo(int);
}
通過引入移動語義來制定「五項規則」。 – 2012-07-26 14:21:08
@yurikilochek好點,我補充一點。 – juanchopanza 2012-07-26 14:25:27
是不是2,3和4? – 2012-07-26 14:26:25