第四章 运算符重载_第1页
第四章 运算符重载_第2页
第四章 运算符重载_第3页
第四章 运算符重载_第4页
第四章 运算符重载_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

运算符重载使得用户自定义的数据以一种更简洁的方式工作。,例如intx,y;y=x+y;,matrixm1,m2;/矩阵类对象m1=Madd(m1,m2);/调用函数计算两个矩阵的和,complexc1,c2;/复数类对象c1=Cadd(c1,c2);/调用函数计算两个复数的和,能表示为c1=c1+c2;?,能表示为m1=m1+m2;?,4.1运算符重载,说明:C+中预定义的运算符其运算对象只能是基本数据类型,不适用于用户自定义类型(如类)-定义运算符重载函数,4.1.1运算符重载,概念用一个运算符表示不同功能的运算,这就是运算符重载。实质运算符重载是对已有的运算符赋予多重含义。实现机制将指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参。编译系统对重载运算符的选择,遵循函数重载的选择原则。,运算符函数是一种特殊的成员函数或友元函数成员函数的语法形式为:类型类名:operatorop(参数表)/相对于该类定义的操作,4.1.2运算符重载的语法形式,运算符函数是一种特殊的成员函数或友元函数成员函数的语法形式为:类型类名:operatorop(参数表)/相对于该类定义的操作,4.1.2运算符重载的语法形式,函数返回类型,运算符函数是一种特殊的成员函数或友元函数成员函数的语法形式为:类型类名:operatorop(参数表)/相对于该类定义的操作,4.1.2运算符重载的语法形式,重载该运算符的类,4.1.2运算符重载的语法形式,运算符函数是一种特殊的成员函数或友元函数成员函数的语法形式为:类型类名:operatorop(参数表)/相对于该类定义的操作,被重载的运算符,4.1.2运算符重载的语法形式,关键字,运算符函数是一种特殊的成员函数或友元函数成员函数的语法形式为:类型类名:operatorop(参数表)/相对于该类定义的操作,4.1.2运算符重载的语法形式,函数名,运算符函数是一种特殊的成员函数或友元函数成员函数的语法形式为:类型类名:operatorop(参数表)/相对于该类定义的操作,运算符函数是一种特殊的成员函数或友元函数成员函数的语法形式为:类型类名:operatorop(参数表)/相对于该类定义的操作,4.1.2运算符重载的语法形式,运算符要求的操作数,4.1.2运算符重载的语法形式,注意:一个运算符被重载后,原有意义没有失去,只是定义了相对一个特定类的一个新运算符。,运算符函数是一种特殊的成员函数或友元函数成员函数的语法形式为:类型类名:operatorop(参数表)/相对于该类定义的操作,4.1.3运算符重载规则,重载运算符的限制,可以重载的运算符+-*/%imag=0;Complex(doubler,doublei)real=r;imag=i;Complexoperator+(Complex,/重载运算符+,用于两个复数相加(成员函数)classComplexpublic:Complex()real=0;imag=0;Complex(doubler,doublei)real=r;imag=i;Complexoperator+(Complex,/重载运算符+,用于两个复数相加(成员函数)classComplexpublic:Complex()real=0;imag=0;Complex(doubler,doublei)real=r;imag=i;Complexoperator+(Complex,(Complex,c.real=real+c2.real;c.imag=imag+c2.imag;,(Complex,/重载运算符+,用于两个复数相加(成员函数)classComplexpublic:Complex()real=0;imag=0;Complex(doubler,doublei)real=r;imag=i;Complexoperator+(Complex,(Complex,c.real=this-real+c2.real;c.imag=this-imag+c2.imag;,(Complex,(Complex,说明:运算符重载函数作为成员函数,第一个操作数可以省略,但是必须为自身类中的对象,而且与运算符函数的类型相同第二个操作数可为自身类对象也可为普通数据类型,this-real,this-imag就是c1.real,c1.imag,4.2.2用友元函数重载,当二元运算符的左操作数为C+标准类型(如int)或是一个其他类的对象,则运算符重载函数不能作为成员函数,只能为非成员函数。如果函数需要访问类的私有成员,则必须声明为该类的友元函数。重载为友元函数,解释为:单目运算符:operatorop(Obj)操作数由参数表的参数Obj提供双目运算符:operatorop(Obj1,Obj2)左右操作数都由参数传递,/重载运算符+,用于两个复数相加(友元函数)classComplexpublic:Complex()real=0;imag=0;Complex(doubler,doublei)real=r;imag=i;friendComplexoperator+(Complex,/重载运算符+,用于两个复数相加(成员函数)classComplexpublic:Complex()real=0;imag=0;Complex(doubler,doublei)real=r;imag=i;friendComplexoperator+(Complex,友员函数重载运算符常用于运算符的左右操作数类型不同的情况,4.2用友员函数重载,6.2.2用友员函数重载算符,友员函数重载运算符常用于运算符的左右操作数类型不同的情况,4.2用友员函数重载,classComplexintReal;intImag;public:Complex(inta)Real=a;Imag=0;Complex(inta,intb)Real=a;Imag=b;friendComplexoperator+(Complex,int);.;intf()Complexz(2,3),k(3,4);z=z+27;z=27+z;.,例如,operator+(z,27),6.2.2用友员函数重载算符,友员函数重载运算符常用于运算符的左右操作数类型不同的情况,4.2用友员函数重载,classComplexintReal;intImag;public:Complex(inta)Real=a;Imag=0;Complex(inta,intb)Real=a;Imag=b;friendComplexoperator+(Complex,int);.;intf()Complexz(2,3),k(3,4);z=z+27;z=27+z;.,例如,operator+(z,27),OK,6.2.2用友员函数重载算符,友员函数重载运算符常用于运算符的左右操作数类型不同的情况,4.2用友员函数重载,classComplexintReal;intImag;public:Complex(inta)Real=a;Imag=0;Complex(inta,intb)Real=a;Imag=b;friendComplexoperator+(Complex,int);.;intf()Complexz(2,3),k(3,4);z=z+27;z=27+z;.,例如,operator+(27,z),NO27不是Complex类,不能调用函数,6.2.2用友员函数重载算符,友员函数重载运算符常用于运算符的左右操作数类型不同的情况,4.2用友员函数重载,classComplexintReal;intImag;public:Complex(inta)Real=a;Imag=0;Complex(inta,intb)Real=a;Imag=b;Complexoperator+(Complex,int);.;intf()Complexz(2,3),k(3,4);z=z+27;z=27+z;.,例如,成员函数重载的“+”运算符不支持交换律,6.2.2用友员函数重载算符,成员函数要求运算符左侧的操作数必须是自定义类型的对象,而友元函数没有这个限制。由于使用友元会破坏类的封装,要尽量将运算符重载函数定义为成员函数。但考虑到各方面的因素,一般将单目运算符重载为成员函数,将双目运算符重载为友元函数。VC+6.0的不带后缀h的头文件不支持把运算符重载函数重载为友元函数。但VC+6.0带后缀h的头文件支持这项功能,所以将语句:,注意:,4.3重载双目运算符,双目运算符(或称二元运算符)是运算符左边和右边的操作数均参加运算,表示为:Obj1opObj2如:3+5,a=b重载为成员函数,解释为:Obj1.operatorop(Obj2)左操作数由Obj1通过this指针传递,右操作数由参数Obj2传递重载为友元函数,解释为:operatorop(Obj1,Obj2)左右操作数都由参数传递,4.4重载单目运算符,单目运算符(或称一元运算符)是只有一个运算符参加运算,因此运算符重载函数只有一个参数。表示为:Objop或opObj如:+i,-b重载为成员函数,解释为:Obj.operatorop()操作数由对象Obj通过this指针隐含传递,参数只有一个可以省略。重载为友员函数,解释为:operatorop(Obj)操作数由参数表的参数Object提供。,例4.4有一个Time类,数据成员有时、分、秒。要求模拟秒表,每次走一秒,满60秒进位,秒又从零开始计数。满60分进位,分又从零开始计数。输出时、分和秒的值。,classTimepublic:Time()hour=0;minute=0;sec=0;Time(inth,intm,ints):hour(h),minute(m),sec(s)Timeoperator+();voiddisplay()cout=60)sec=sec-60;minute+;if(minute=60)minute=minute-60;hour+;hour=hour%24;Timetemp(*this);returntemp;,intmain()Timetime1(23,59,0);for(inti=0;i=60)minute=minute-60;hour+;hour=hour%24;Timetemp(*this);returntemp;,intmain()Timetime1(23,59,0);for(inti=0;i=60)minute=minute-60;hour+;hour=hour%24;returntemp;,intmain()Timetime1(21,34,59),time2;couttime1:;time1.display();time2=time1+;couttime2+:;time2.display();cout=60)minute=minute-60;hour+;hour=hour%24;returntemp;,intmain()Timetime1(21,34,59),time2;couttime1:;time1.display();time2=time1+;couttime2+:;time2.display();couty+;opl-z+;return*opl;,问题C+不知道如何激活该函数,下述代码无法编译:TriCoorob(1,2,3);/error,二义性对ob的地址进行递加?还是将对象ob递加?,6.2.2用友员函数重载算符,使用友员重载运算符的讨论,3.使用引用参数:TriCooroperator+(TriCoor,下述代码是正确的:TriCoorob(1,2,3);ob+;/ok,传名,注意:如果一个运算符的操作要修改类的对象的状态,要重载为友员函数时,应该使用引用参数。,6.2.2用友员函数重载算符,使用友员重载运算符的讨论,若一元运算符的操作需要修改类对象状态时,一般用成员函数重载;需要左值操作数的运算符(如+,-),若重载为友员函数时要用引用参数C+不能用友员重载的运算符:=()-如果运算符的操作数(尤其是第一个操作数)希望有隐式转换,则必须用友员函数重载,6.2.2用友员函数重载算符,#includeclassComplexpublic:Complex(doubler=0,doublei=0)Real=r;Image=i;Complex(inta)Real=a;Image=0;voidprint()const;friendComplexoperator+(constComplex,复数运算,6.2.2用友员函数重载算符,#includeclassComplexpublic:Complex(doubler=0,doublei=0)Real=r;Image=i;Complex(inta)Real=a;Image=0;voidprint()const;friendComplexoperator+(constComplex,friendComplexoperator+(constComplex,Complexoperator+(constComplex,构造返回对象,6.2.2用友员函数重载算符,复数运算,#includeclassComplexpublic:Complex(doubler=0,doublei=0)Real=r;Image=i;Complex(inta)Real=a;Image=0;voidprint()const;friendComplexoperator+(constComplex,friendComplexoperator-(constComplex,Complexoperator-(constComplex,6.2.2用友员函数重载算符,复数运算,#includeclassComplexpublic:Complex(doubler=0,doublei=0)Real=r;Image=i;Complex(inta)Real=a;Image=0;voidprint()const;friendComplexoperator+(constComplex,friendComplexoperator-(constComplex,Complexoperator-(constComplex,单目“-”运算,6.2.2用友员函数重载算符,复数运算,#includeclassComplexpublic:Complex(doubler=0,doublei=0)Real=r;Image=i;Complex(inta)Real=a;Image=0;voidprint()const;friendComplexoperator+(constComplex,voidprint()const;,voidComplex:print()constcout(Real,Image)endl;,成员函数,6.2.2用友员函数重载算符,复数运算,#includeclassComplexpublic:Complex(doubler=0,doublei=0)Real=r;Image=i;Complex(inta)Real=a;Image=0;voidprint()const;friendComplexoperator+(constComplex,voidmain()Complexc1(2.5,3.7),c2(4.2,6.5);Complexc;c=c1-c2;/operator-(c1,c2)c.print();c=25+c2;/operator+(25,c2)c.print();c=c2+25;/operator+(c2,52)c.print();c=-c1;/operator-(c1)c.print();,6.2.2用友员函数重载算符,复数运算,复数运算,#includ

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论