2014-07-21 83 views
1

根據C++ 11標準,您可以使用default關鍵字將特殊成員函數聲明爲默認值。在C++中明確聲明默認方法

class Foo 
{ 
public: 
    Foo() = default; 
    Foo(const Foo& source) = default; 
    Foo(Foo&& source) = default; 
    ~Foo() = default; 
    Foo& operator=(const Foo& right) = default; 
    Foo& operator=(Foo&& right) = default; 
}; 

我想知道它是一個很好的做法,聲明所有那些明確違約或者如果你不需要他們的自定義實現刪除方法。例如,我需要爲我的類實現複製構造函數和複製賦值運算符。我是否應該用defaultdelete關鍵字標記所有其他特殊成員函數,以免每次看到由編譯器提供的類而哪些不是?

+4

IMO,它是純粹的噪聲:它不會增加什麼(好)C++程序員已經知道。 –

+0

@Park Young-Bae你能否回答,我可以接受嗎? –

回答

1

這取決於。對於何時以及編譯器是否自動生成這些函數有規則。如果編譯器不這樣做並且你需要它們,你可以強制它使用默認生成它們或者自己實現它。當編譯器不會產生功能的情況是(這是不完整列表,請參閱你的編譯器的文檔):

  • 當帶參數的構造函數的聲明不產生默認構造函數
  • 沒有招當你聲明拷貝構造函數和拷貝賦值運算符(和反之亦然)

因此,在這些情況下,您可能想將其帶回通過default,如果你知道自己會構造函數和移動賦值運算符生成需要某處。然而,在大多數情況下,你應該讓編譯器完成它的工作。如果其中一個功能沒有自動執行,您將會收到錯誤。

P.S.對於移動構造函數和移動賦值操作符,Visual Studio尚不支持defaultdelete

+1

我認爲OP知道這一點。他問,在嚴格不需要這樣做的情況下,默認或刪除這些方法是否是好的做法。 – juanchopanza

+0

@rashmatash謝謝你的回答,但是juanchopanza對他的假設絕對準確。我知道創建方法的條件,並且對我是否真的需要它們時宣佈它們是否是一種好的做法感興趣 –

+0

另外,編譯器不是由誰來決定的。規則在語言規範中進行了規定。 – juanchopanza