筆記:構造函數易錯點
本文介紹了類中無默認構造函數可能會出現的問題,以及避免方法。
下面一段程序編譯的時候 會出現錯誤.
1 #include<iostream> 2 3 #include"string.h" 4 using namespace std; 5 6 class Student 7 { 8 private: 9 int Num,Chinese,Maths,English; 10 float Total; 11 char Name[20]; 12 public: 13 // Student(){}//默認構造函數 14 Student(charView Codename[20],int num,int chinese,int maths,int english); 15 16 }; 17 Student::Student(char name[20],int num,int chinese,int maths,int english){ 18 int n; 19 for(n=0;n<strlen(name);n++) 20 Name[n]=name[n]; 21 Num=num; 22 Chinese=chinese; 23 English=english; 24 Maths=maths;25 Total=maths+chinese+english; 26 } 27 28 int main() 29 { 30 int i,j; 31 int num,chinese,maths,english; 32 char name[20]; 33 Student std[5];//此時編譯不通過 34 35 }
錯誤信息如下:
[Error] no matching function for call to ‘Student::Student()‘
為了更好的說明這個錯誤出現的原因以及解決方案,下面先說明一下默認初始化的含義。
默認初始化:定義的變量沒有初始化的時候 編譯器會自動為其初始化,這個過程叫做默認初始化,它由變量的類型和定義的位置決定。如果是全局變量的內置類型(int float...)則初始化為0,但是函數內的局部變量就不會初始化為0,所以在使用局部變量的時候需要註意。
好了下面說說編譯器對類是怎麽默認初始化的:
類的默認初始化由默認構造函數決定,即編譯器會自動的調用默認構造函數進行初始化,(默認構造函數即:無須任何實參的構造函數) ,如果程序員沒有顯示的寫一個構造函數,那麽編譯器會自動的隱式定義一個構造函數(合成的默認構造函數)。一個類的對象被定義的時候,會首先調用構造函數進行初始化(這是一些內置類型如int float...所沒有的),除非你顯示的調用初始化工作(就是你自己設計的構造函數),否則系統默認調用沒有參數的構造函數,因為代碼中沒有定義無參數的構造函數,所以出現調用出錯,就是編譯出錯的情況。對應上面程序,當定義了構造函數以後,編譯器合成的默認構造函數就不起作用了。所以Student類裏邊就沒有默認的構造函數了,
即:沒有沒有參數的構造函數。所以Student std[5]; 此時系統調用默認構造函數 恰好此時沒有了默認構造函數,就會出現錯誤。
解決方案:可以在建立類的時候,除了建立了自己的構造函數外,要建立默認的構造函數。或者僅僅建立自己的構造函數,但是在定義變量的時候要註意初始化。
筆記:構造函數易錯點