構造函數:C++用於構建類的新對象時需要調用的函數,該函數無返回類型!(注意:是“無”! 不是空!(void))。
默認構造函數:未提供顯式初始值時,用來穿件對象的構造函數。
以上是二者的定義,但是單從定義很難對二者進行區別,下面依然看代碼。
1 class testClass 2 { 3 public: 4 testClass(); /* 默認構造函數 */ 5 testClass(int a, char b); /* 構造函數 */ 6 testClass(int a=10,char b='c'); /* 默認構造函數 */ 7 8 private: 9 int m_a; 10 char m_b; 11 };
上面的注釋中已標出了默認構造函數和構造函數。下面,對二者的區別進行簡單直白易懂的總結:
1. 默認構造函數主要是用來完成如下形式的初始化的:
1 testClass classA; 2 // 或者 testClass *classA = new testClass;
在這種情況下,如果沒有提供默認構造函數,編譯器會報錯;
非默認構造函數在調用時接受參數,如以下形式:
1 testClass classA(12,'H'); 2 //或者 testClass *classA = new testClass(12,'H');
2. 如果程序猿沒有定義任何構造函數,則編譯器會自動定義默認構造函數,其形式如 testClass() {}; 可以看出,編譯器自動提供的默認構造函數是 啥也沒有啊 ;
3. 定義默認構造函數有兩種方式,如上述代碼展示的,一是定義一個無參的構造函數,二是定義所有參數都有默認值的構造函數 ;
4. 注意:一個類只能有一個默認構造函數!也就是說上述兩種方式不能同時出現,一般選擇 testClass(); 這種形式的默認構造函數 ;
5. 只要程序猿定義了構造函數,編譯器就不會再提供默認構造函數了,所以,程序猿最好再手動定義一個默認構造函數,以防出現 testClass a; 這樣的錯誤。
舉例:
#include <iostream> using namespace std; class Box { public : Box(int h=10,int w=10,int len=10); //在聲明構造函數時指定默認參數--默認構造函數 int volume( ); private : int height; int width; int length; }; Box::Box(int h,int w,int len) { height=h; width=w; length=len; } //或者 //Box::Box(int h,int w,int len):height(h),width(w),length(len) //{ // //} int Box::volume( ) { return (height*width*length); } int main( ) { Box box1; //沒有給實參 cout<<"The volume of box1 is "<<box1.volume( )<<endl; Box box2(15); //只給定一個實參 cout<<"The volume of box2 is "<<box2.volume( )<<endl; Box box3(15,30); //只給定2個實參 cout<<"The volume of box3 is "<<box3.volume( )<<endl; Box box4(15,30,20); //給定3個實參 cout<<"The volume of box4 is "<<box4.volume( )<<endl; return 0; }
可以看到,在構造函數中使用默認參數是方便而有效的,它提供了建立對象時的多種選擇,它的作用相當於好幾個重載的構造函數。
它的好處是,即使在調用構造函數時沒有提供實參值,不僅不會出錯,而且還確保按照默認的參數值對對象進行初始化。尤其在希望對每一個對象都有同樣的初始化狀況時用這種方法更為方便。
二、構造函數重載
在一個類中可以定義多個構造函數,以便提供不同的初始化的方法,供用戶選用。這些構造函數具有相同的名字,而參數的個數或參數的類型不相同。這稱為構造函數的重載。
1 #include <iostream> 2 using namespace std; 3 class Box { 4 public : 5 Box(); //聲明一個無參的構造函數 6 //Box(int h); //有1個參數的構造函數 7 //Box(int h,int w); //有兩個參數的構造函數 8 Box(int h, int w, int len) :height(h), width(w), length(len);//聲明一個有參的構造函數,用參數的初始化表對數據成員初始化 9 int volume( ); 10 private : 11 int height; 12 int width; 13 int length; 14 }; 15 Box::Box() //定義一個無參的構造函數 16 { 17 height=10; 18 width=10; 19 length=10; 20 } 21 //Box::Box(int h) 22 //{ 23 // 24 //} 25 // 26 //Box::Box(int h,int w) 27 //{ 28 // 29 //} 30 31 Box::Box(int h, int w, int len) :height(h), width(w), length(len) 32 { 33 } 34 35 int Box::volume( ) 36 { 37 return (height*width*length); 38 } 39 40 int main( ) 41 { 42 Box box1; //建立對象box1,不指定實參 43 cout<<"The volume of box1 is "<<box1.volume( )<<endl; 44 Box box4(15,30,25); //建立對象box4,指定3個實參 45 cout<<"The volume of box4 is "<<box4.volume( )<<endl; 46 return 0; 47 }
以上代碼定義了四個重載構造和拿書,在建立對象時不指定參數,或者分別給定1個參數,2個參數和3個參數。
關於構造函數的重載的幾點說明:
1、調用構造函數時不必給出實參的構造函數,稱為默認構造函數(default constructor)。顯然,無參的構造函數屬於默認構造函數。一個類只能有一個默認構造函數。如果在建立對象時選用的是無參構造函數,應注意正確書寫定義對象的語句。
2、盡管在一個類中可以包含多個構造函數,但是對於每一個對象來說,建立對象時只執行其中一個構造函數,並非每個構造函數都被執行。
