笔记:构造函数易错点
2018-06-17 21:48:34来源:未知 阅读 ()
本文介绍了类中无默认构造函数可能会出现的问题,以及避免方法。
下面一段程序编译的时候 会出现错误.
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]; 此时系统调用默认构造函数 恰好此时没有了默认构造函数,就会出现错误。
解决方案:可以在建立类的时候,除了建立了自己的构造函数外,要建立默认的构造函数。或者仅仅建立自己的构造函数,但是在定义变量的时候要注意初始化。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++ 转换函数搭配友元函数 2020-06-10
- C++ rand函数 2020-06-10
- C++ 友元函数 2020-06-10
- C++ const成员函数 2020-06-03
- C++ 析构函数 2020-06-03
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash