




已阅读5页,还剩44页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十三章运算符重载,函数的重载,所谓函数的重载是指完成不同功能的函数可以具有相同的函数名。,C+的编译器是根据函数的实参来确定应该调用哪一个函数的。,intfun(inta,intb)returna+b;,intfun(inta)returna*a;,voidmain(void)coutfun(3,5)endl;coutfun(5)endl;,8,25,1、定义的重载函数必须具有不同的参数个数,或不同的参数类型。只有这样编译系统才有可能根据不同的参数去调用不同的重载函数。,2、仅返回值不同时,不能定义为重载函数。,intsum,a=3,b=2;,(int)=(int)+(int),sum=a+b;,floatadd,x=3.2,y=2.5;,(float)=(float)+(float),add=x+y;,charstr4,c12=a,c22=b;,(char*)=(char*)+(char*),str=c1+c2;,编译系统中的运算符“”本身不能做这种运算,若使上式可以运算,必须重新定义“”运算符,这种重新定义的过程成为运算符的重载。,classAfloatx,y;public:A(floata=0,floatb=0)x=a;y=b;voidmain(void)Aa(2,3),b(3,4),c;c=a+b;,两对象不能使用,必须重新定义,运算符重载就是赋予已有的运算符多重含义。C+通过重新定义运算符,使它能够用于特定类的对象执行特定的功能,运算符的重载从另一个方面体现了OOP技术的多态性,且同一运算符根据不同的运算对象可以完成不同的操作。,为了重载运算符,必须定义一个函数,并告诉编译器,遇到这个重载运算符就调用该函数,由这个函数来完成该运算符应该完成的操作。这种函数称为运算符重载函数,它通常是类的成员函数或者是友元函数。运算符的操作数通常也应该是类的对象。,重载为类的成员函数,格式如下:operator()函数体,Aoperator+(A,/重载了类A的“+”运算符,其中:operator是定义运算符重载函数的关键字,它与其后的运算符一起构成函数名。,返回类型,运算的对象,关键字,函数名,运算的对象,classAinti;public:A(inta=0)i=a;voidShow(void)couti=iendl;voidAddA(A,没有重载运算符的例子,利用函数完成了加法运算,用和作对象调用函数,classAinti;public:A(inta=0)i=a;voidShow(void)couti=iendl;voidAddA(A,相当于a3=a1.operator+(a2),重载运算符与一般函数的比较:,相同:1)均为类的成员函数;2)实现同一功能,voidAddA(A,Aoperator+(A,a3=a1+a2;,a3.AddA(a1,a2);,返回值,函数名,形参列表,由对象a3调用,函数调用:,返回值,函数名,形参,函数调用:,a3=a1.operator+(a2);,由对象a1调用,Aoperator+(A,a3=a1+a2;,返回值,函数名,形参,函数调用:,a3=a1.operator+(a2);,由对象a1调用,总结:,重新定义运算符,由左操作符调用右操作符。最后将函数返回值赋给运算结果的对象。,classAinti;public:A(inta=0)i=a;voidShow(void)couti=iendl;voidAddA(A,相当于a3=a1.operator+(a2),当用成员函数实现运算符的重载时,运算符重载函数的参数只能有二种情况:没有参数或带有一个参数。对于只有一个操作数的运算符(如+),在重载这种运算符时,通常不能有参数;而对于有二个操作数的运算符,只能带有一个参数。这参数可以是对象,对象的引用,或其它类型的参数。在C+中不允许重载有三个操作数的运算符,2、在C+中,允许重载的运算符列于表13.1中。3、在C+中不允许重载的运算符列于表13.2。4、只能对C+中已定义了的运算符进行重载,而且,当重载一个运算符时,该运算符的优先级和结合律是不能改变的。,classroomfloatLength;floatWide;public:room(floata=0.0,floatb=0.0)Length=a;Wide=b;voidShow(void)coutLength=LengthtWide=Wideendl;voidShowArea(void)coutArea=Length*Wideendl;roomoperator+(room,r4=r1+r2+r3;,(r1+r2);,(r1+r2)+r3;,r4=r1+(r2+r3);,(r2+r3);,r1+(r2+r3);,运算符的优先级和结合律是不能改变的,classAinti;public:A(inta=0)i=a;voidShow(void)couti=iendl;Aoperator+(A,由左操作符调用右操作符,没有返回值,故函数类型为void。,相当于a3=a1.operator+(a2),相当于a1.operator+=(a2),单目运算符的重载,只具有一个操作数的运算符为单目运算符,最常用的为及。,Aa,b;b=+a;b=a+;,Aa;+a;a+;,可以看出,虽然运算后对象a的值一致,但先自加或后自加的重载运算符函数的返回值不一致,必须在重载时予以区分。,+为前置运算时,它的运算符重载函数的一般格式为:operator+().;+为后置运算时,它的运算符重载函数的一般格式为:operator+(int).;,Aa,b;b=+a;b=a+;,Aoperator+().,Aoperator+(int).,classAfloatx,y;public:A(floata=0,floatb=0)x=a;y=b;Aoperator+()At;t.x=+x;t.y=+y;returnt;Aoperator+(int)At;t.x=x+;t.y=y+;returnt;voidmain(void)Aa(2,3),b;b=+a;b=a+;,Aoperator+()At;t.x=+x;t.y=+y;returnt;,b=+a;,b=a.operator+();,返回值,函数名,a,t,3,3,4,4,t作为函数值返回赋给b,Aoperator+()+x;+y;return*this;,将对象本身作为函数值返回赋给b,Aoperator+(int)At;t.x=x+;t.y=y+;returnt;,b=a+;,b=a.operator+(3);,a,t,3,2,4,3,返回值,函数名,t作为函数值返回赋给b,classincountintc1,c2;public:incount(inta=0,intb=0)c1=a;c2=b;voidShow(void)coutc1=c1tc2=c2等,格式为:friendoperator().,c=a+b;/c=operator+(a,b)friendAoperator+(Apublic:public:A(inta=0)i=a;voidShow(void)couti=iendl;friendAoperator+(A,相当于a3=operator+(a1,a2),+为前置运算时,它的运算符重载函数的一般格式为:Aoperator+(Ab=+a;b=a+;,Aoperator+(Aa).,Aoperator+(Aa,int).,classAinti;public:public:A(inta=0)i=a;voidShow(void)couti=iendl;friendAoperator+(A,相当于a2=operator+(a1),相当于a3=operator+(a1,int),classincountintc1,c2;public:incount(inta=0,intb=0)c1=a;c2=b;voidShow(void)coutc1=c1tc2=c2endl;friendincountoperator+(incount,classThreeDfloatx,y,z;public:ThreeD(floata=0,floatb=0,floatc=0)x=a;y=b;z=c;friendThreeD,对双目运算符,重载为成员函数时,仅一个参数,另一个被隐含;重载为友元函数时,有两个参数,没有隐含参数。一般来说,单目运算符最好被重载为成员函数;对双目运算符最好被重载友元函数。,转换函数,转换函数就是在类中定义一个成员函数,其作用是将类转换为某种数据类型。,classAfloatx,y;public:A(floata,floatb)x=a;y=b;voidmain(void)Aa(2,3);coutaendl;,错误!类的对象不能直接输出,利用转换函数将类A的对象a转换成某种数据类型,A:operatorfloat()returnx+y;,格式为:ClassName:operator().,类名,具体的转换算法,欲转换类型,关键字,转换算法自己定义,1.转换函数必须是类的成员函数。,2.转换函数的调用是隐含的,没有参数。,classAinti;public:public:A(inta=0)i=a;voidShow(void)couti=iendl;operatorint()returni;voidmain(void)Aa1(10),a2(20);couta1endl;couta2endl;,classComplexfloatReal,Image;public:Complex(floatreal=0,floatimage=0)Real=real;Image=image;voidShow(void)coutfloat;Complex:operatorfloat()returnReal*Real+Image*Image;voidmain(void)Complexc(10,20);c.Show();coutcendl;/可以直接输出c,因为已经进行类型转换,注意,转换函数只能是成员函数,不能是友元函数。转换函数的操作数是对象。转换函数可以被派生类继承,也可以被说明为虚函数。,赋值运算符与赋值运算符重载“”,同类型的对象间可以相互赋值,等同于对象的各个成员的一一赋值。,Aa(2,3),b;ba;,但当对象的成员中使用了动态的数据类型时(用new开辟空间),就不能直接相互赋值,否则在程序的执行期间会出现运行错误。,classAchar*ps;public:A()ps=0;A(char*s)ps=newcharstrlen(s)+1;strcpy(ps,s);A()if(ps)deleteps;voidShow(void)coutpsendl;voidmain(void)As1(China!),s2(Computer!);s1.Show();s2.Show();s2=s1;s1.Show();s2.Show();,/相当于s2.ps=s1.ps;,s1,ps,“China”,s2,ps,Computer,s2.ps=s1.ps,首先析构s2,接着析构s1出错,这时,利用编译系统的默认赋值无法正确运行程序,必须重载赋值运算符“”,即重新定义“”。格式为::operator=()赋值运算符必须重载为成员函数。,AA:operator=(A,b.operator=(a);,左操作符调用右操作符,classSampleintx;public:Sample(inti=0)x=i;voiddisp(void)cout“x=“xendl;voidoperator=(Sample,classAchar*ps;public:A()ps=0;A(char*s)ps=newcharstrlen(s)+1;strcpy(ps,s);A()if(ps)deleteps;voidShow(void)coutpsendl;A,必须重新定义“=”,A,s1,ps,“China”,s2,ps,“Computer”,s2=s1;,s2.operator=(s1);,“China”,返回同种类型的引用适合于连等。,s3=s2=s1;,classAchar*ps;public:A()ps=0;A(char*s)ps=newcharstrlen(s)+1;strcpy(ps,s);A()if(ps)deleteps;char*GetS()returnps;A,s2.ps重新开辟内存,存放“China”,重新开辟内存,一个字符串类在C+中,系统提供的字符串处理能力比较弱,都是通过字符处理函数来实现的,并且不能直接对字符串进行加法、减法,字符串的拼接,字符串之间的相互赋值等操作。可以通过应用C+提供的运算符重载机制,可以提供字符串的直接操作能力,使得字符串的操作与一般的数据一样方便。,classStringintLength;/字符串长度char*Sp;/字符串在内存中的首地址public:.,可见,字符串类只定义了指针,并没有开辟具体的空间以存放字符串的内容,所以,无论是构造、析构还是加减等,均需要考虑动态开辟空间的问题,这也是字符串类的难点。,classStringintLength;/字符串的长度c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年秋季初级经济师考试 经济基础知识押题冲刺训练试卷
- 现代婚姻法律知识培训内容课件
- 广西钟山中学2026届高三化学第一学期期末综合测试试题含解析
- 兖州中考题目及答案大全
- 烟台教招必背题目及答案
- 民法典婚姻培训课件
- 无人机产业链全面分析及未来发展
- 玉米速写课件
- 2026届河南省开封十中化学高二第一学期期中经典模拟试题含解析
- 2025年度绿色建筑认证生态办公场地租赁合同(绿色装修标准)
- 印刷装订车间管理办法
- 阿尔茨海默症诊断标准
- 企业技术津贴管理办法
- 2025年-北京语言大学社会和应届生事业编制人员公招聘考试笔试试卷附答案
- 2025年保安证考试题目及答案
- 重水行业市场发展分析及发展趋势研究报告2025-2028版
- 工业机器人讲课件
- 2025年湖北省中考英语试卷真题(含答案解析)
- 中医适宜技术的临床应用讲课件
- 中职语文拓展模块上册教学计划
- 微纳尺度熔覆涂层制备-洞察及研究
评论
0/150
提交评论