默認構造函數
默認的構造函數是指為所有參數都提供了默認值的構造函數,通常是指無參的構造函數。比如下面的類Test,它的默認構造函數就是Test()。
class Test { public: Test(){} // default constructor } ;
如果你沒有為你的類提供任何構造函數,那么編譯器將自動為你生成一個默認的無參構造函數。一旦你為你的類定義了構造函數,哪怕只是一個,那么編譯器將不再生成默認的構造函數。
為你的類提供默認的構造函數
有很多原因,列舉如下:
1. 當你使用靜態分配的數組,而數組元素類型是某個類的對象時,就要調用默認的構造函數,比如下面的代碼。
Object buffer[10]; // call default constructor
2. 當你使用動態分配的數組,而數組元素類型是某個類的對象時,就要調用默認的構造函數,比如下面的代碼,如果Object沒有默認的構造函數,是無法通過編譯的,因為new操作符要調用Object類的無參構造函數類初始化每個數組元素。
Object* buffer = new Object[10];
3. 當你使用標准庫的容器時,如果容器內的元素類型是某個類的對象時,那么這個類就需要默認的構造函數,原因同上。
vector<Object> buffer;
4. 一個類A以另外某個類B的對象為成員時,如果A提供了無參構造函數,而B未提供,那么A則無法使用自己的無參構造函數。下面的代碼將導致編譯錯誤。
class B { B(int i){} }; class A { A(){} B b; }; int main(void) { A a(); // error C2512: 'B' : no appropriate default constructor available getchar() ; return 0 ; }
再比如下面的代碼,類A定義了拷貝構造函數,而沒有提供默認的構造函數,B繼承自A,所以B在初始化時要調用A的構造函數來初始化A,而A沒有默認的構造函數,故產生編譯錯誤。
class A { A(const A&){} }; class B : public A { }; int main(void) { B b; //error C2512:'B': no appropriate default constructor available getchar() ; return 0 ; }
==