預設構造函式

預設構造函式又叫默認構造函式,英文名稱default constructor,是當聲明對象的時候,編譯器會調用的一個構造函式。

在計算機程式語言中,預設構造函式可以指編譯器在沒有任何程式設計師定義的構造函式(例如Java)的情況下自動生成的構造函式,通常是無用的構造函式。 在其他語言中(例如在C ++中),無論構造函式是自動生成的還是用戶定義的,它都是可以調用的構造函式,無需提供任何參數。 請注意,如果在構造函式的定義中提供了默認參數,那么帶有形參的構造函式仍然可以不帶參數地被調用。

基本介紹

  • 中文名:預設構造函式
  • 外文名:default constructor
C++,Java和C#,

C++

在C ++中,該標準將類的默認構造函式描述為可以不帶任何參數調用的構造函式(其中包含一個構造函式,其參數都具有預設參數)。 例如:
class MyClass{public:    MyClass();  // constructor declaredprivate:    int x;};MyClass::MyClass() : x(100)  // constructor defined{}int main(){    MyClass m;  // at runtime, object m is created, and the default constructor is called}
當動態分配記憶體時,可以通過在類名後添加括弧來調用構造函式。 從某種意義上說,這是對構造函式的顯式調用:
int main(){    MyClass * pointer = new MyClass();  // at runtime, an object is created, and the                                        // default constructor is called}
如果構造函式確實有一個或多個參數,但它們都有默認值,那么它仍然是一個默認的構造函式。 請記住,每個類最多可以有一個默認構造函式,其中一個沒有參數,或者所有參數都有默認值的構造函式,比如在這種情況下:
class MyClass{public:    MyClass (int i = 0, std::string s = "");  // constructor declaredprivate:    int x;    int y;    std::string z;};MyClass::MyClass(int i, std::string s)     // constructor defined{    x = 100;    y = i;    z = s;}
在C ++中,默認構造函式非常重要,因為它們在某些情況下會自動調用;因此,在這些情況下,類沒有默認構造函式是錯誤的:
當沒有參數列表(例如:MyClass x;)或者沒有參數列表(例如:new MyClass;或new MyClass();)動態分配對象值時,MyClass的默認構造函式用於初始化對象。
當聲明一個對象數組時,例如MyClass x ;;或動態分配,例如,新的MyClass。 MyClass的默認構造函式用於初始化所有元素。
當派生類構造函式未在其初始化程式列表中顯式調用基類構造函式時,將調用基類的默認構造函式。
當類構造函式沒有在其初始化列表中明確調用其某個對象值域的構造函式時,將調用該欄位類的默認構造函式。
在標準庫中,當沒有明確給定值時,某些容器使用默認構造函式“填充”值。例如。向量<MyClass的>(10);用10個元素初始化矢量,這些元素用默認構造的MyClass對象填充。
如果一個類沒有明確定義的構造函式,編譯器會隱式聲明並為其定義一個默認的構造函式。這個隱式定義的默認構造函式等價於一個空體明確定義的構造函式。例如:
class MyClass{    int x;  // no constructor, so the compiler produces an (implicit) default constructor};int main(){    MyClass m;   // no error at runtime: the (implicit) default constructor is called}
如果構造函式是為一個類明確定義的,但它們都是非默認的,編譯器將不會隱式地定義一個默認構造函式,從而導致類沒有默認構造函式的情況。 這是典型錯誤的原因,如下例所示。
class MyClass{public:    MyClass (int y);  // declaration a non-default constructorprivate:    int x;};MyClass::MyClass (int y){    x = y;}int main(){    MyClass m(100);     // the non-default constructor is called    MyClass * p;        // for pointer declarations, the compiler does not need to know about constructors    p = new MyClass();  // error at compilation: no default constructor    return 0;}
由於程式設計師和編譯器都沒有定義默認的構造函式,因此由p指向的對象的創建會導致錯誤。
另一方面,在C ++ 11中,可以顯式創建一個默認構造函式:
class MyClass{public:    MyClass () = default;  // force generation of a default constructor};

Java和C#

在Java和C#中,“默認構造函式”指的是如果沒有為該類定義構造函式,那么編譯器會自動生成一個空構造函式。 默認構造函式隱式調用超類的空構造函式,然後執行一個空體。 所有欄位的初始值都為0(整數類型),0.0(浮點類型),false(布爾類型)或null(引用類型)。 一個不帶參數的程式設計師定義的構造函式在C#中也被稱為默認構造函式,但不是在Java中。

相關詞條

熱門詞條

聯絡我們