本文介绍了类中无默认构造函数可能会出现的问题,以及避免方法。
下面一段程序编译的时候 会出现错误.

 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]; 此时系统调用默认构造函数 恰好此时没有了默认构造函数,就会出现错误。

解决方案:可以在建立类的时候,除了建立了自己的构造函数外,要建立默认的构造函数。或者仅仅建立自己的构造函数,但是在定义变量的时候要注意初始化。

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!