缺省構造函數

缺省構造函數是C + + 及其他一些面向對象程序設計語言中 ， 對象的不需要參數即可調用的構造函數 。 對象生成時如果沒有顯式地調用構造函數 ， 則缺省構造函數會被自動調用 。 C++ 標準規定 ， 如果構造函數沒有參數 （ nullary ） ， 或者構造函數的所有參數都有缺省值 （ default value ） ， 都算作缺省構造函數 。 一個類只能有一個缺省構造函數 。 例如 ， 顯式定義 、 使用 “ 缺省構造函數 ” ： class MyClass { public: MyClass; / / constructor declared private: int x; }; MyClass:: MyClass / / constructor defined { x = 100; } int main { MyClass object; / / object created } / / = > default constructor called automatically 下述例子是動態生成對象時 ， 顯示調用了缺省構造函數 ： int main { MyClass * pointer = new MyClass; / / object created } / / = > default constructor called automatically MyClass ( int i = 0 ) { } C++ 中 ， 缺省構造函數會在下列情形被自動調用 ： 對象被定義時無參數 ， 例如 ： MyClass x;; 或動態分配對象時無參數列表 ， 例如 ： new MyClass或new MyClass; 缺省構造函數用於初始化對象 。 對象數組被定義時 ， 例如 ： MyClass x [ 10 ];; 或被動態分配時 ， 例如 ： new MyClass [ 10 ]; 缺省構造函數初始化數組的每個對象 。 當派生類在其初始化列表 （ initializer list ） 中沒有顯式調用其基類對象的構造函數時 ， 基類的缺省構造函數被自動調用 。 當一個類的構造函數的初始化列表中沒有顯式調用其對象成員 （ object component或object - valued field ） 的構造函數時 ， 對象成員的缺省構造函數被自動調用 。 C++ 標準程序庫中 ， 一些容器的填充值使用了值對象的缺省構造函數 ， 如果這些值沒有顯式地給出 。 例如 ： vector <MyClass> ( 10 ); 用10個元素初始化vector ， 這些元素用其缺省構造函數來初始化 。 在上述這些情形中 ， 如果被初始化地對象沒有缺省構造函數 ， 則編譯時報錯 。 如果一個類沒有顯式定義構造函數 ， 編譯器將爲其隱式地定義缺省構造函數 （ 下文給出了例外情形 ） 。 隱式定義的缺省構造函數的函數體爲空 。 例如 ： class MyClass { int x; / / no constructor }; / / = > the compiler produces an ( implicit ) default constructor int main { MyClass object; / / no error: the ( implicit ) default constructor is called } 如果類顯式地定義了一些構造函數 ， 但不是缺省構造函數 ， 編譯器則不會爲該類隱式定義缺省構造函數 。 該類就沒有缺省構造函數了 。 也就是說 ， 並不是所有類都有缺省構造函數 。 這是很多常見錯誤的原因 。 例如 ： class MyClass { public: MyClass ( int y ); / / a constructor private: int x; }; MyClass:: MyClass ( int y ) { x = y; } int main { MyClass object ( 100 ); / / constructor called MyClass * pointer; / / for declaration do not need to know about existing constructors pointer = new MyClass; / / error: no default constructor return 0; } 如果類的基類沒有缺省構造函數 ， 那麼編譯器也不會爲該類隱式地定義缺省構造函數 。 因爲該類即使隱式地定義缺省構造函數 ， 也無法初始化其基類 。 例如 ： class A { public: explicit A ( int ) { ; class B: public A { }; int main { B b1; / / 編譯報錯 } 如果類的基類的缺省構造函數爲私有 ， 那麼編譯器會爲該類隱式地定義缺省構造函數 ， 但編譯報錯 “ can not access private member declared in class 基類名字 ” 。 例如 ： class A { A { }; public: }; class B: public A { }; int main { B b1; / / 編譯報錯 } 對於union數據類型 ， 如果它包含了一個成員有非缺省的構造函數 ， 那麼這個union類型的構造函數必須顯式調用這個成員類型的構造函數 。 例如 ： struct bar { bar { }; bar ( int ) { }; }; union foo { int i; float j; bar b; / / foo: b { } { }; / / 只有增加這行 ， 才能成功地構造一個foo類型的對象 }; foo vvv; / / syntax error: attempting to reference a deleted function