2012-07-26 72 views
2

有四個基本上隱式聲明的特殊函數。隱式聲明的特殊成員函數

  1. 默認的構造
  2. 默認析構函數
  3. 默認賦值運算符
  4. 默認成員明智的副本操作

問:

如果他們中的任何一個用戶自定義, [例如:析構函數]三個函數的其餘部分將不會被聲明。這是正確的嗎? 或 它只適用於默認的構造函數,並複製構造函數?

回答

5

如果您聲明自己構造的任何類型(包括拷貝構造函數),那麼默認構造函數不再是隱式聲明。其餘的是(除非你自己宣佈了其中一個)。

但是,如果您發現自己聲明2,3或4中的任何一個,那麼即使編譯器隱式聲明瞭它們,也很可能應該聲明另外兩個。這被稱爲rule of three

編輯在C++ 11也有隱含聲明移動拷貝構造函數移動賦值運算符,所以三的規則變成五個規則。

+3

通過引入移動語義來制定「五項規則」。 – 2012-07-26 14:21:08

+0

@yurikilochek好點,我補充一點。 – juanchopanza 2012-07-26 14:25:27

+0

是不是2,3和4? – 2012-07-26 14:26:25

3

不,您不必僅僅因爲您聲明瞭其他人而明確聲明其他人。但是,如果您聲明2),3),4)之一,那麼您可能還需要聲明其他人。

這叫做the rule of three。我相信它在C++ 11中被稱爲the rule of five

+0

我認爲他們已經在[「的法則五」(解決http://stackoverflow.com/questions/4782757/rule-of-three-becomes -rule-的五-與-C11)。 – 2012-07-26 14:22:23

+0

謝謝,添加=) – 2012-07-26 14:26:49

1

如果您定義了自己的Foo(),則仍會聲明默認的~Foo(),反之亦然。與賦值運算符和複製構造函數一樣。只要記住,如果你定義了一個帶參數的構造函數,你將失去默認的構造函數。你必須這樣做是爲了得到一個太:

class Foo 
{ 
public: 
    Foo(); //Declares a default constructor. 
    Foo(int); 
}