2013-07-09 69 views
1

所以我知道在類中編寫構造函數後,默認構造函數會消失,因此您必須開始初始化每個對象。但是,有沒有辦法編寫一個默認的構造函數,以便您不必這樣做?如何在C++中編寫一個默認的構造函數?

謝謝。

+6

'= dafault' .... –

+4

@LuchianGrigore *'default' – zch

+0

什麼'dafault'我剛讀?!? – Casey

回答

0
class A 
{ 
public: 
    // Or use A()=default for C++11 
    A(){} 

    A(int v):m_value(v){} 

private: 
    int m_value; 
}; 

int main() 
{ 
    A a; // Without default ctor ==>> error C2512: 'A' : no appropriate default constructor available 

    return 0; 
} 
2

隱含的默認構造函數消失。你仍然可以編寫另一個默認的構造函數,一個不帶任何參數或只帶有缺省值的參數;這只是編譯器沒有爲你做的。

沒有理由不能爲類A寫一個空的構造函數,並採用每個值的默認值。也許不是最好的主意,但它可以做到。

A() {/* empty */} 

正如評論指出的,如果你正在使用C++ 11你也可以使用新的default keyword給你什麼,如果它做的「默認」

A() = default; 
7

編譯器將有前C++ 11

class MyClass 
{ 
public: 
    MyClass(int x, int y) {} 
    MyClass() {} 
}; 

或C++ 11

class MyClass 
{ 
public: 
    MyClass(int x, int y) {} 
    MyClass() = default; 
}; 

你可以根據自己的喜好編寫儘可能多的構造函數,但是避免讓你的類感到困惑。

+0

+1後記建議。 –

1
struct S { 
    S(int) {} // non-default constructor that suppresses the implicit default constructor 

    S() = default; // bring the default constructor back 
}; 

請注意,有兩種使用「默認」的意義。從某種意義上說,它有一個默認的構造函數,它具有一個簽名,以便在「默認構造」中使用它。

其次,在默認情況下,實現將與編譯器爲隱式聲明的構造函數自動生成的內容匹配。

通過給出構造函數的默認參數,可以使您的類缺省構造(第一種意義上的缺省構造)。

struct S { 
    S(int = 10) {} 
}; 

雖然= default用來明確要求默認實現(默認的第二個含義)。

假設你的編譯器實現了= default,使用它通常優於S() {},原因很多。類定義中的= default會生成一個非用戶提供的構造函數,它具有多個效果。

  • 用戶提供的特殊成員函數從未瑣碎
  • 用戶提供的構造不夠格從一種聚合一種類型。
  • 值初始化包括零初始化類型與非用戶提供的默認構造函數
  • 默認const對象的初始化是不允許的類型,而用戶提供的默認構造函數

偶爾有人可能會想由於這些效果之一而由用戶提供的功能。它仍然可以通過使用它的類定義之外使用= default

struct S { 
    S(); 
}; 

S::S() = default; 

以上提供的編譯器的默認實現,但仍算作用戶提供的默認構造函數。另外,這可以用來保持ABI的穩定性;在後面的點= default可以被替換爲另一個定義,而不需要重新編譯構造對象的所有代碼,而使用內聯默認構造函數時將需要該對象。