2014-12-25 69 views

回答

0

您應該區分術語默認構造函數顯式默認構造函數。根據C++標準(12.1構造)

4一類X A默認的構造是類X的一個構造 可以不帶參數被調用。

從這個定義例如,它遵循一般情況下默認構造函數可能有參數。而且,相同的構造函數可以是默認構造函數和非默認構造函數。

請看下面的例子

讓我們假設你定義一個類構造函數帶有一個參數

struct A 
{ 
    A(int); 
}; 

到現在爲止它是不是默認construtor。你可能不會寫例如

A a1; 

編譯器會發出錯誤。但是你可以寫

A a1(10); 

那麼這個定義A1後有一個默認的參數

A::A(int = 0) {} 

構造函數的定義,現在的構造已經成爲一個默認的構造函數,你可以寫

A a2; 

整個例子看起來像

#include <iostream> 

struct A 
{ 
    A(int); 
}; 

//A a1; - compilation error 
A a1(10); 

A::A(int = 0) {} 

A a2; // O'k 

int main() 
{ 

    return 0; 
} 

顯式默認構造函數是一個用關鍵字定義的構造函數,默認爲。顯式默認構造函數可能沒有默認參數。 這裏是默認

struct A 
{ 
    A() = default; 
}; 

一個默認的構造函數是明確的例子使被拖欠可能沒有參數的默認構造函數。

至於這個你的問題

,如果不帶參數的構造函數內部沒有語句將它 是默認或空的構造?

那麼在C++標準中沒有空構造函數這樣的術語。然而,默認的默認構造函數看起來與用戶定義的具有空主體的默認構造函數的方式相同。從C++標準(12.1構造,段#5)

的隱式定義的默認的構造執行集的類的 初始化將由用戶編寫 默認構造該類沒有進行ctor-initializer(12.6.2) 和一個空的複合語句。

考慮到由編譯器隱式定義和顯式用戶定義的空正文拷貝構造函數之間存在很大差異。我描述了它 here雖然它是用俄語寫的,但我認爲你可以使用瀏覽器或網頁(例如谷歌)服務翻譯英文翻譯。

3

從C++ 11標準N3376 12.1/5

一類X A默認的構造是類X的一個構造 可以不帶參數被調用。如果沒有用戶聲明 構造函數X類,無參數的構造函數是 隱含聲明爲默認(8.4)

所以不帶任何參數(聲明或不聲明)構造函數是默認構造函數。

+0

如果您沒有明確定義默認構造函數,則C++編譯器會生成一個隱式構造函數。但是,使用C++ 11時,您也可以防止這種隱式生成的默認構造函數。請查看http://en.cppreference.com/w/cpp/language/default_constructor上的「已隱式聲明的默認構造函數」部分。 – Deniz

+0

@Deniz是的,我知道,默認的構造函數可以被定義爲刪除,但是,它與問題沒有關係。 – ForEveR

+0

額外的信息不會傷害任何人,我認爲(特別是當提到C++ 11時)。 – Deniz

3

是的,因爲默認構造函數是一個可以不帶參數調用的構造函數。

0

在參照標準C++

yes it will be default constructor. 
constructor with no arguments will be treated as default constructor. 
0

它可以說是一個默認的構造是不帶參數或所有參數具有默認參數的構造函數。欲瞭解更多信息,請看herehere。它們都可以作爲默認參數接受。除此之外,默認構造函數可以顯式或隱式定義。如果你沒有明確定義一個,編譯器會爲你生成一個隱含的默認構造函數。 C++ 11有一個例外(請參閱我對@ForEver答案的評論),這是一種新的可用的功能,而不是私人(複製)構造函數,適用於我認爲的某些模式。

我不知道像「空構造函數」這樣的術語,因爲C++編譯器對你在構造函數中做了什麼不感興趣。它們只是(隱式地)定義和/或執行它。所以你可以自由地在構造函數中做任何你想做的事(當然不會造成崩潰等)。

0

當一個對象被創建時沒有任何參數,它會調用默認的構造函數。通常它是沒有參數的構造函數,但並非總是如此。

class FOO 
{ 
    int i; 
public: 
    FOO(int iVal = 10) 
    { 
     i = iVal; 
    } 
}; 

在上述情況下,具有默認參數的構造函數是默認構造函數。

空構造函數不算什麼。可能是你試圖確保沒有成員變量被初始化。

相關問題