1. 程式人生 > >筆記:構造函數易錯點

筆記:構造函數易錯點

err name 工作 系統調用 設計 total ring strong logs

本文介紹了類中無默認構造函數可能會出現的問題,以及避免方法。
下面一段程序編譯的時候 會出現錯誤.

技術分享
 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(char
name[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 }
View Code

錯誤信息如下:

[Error] no matching function for call to ‘Student::Student()‘

為了更好的說明這個錯誤出現的原因以及解決方案,下面先說明一下默認初始化的含義。

默認初始化:定義的變量沒有初始化的時候 編譯器會自動為其初始化,這個過程叫做默認初始化,它由變量的類型和定義的位置決定。如果是全局變量的內置類型(int float...)則初始化為0,但是函數內的局部變量就不會初始化為0,所以在使用局部變量的時候需要註意。

好了下面說說編譯器對類是怎麽默認初始化的:

類的默認初始化由默認構造函數決定,即編譯器會自動的調用默認構造函數進行初始化,(默認構造函數即:無須任何實參的構造函數) ,如果程序員沒有顯示的寫一個構造函數,那麽編譯器會自動的隱式定義一個構造函數(合成的默認構造函數)。一個類的對象被定義的時候,會首先調用構造函數進行初始化(這是一些內置類型如int float...所沒有的),除非你顯示的調用初始化工作(就是你自己設計的構造函數),否則系統默認調用沒有參數的構造函數,因為代碼中沒有定義無參數的構造函數,所以出現調用出錯,就是編譯出錯的情況對應上面程序,當定義了構造函數以後,編譯器合成的默認構造函數就不起作用了。所以Student類裏邊就沒有默認的構造函數了

即:沒有沒有參數的構造函數。所以Student std[5]; 此時系統調用默認構造函數 恰好此時沒有了默認構造函數,就會出現錯誤。

解決方案:可以在建立類的時候,除了建立了自己的構造函數外,要建立默認的構造函數。或者僅僅建立自己的構造函數,但是在定義變量的時候要註意初始化。

筆記:構造函數易錯點