本文介绍了类中无默认构造函数可能会出现的问题,以及避免方法。
下面一段程序编译的时候 会出现错误.
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 }
错误信息如下:
[Error] no matching function for call to 'Student::Student()'
为了更好的说明这个错误出现的原因以及解决方案,下面先说明一下默认初始化的含义。
默认初始化:定义的变量没有初始化的时候 编译器会自动为其初始化,这个过程叫做默认初始化,它由变量的类型和定义的位置决定。如果是全局变量的内置类型(int float...)则初始化为0,但是函数内的局部变量就不会初始化为0,所以在使用局部变量的时候需要注意。
好了下面说说编译器对类是怎么默认初始化的:
类的默认初始化由默认构造函数决定,即编译器会自动的调用默认构造函数进行初始化,(默认构造函数即:无须任何实参的构造函数) ,如果程序员没有显示的写一个构造函数,那么编译器会自动的隐式定义一个构造函数(合成的默认构造函数)。一个类的对象被定义的时候,会首先调用构造函数进行初始化(这是一些内置类型如int float...所没有的),除非你显示的调用初始化工作(就是你自己设计的构造函数),否则系统默认调用没有参数的构造函数,因为代码中没有定义无参数的构造函数,所以出现调用出错,就是编译出错的情况。对应上面程序,当定义了构造函数以后,编译器合成的默认构造函数就不起作用了。所以Student类里边就没有默认的构造函数了,
即:没有没有参数的构造函数。所以Student std[5]; 此时系统调用默认构造函数 恰好此时没有了默认构造函数,就会出现错误。
解决方案:可以在建立类的时候,除了建立了自己的构造函数外,要建立默认的构造函数。或者仅仅建立自己的构造函数,但是在定义变量的时候要注意初始化。