版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章重载与模板7.1重载重载含函数重载与运算符重载7.1.1函数重载引入原因重载指用同一个函数名对应着多个函数实现的情况。如:求两个数的较大值,若数的类型不同,则返回值类型不同。
intmax(int,int);…floatc=max(3.14,3.5);//error因此一个定义了实现整型数比较功能的函数无法用于实现实型数的比较,尽管其功能一致。这时就可采用重载。在C++中,允许两个或两个以上的函数采用相同的名字,只要使用不同类型、不同数目的参数或不同的返回值,编译器便知道在什么情况下该调用哪个函数,这就叫函数重载。如:intmax(intx,inty){return((x>y)?x:y);}
doublemax(doublex,doubley){return((x>y)
?x:y);}#include<iostream.h>voidmain(){cout<<max(10,20)<<endl;cout<<max(1.23,2.34)<<endl;}重载方式靠将实参的个数及类型和所被调用的f()函数的形参的个数及类型一一比较来判断。(1)作为重载函数至少在参数个数、参数类型上有所不同。若仅在返回类型上不同,编译器是无法区别的。如:voidfunc(int);intfunc(int);//错误
intmin(int,int);
intmin(int,int,int);//正确
intadd(int,int);
doubleadd(double,double);//正确(2)typedef定义的类型只是给已有类型取另外一个名字,编译器不能将其同原类型区分。如:
typedefINTint;voidfunc(intx){...}voidfunc(INTx){…}(3)重载函数一般应具有相同的功能,否则会破坏程序的可读性。注意事项问题的提出1、基本数据类型系统提供了大量运算符。如:intx,y;x=x+y;
表达简洁,使用方便。2、问题的提出:对于串类的对象合并:
stringx,y; strcat(x,y);不如上述运算那样简单,希望能改造为:x=x+y;更加简单和直观!
因此,需要对“+”进行不同的解释,即:重载7.1.2运算符重载一、C++中的运算符1、大多数系统预定义运算符都能重载,除开以下:
.::?:#*(当乘法运算符时可重载)“.”“::”“*”在C++中有特定定义“?:”不值得重载“#”不能被重载2、重载时的注意事项:(1)不能改变优先级;(2)不能改变结合性;(3)不能改变运算符所需操作数的个数;(4)重载后,可按这些运算符的表达方式使用。一、通过运算符重载函数进行重载1、运算符重载函数是成员函数语法形式:TypeX::operator@(参数表){//相对于该类而定义的操作
}
运算符重载的语法形式返回类型重载该运算符的类名要重载的运算符符号2、运算符重载函数是友元函数语法形式:Typeoperator@(参数表){//相对于该类而定义的操作
}罗列运算符所需要的操作数3、实例…voidoperator++()voidoperator--()…voidcounter::operator++(){ if(value<65535)value++; }…voidcounter::operator--(){ if(value>0)value--; }注意:重载中注意的问题1、运算符重载函数是友元函数、成员函数的区别;2、运算符被重载时,只是相对一特定类被重载,在特定的环境下作出特定的解释。当离开这个特定环境后,具有原来的意义(系统定义);3、当重载运算符解释失败时,用该运算符的预定义版本(系统)进行解释;4、用此方法重载时,只能对一个系统已有运算符进行特定环境下的新的解释,而不能创造新的运算符。当运算符不够用时,用函数调用来实现;5、除“=”以外,重载的运算符可以被任何派生类所继承,“=”需要每个类明确定义自己的解释;6、重载可能让程序的可读性下降,在使用时应模仿运算符的习惯用法。一、运算符重载函数定义的两种方式1、成员函数和友元函数2、差别的关键原因:this指针二、一元运算符1、不论前缀还是后缀,需要一个操作数2、对于任意一元运算符α:(1)成员函数重载运算符定义typex::operatorα(){…}
显式调用objX.operatorα()
隐式调用αobjX或:ojbXα(2)友元函数重载运算符定义typeoperatorα(Xobj){…}
显式调用operatorα(objX)
隐式调用αojbX或:objXα一元和二元运算符方式定义显式调用隐式调用备注成员
函数TypeX::operatorα(){…}objX.operatorα()αobjX或:objXα操作数通过THIS指针隐含传递,因此参数表为空。友元
函数Typeoperatorα(Xojb){…}operatorα(objX)αobjX或:objXα()所需要的一个操作数在参数表中,由对象显式地提供。一元运算符的重载三、二元运算符1、需要两个操作数;2、对于任意二元运算符β:方式定义显式调用隐式调用备注成员
函数TypeX::operatorβ(Xobj){…}objX1.operatorβ(objX2)objX1β(objX2)第一个操作数通过THIS指针隐含传递,第二个操作数通过参数提供,只有一个参数。友元
函数Typeoperatorβ(Xojb){…}operatorβ(objX1,objX2)objX1β(objX2)所需要的两个操作数在参数表中,由对象显式地提供。用成员函数重载运算符例7-61、重载“+”、“=”、“++”;读懂几个成员函数;2、成员函数重载运算符,激活运算符的对象都是由THIS指针隐含传递的。用友元函数重载运算符1、成员函数重载可能造成的麻烦:成员函数重载的运算符不具有交换性。原因:成员函数仅能被一个“实际对象”所调用,如果引起成员函数调用的是一个值(非一个对象),成员函数将不能正确工作。2、可用友元函数解决这一问题: 友元函数重载运算符时,需要明确给出参数,不会出错。3、不能用友元函数重载的运算符:
=、()、[]、->4、注意:(1)对THIS所指向的数据的任何改变都会影响到激活运算数函数的对象。(2)可使用引用参数(指针)来解决重载时的二义性。重载++和--一、关于++和--1、C中的++和--的两种形式:前缀:++i;后缀:i--;2、在C++中的约定
(显式地区分前缀和后缀)(1)对于前缀方式++i:
成员函数:XX::operator++();
友元函数:Xoperator++(X&);(2)对于后缀方式i++:
成员函数:XX::operator++(int);
友元函数:Xoperator++(X&,int);
第二个参数INT一般设置为0,如:
i++等价于:i++(0)或:i++=0二、实例ClassX{…Xoperator++() { a++; b++; return*this; }Xoperator++(intx) { Xtemp; a++; b++; returntemp; }ClassX{…friendoperator++(Y&a) { a.x++; b.y++; returna; }friendoperator++(Y&a,inti) { Ytemp=a; a.x++; b.y++; returntemp; }重载赋值运算符一、概述1、“=”赋值运算符可以被重载;2、重载后不能被继承;3、必须重载为成员函数。二、格式:XX::operator=(constXfrom) { //复制X的成员;
}三、一般来说当缺省的类赋值函数不能正确工作时,考虑“=”的重载。7.2模板模板包含函数模板与类模板7.2.1函数模板1.函数模板的定义函数模板的定义为:
template<类型参数表><返回类型><函数名>(形参表)
{//函数定义体
}由class或typename后加一个标识符构成【例】函数模板的说明template<class
Glorp>Glorpmin(Glorpa,Glorpb){returna<b?a:b;}注意:对函数模板的说明和定义必须是全局作用域,函数模板不能说明为类的成员函数2.函数模板的实例化在函数模板中,函数模板只是说明,不能直接执行,需要实例化为模板函数后才能执行。当编译系统发现一个函数调用时,将根据实参表中的类型生成一个重载函数即模板函数。【例】函数模板的实例化#include<iostream.h>template<classA>Afab(Ax){returnx>=0?x,-x;}voidmain(){inti=5;doubley=-5.4;cout<<”整数的绝对值”<<fab(i)<<endl;//A实例化为intcout<<”实数的绝对值”<<fab(y)<<endl;//A实例化为double}7.2.2类模板1.类模板的定义
template<类型形参表>class<类名>{//类说明体}template<类型形参表><返回类型><类名><类型名表>::<成员函数1>(形参表){//成员函数定义体}template<类型形参表><返回类型><类名><类型名表>::<成员函数2>(形参表){//成员函数定义体}。。。template<类型形参表><返回类型><类名><类型名表>::<成员函数n>(形参表){//成员函数定义体}【例】设计一套完整的算术运算来补充add函数。template<classT>classCC
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024常规终止解除劳动合同证明书
- 2024年城市供水工程建设项目特许经营合同
- 2024年废弃物处理拆除劳务合同
- 有关产品加工合同经典范文
- 2024工伤赔偿协议书示例
- 私营店主用人劳动合同范本2024年
- 互联网接入服务合同范本
- 标准建房合同范本
- 工程分包合同书范本专业
- 全面店面出租合同模板
- 砌体工程监理实施细则
- 运输车辆卫生安全检查记录表
- 房建装修修缮工程量清单
- 部编版四年级道德与法治上册第8课《网络新世界》优质课件
- 柴油发电机组应急预案
- 格力2匹柜机检测报告KFR-50LW(50530)FNhAk-B1(性能)
- 分级护理制度考试题及答案
- 小学生劳动课炒菜教案(精选8篇)
- 高考作文模拟写作:“德”与“得”导写及范文
- 江苏专转本《大学语文》考纲
- 中国青瓷艺术鉴赏智慧树知到答案章节测试2023年丽水学院
评论
0/150
提交评论