err name 工作 系统调用 设计 total ring strong logs
本文介绍了类中无默认构造函数可能会出现的问题,以及避免方法。
下面一段程序编译的时候 会出现错误.
- #include < iostream >
- #include "string.h"using namespace std;
- class Student {
- private: int Num,
- Chinese,
- Maths,
- English;
- float Total;
- char Name[20];
- public:
- // Student(){}//默认构造函数
- Student(char name[20], int num, int chinese, int maths, int english);
- };
- Student: :Student(char name[20], int num, int chinese, int maths, int english) {
- int n;
- for (n = 0; n < strlen(name); n++) Name[n] = name[n];
- Num = num;
- Chinese = chinese;
- English = english;
- Maths = maths;
- Total = maths + chinese + english;
- }
- int main() {
- int i,
- j;
- int num,
- chinese,
- maths,
- english;
- char name[20];
- Student std[5]; //此时编译不通过
- }
错误信息如下:
[Error] no matching function for call to ‘Student::Student()‘
为了更好的说明这个错误出现的原因以及解决方案,下面先说明一下默认初始化的含义。
默认初始化:定义的变量没有初始化的时候 编译器会自动为其初始化,这个过程叫做默认初始化,它由变量的类型和定义的位置决定。如果是全局变量的内置类型(int float...)则初始化为0,但是函数内的局部变量就不会初始化为0,所以在使用局部变量的时候需要注意。
好了下面说说编译器对类是怎么默认初始化的:
类的默认初始化由默认构造函数决定,即编译器会自动的调用默认构造函数进行初始化,(默认构造函数即:无须任何实参的构造函数) ,如果程序员没有显示的写一个构造函数,那么编译器会自动的隐式定义一个构造函数(合成的默认构造函数)。一个类的对象被定义的时候,会首先调用构造函数进行初始化(这是一些内置类型如int float...所没有的),除非你显示的调用初始化工作(就是你自己设计的构造函数),否则系统默认调用没有参数的构造函数,因为代码中没有定义无参数的构造函数,所以出现调用出错,就是编译出错的情况。对应上面程序,当定义了构造函数以后,编译器合成的默认构造函数就不起作用了。所以Student类里边就没有默认的构造函数了,
即:没有没有参数的构造函数。所以Student std[5]; 此时系统调用默认构造函数 恰好此时没有了默认构造函数,就会出现错误。
解决方案:可以在建立类的时候,除了建立了自己的构造函数外,要建立默认的构造函数。或者仅仅建立自己的构造函数,但是在定义变量的时候要注意初始化。
笔记:构造函数易错点
来源: http://www.bubuko.com/infodetail-2341508.html