複製鏈接
請複製以下鏈接發送給好友

缺省構造函數

鎖定
缺省構造函數又叫默認構造函數,英文名稱default constructor,是當聲明對象的時候,編譯器會調用的一個構造函數。
計算機編程語言中,缺省構造函數可以指編譯器在沒有任何程序員定義的構造函數(例如Java)的情況下自動生成的構造函數,通常是無用的構造函數。 在其他語言中(例如在C ++中),無論構造函數是自動生成的還是用户定義的,它都是可以調用的構造函數,無需提供任何參數。 請注意,如果在構造函數的定義中提供了默認參數,那麼帶有形參的構造函數仍然可以不帶參數地被調用。
中文名
缺省構造函數
外文名
default constructor

目錄

缺省構造函數C++

在C ++中,該標準將類的默認構造函數描述為可以不帶任何參數調用的構造函數(其中包含一個構造函數,其參數都具有缺省參數)。 例如 [1] 
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中。
參考資料