11-运算符重载

上传人:m**** 文档编号:569505401 上传时间:2024-07-30 格式:PPT 页数:93 大小:711KB
返回 下载 相关 举报
11-运算符重载_第1页
第1页 / 共93页
11-运算符重载_第2页
第2页 / 共93页
11-运算符重载_第3页
第3页 / 共93页
11-运算符重载_第4页
第4页 / 共93页
11-运算符重载_第5页
第5页 / 共93页
点击查看更多>>
资源描述

《11-运算符重载》由会员分享,可在线阅读,更多相关《11-运算符重载(93页珍藏版)》请在金锄头文库上搜索。

1、第第1111章章 运算符运算符重载重载 运算符重载使得用户定义的类以一种更简洁的方式工作运算符重载使得用户定义的类以一种更简洁的方式工作例如例如int x , y ;y = x + y ; matrix m1 , m2 ;/ 矩阵类对象矩阵类对象m1 = Madd ( m1 , m2 ) ;/ 调用函数计算两个矩阵的和调用函数计算两个矩阵的和complex c1 , c2 ; / 复数类对象复数类对象c1 = Cadd (c1 , c2 ) ;/ 调用函数计算两个复数的和调用函数计算两个复数的和能表示为能表示为c1 = c1 + c2 ; ?能表示为能表示为m1 = m1 + m2 ; ?第第

2、1111章章 运算符重载运算符重载11.1 11.1 11.1 11.1 运算符重载的基本方法运算符重载的基本方法运算符重载的基本方法运算符重载的基本方法 11.1.1 11.1.1 重载运算符的限制重载运算符的限制 可以重载的运算符可以重载的运算符可以重载的运算符可以重载的运算符 +-*/%&|!=+=-=*=/=%=&=|=!=&|+-*-()newdeletenewdelete 不能重载的算符不能重载的算符不能重载的算符不能重载的算符 .:.*?: 11.1 11.1 11.1 11.1 运算符重载的基本方法运算符重载的基本方法运算符重载的基本方法运算符重载的基本方法 11.1.1 11

3、.1.1 重载运算符的限制重载运算符的限制 重载运算符函数可以对运算符作出新的解释,但原有基本语义不变:不改变运算符的优先级不改变运算符的结合性不改变运算符所需要的操作数不能创建新的运算符11.1.2 11.1.2 运算符重载的语法形式运算符重载的语法形式运算符函数是一种特殊的成员函数或友员函数成员函数的语法形式为:类型类名:operatorop(参数表)/ 相对于该类定义的操作运算符函数是一种特殊的成员函数或友员函数成员函数的语法形式为:类型类名:operatorop(参数表)/ 相对于该类定义的操作11.1.2 11.1.2 运算符重载的语法形式运算符重载的语法形式函数返回类型函数返回类型

4、运算符函数是一种特殊的成员函数或友员函数成员函数的语法形式为:类型类名:operatorop(参数表)/ 相对于该类定义的操作11.1.2 11.1.2 运算符重载的语法形式运算符重载的语法形式重载该运算符的类重载该运算符的类 11.1.2 11.1.2 运算符重载的语法形式运算符重载的语法形式运算符函数是一种特殊的成员函数或友员函数成员函数的语法形式为:类型类名:operatoropop(参数表)/ 相对于该类定义的操作被重载的运算符被重载的运算符 11.1.2 11.1.2 运算符重载的语法形式运算符重载的语法形式关键字关键字 运算符函数是一种特殊的成员函数或友员函数成员函数的语法形式为:

5、类型类名:operatoroperatorop(参数表)/ 相对于该类定义的操作11.1.2 11.1.2 运算符重载的语法形式运算符重载的语法形式函数名函数名 运算符函数是一种特殊的成员函数或友员函数成员函数的语法形式为:类型类名:operatoroperatoropop(参数表)/ 相对于该类定义的操作运算符函数是一种特殊的成员函数或友员函数成员函数的语法形式为:类型类名:operatorop(参数表)/ 相对于该类定义的操作11.1.2 11.1.2 运算符重载的语法形式运算符重载的语法形式运算符要求的操作数运算符要求的操作数11.1.2 11.1.2 运算符重载的语法形式运算符重载的语

6、法形式一个运算符被重载后,原有意义没有失去,只是定义了相对一特定类的的不同操作。运算符函数是一种特殊的成员函数或友员函数成员函数的语法形式为:类型类名:operatorop(参数表)/ 相对于该类定义的操作#include#includeclassCalculatorpublic:Calculator()value=0;voidoperator+();voidoperator-();unsignedintoperator()();private:unsignedintvalue;voidmain()CalculatorCounter;inti;for(i=0;i5;i+)+Counter;co

7、utnCounter=Counter();for(i=0;i=5;i+)-Counter;coutnCounter=Counter();voidCalculator:operator+()if(value65535)value+;elsecoutnDataoverflow!0)value-;elsecoutnDataoverflow!endl;abort();unsignedintCalculator:operator()()returnvalue;例例 设计一个安全计数器设计一个安全计数器 11.1.2 运算符重载的语法形式#include#includeclassCalculatorpub

8、lic:Calculator()value=0;voidoperator+();voidoperator-();unsignedintoperator()();private:unsignedintvalue;voidmain()CalculatorCounter;inti;for(i=0;i5;i+)+Counter;coutnCounter=Counter();for(i=0;i=5;i+)-Counter;coutnCounter=Counter();voidCalculator:operator+()if(value65535)value+;elsecoutnDataoverflow!

9、0)value-;elsecoutnDataoverflow!endl;abort();unsignedintCalculator:operator()()returnvalue;重载了重载了重载了重载了3 3个算符个算符个算符个算符11.1.2 运算符重载的语法形式例例 设计一个安全计数器设计一个安全计数器 classCalculatorpublic:Calculator()value=0;voidoperator +operator +();voidoperator -operator -();unsignedintoperator()operator() ();private:unsig

10、nedintvalue;voidmain()CalculatorCounter;inti;for(i=0;i5;i+)+Counter;coutnCounter=Counter();for(i=0;i=5;i+)-Counter;coutnCounter=Counter();void Calculator:operator + ()void Calculator:operator + () if ( value 65535 ) value + ; if ( value 65535 ) value + ; else else coutcout nDatanData overflow overfl

11、ow ! ! 0)value-;if(value0)value-;elseelsecoutcoutnDataoverflow!nDataoverflow!endlendl; ;abort();abort(); unsignedunsignedintintCalculator:operator()Calculator:operator()() ()returnvalue;returnvalue;重载了重载了重载了重载了3 3个算符个算符个算符个算符11.1.2 运算符重载的语法形式例例 设计一个安全计数器设计一个安全计数器 #include#includeclassCalculatorpubli

12、c:Calculator()value=0;voidoperator +operator +();voidoperator-();unsignedintoperator() ();private:unsignedintvalue;voidmain()CalculatorCounter;inti;for(i=0;i5;i+)+Counter;coutnCounter=Counter();for(i=0;i=5;i+)-Counter;coutnCounter=Counter();void Calculator:operator + ()void Calculator:operator + ()

13、if ( value 65535 ) value + ; if ( value 65535 ) value + ; else else coutcout nDatanData overflow ! overflow ! 0)value-;elsecoutnDataoverflow!endl;abort();unsignedintCalculator:operator()()returnvalue;11.1.2 运算符重载的语法形式例例 设计一个安全计数器设计一个安全计数器 #include#includeclassCalculatorpublic:Calculator()value=0;voi

14、doperator +operator +();voidoperator-();unsignedintoperator() ();private:unsignedintvalue;voidmain()CalculatorCounter;inti;for(i=0;i5;i+)+Counter;coutnCounter=Counter();for(i=0;i=5;i+)-Counter;coutnCounter=Counter();void Calculator:operator + ()void Calculator:operator + () if ( value 65535 ) value

15、+ ; if ( value 65535 ) value + ; else else coutcout nDatanData overflow ! overflow ! 0)value-;elsecoutnDataoverflow!endl;abort();unsignedintCalculator:operator()()returnvalue;使用使用系统预定义版本系统预定义版本11.1.2 运算符重载的语法形式例例 设计一个安全计数器设计一个安全计数器 #include#includeclassCalculatorpublic:Calculator()value=0;voidoperat

16、or+();voidoperator -operator -();unsignedintoperator() ();private:unsignedintvalue;voidmain()CalculatorCounter;inti;for(i=0;i5;i+)+Counter;coutnCounter=Counter();for(i=0;i=5;i+)-Counter;coutnCounter=Counter();voidCalculator:operator+()if(value65535)value+;elsecoutnDataoverflow!0)value-;if(value0)val

17、ue-;elseelsecoutcoutnDataoverflow!nDataoverflow!endlendl; ;abort();abort(); unsignedintCalculator:operator()()returnvalue;11.1.2 运算符重载的语法形式例例 设计一个安全计数器设计一个安全计数器 #include#includeclassCalculatorpublic:Calculator()value=0;voidoperator+();voidoperator -operator -();unsignedintoperator() ();private:unsig

18、nedintvalue;voidmain()CalculatorCounter;inti;for(i=0;i5;i+)+Counter;coutnCounter=Counter();for(i=0;i=5;i+)-Counter;coutnCounter=Counter();voidCalculator:operator+()if(value65535)value+;elsecoutnDataoverflow!0)value-;if(value0)value-;elseelsecoutcoutnDataoverflow!nDataoverflow!endlendl; ;abort();abor

19、t(); unsignedintCalculator:operator()()returnvalue;使用使用系统预定义版本系统预定义版本11.1.2 运算符重载的语法形式例例 设计一个安全计数器设计一个安全计数器 #include#includeclassCalculatorpublic:Calculator()value=0;voidoperator+();voidoperator-();unsignedintoperator() ();private:unsignedintvalue;voidmain()CalculatorCounter;inti;for(i=0;i5;i+)+Coun

20、ter;coutnCounter=Counter();for(i=0;i=5;i+)-Counter;coutnCounter=Counter();voidCalculator:operator+()if(value65535)value+;elsecoutnDataoverflow!0)value-;elsecoutnDataoverflow!endl;abort();unsignedintCalculator:operator()()returnvalue;调用重载版本调用重载版本11.1.2 运算符重载的语法形式例例 设计一个安全计数器设计一个安全计数器 #include#include

21、classCalculatorpublic:Calculator()value=0;voidoperator+();voidoperator-();unsignedintoperator() ();private:unsignedintvalue;voidmain()CalculatorCounter;inti;for(i=0;i5;i+)+Counter;coutnCounter=Counter();for(i=0;i=5;i+)-Counter;coutnCounter=Counter();void Calculator:operator + () if ( value 65535 ) v

22、alue + ; else cout nData overflow ! 0)value-;elsecoutnDataoverflow!endl;abort();unsignedintCalculator:operator()()returnvalue;调用重载版本调用重载版本11.1.2 运算符重载的语法形式例例 设计一个安全计数器设计一个安全计数器 #include#includeclassCalculatorpublic:Calculator()value=0;voidoperator+();voidoperator-();unsignedintoperator() ();private:

23、unsignedintvalue;voidmain()CalculatorCounter;inti;for(i=0;i5;i+)+Counter;coutnCounter=Counter();for(i=0;i=5;i+)-Counter;coutnCounter=Counter();void Calculator:operator + () if ( value 65535 ) value + ; else cout nData overflow ! 0)value-;elsecoutnDataoverflow!endl;abort();unsignedintCalculator:opera

24、tor()()returnvalue;调用重载版本调用重载版本11.1.2 运算符重载的语法形式例例 设计一个安全计数器设计一个安全计数器 #include#includeclassCalculatorpublic:Calculator()value=0;voidoperator+();voidoperator-();unsignedintoperator() ();private:unsignedintvalue;voidmain()CalculatorCounter;inti;for(i=0;i5;i+)+Counter;coutnCounter=Counter();for(i=0;i=5

25、;i+)-Counter;coutnCounter=Counter();voidCalculator:operator+()if(value65535)value+;elsecoutnDataoverflow!0)value-;elsecoutnDataoverflow!endl;abort();unsignedintCalculator:operator()()returnvalue;调用重载版本调用重载版本11.1.2 运算符重载的语法形式例例 设计一个安全计数器设计一个安全计数器 #include#includeclassCalculatorpublic:Calculator()valu

26、e=0;voidoperator+();voidoperator-();unsignedintoperator() ();private:unsignedintvalue;voidmain()CalculatorCounter;inti;for(i=0;i5;i+)+Counter;coutnCounter=Counter();for(i=0;i=5;i+)-Counter;coutnCounter=Counter();voidCalculator:operator+()if(value65535)value+;elsecoutnDataoverflow! 0 ) value - ; else

27、 cout n Data overflow ! endl ; abort() ; unsignedintCalculator:operator()()returnvalue;调用重载版本调用重载版本11.1.2 运算符重载的语法形式例例 设计一个安全计数器设计一个安全计数器 #include#includeclassCalculatorpublic:Calculator()value=0;voidoperator+();voidoperator-();unsignedintoperator() ();private:unsignedintvalue;voidmain()CalculatorCo

28、unter;inti;for(i=0;i5;i+)+Counter;coutnCounter=Counter();for(i=0;i=5;i+)-Counter;coutnCounter=Counter();voidCalculator:operator+()if(value65535)value+;elsecoutnDataoverflow! 0 ) value - ; else cout n Data overflow ! endl ; abort() ; unsignedintCalculator:operator()()returnvalue;调用重载版本调用重载版本11.1.2 运算

29、符重载的语法形式例例 设计一个安全计数器设计一个安全计数器 #include#includeclassCalculatorpublic:Calculator()value=0;voidoperator+();voidoperator-();unsignedintoperator() ();private:unsignedintvalue;voidmain()CalculatorCounter;inti;for(i=0;i5;i+)+Counter;coutnCounter=Counter();for(i=0;i=5;i+)-Counter;coutnCounter=Counter();void

30、Calculator:operator+()if(value65535)value+;elsecoutnDataoverflow!0)value-;elsecoutnDataoverflow!endl;abort();unsignedintCalculator:operator()()returnvalue;调用重载版本调用重载版本11.1.2 运算符重载的语法形式例例 设计一个安全计数器设计一个安全计数器 #include#includeclassCalculatorpublic:Calculator()value=0;voidoperator+();voidoperator-();unsi

31、gnedintoperator() ();private:unsignedintvalue;voidmain()CalculatorCounter;inti;for(i=0;i5;i+)+Counter;coutnCounter=Counter();for(i=0;i=5;i+)-Counter;coutnCounter=Counter();voidCalculator:operator+()if(value65535)value+;elsecoutnDataoverflow!0)value-;elsecoutnDataoverflow!endl;abort();unsigned int Ca

32、lculator:operator() () return value ; 被重载的运算符被重载的运算符11.1.2 运算符重载的语法形式例例 设计一个安全计数器设计一个安全计数器 #include#includeclassCalculatorpublic:Calculator()value=0;voidoperator+();voidoperator-();unsignedintoperator() ();private:unsignedintvalue;voidmain()CalculatorCounter;inti;for(i=0;i5;i+)+Counter;coutnCounter=

33、Counter();for(i=0;i=5;i+)-Counter;coutnCounter=Counter();voidCalculator:operator+()if(value65535)value+;elsecoutnDataoverflow!0)value-;elsecoutnDataoverflow!endl;abort();unsigned int Calculator:operator() () return value ; 函数参数表函数参数表11.1.2 运算符重载的语法形式例例 设计一个安全计数器设计一个安全计数器 #include#includeclassCalcula

34、torpublic:Calculator()value=0;voidoperator+();voidoperator-();unsignedintoperator() ();private:unsignedintvalue;voidmain()CalculatorCounter;inti;for(i=0;i5;i+)+Counter;coutnCounter=Counter();for(i=0;i=5;i+)-Counter;coutnCounter=Counter();voidCalculator:operator+()if(value65535)value+;elsecoutnDataov

35、erflow!0)value-;elsecoutnDataoverflow!endl;abort();unsignedintCalculator:operator()()returnvalue;11.1.2 运算符重载的语法形式例例 设计一个安全计数器设计一个安全计数器 #include#includeclassCalculatorpublic:Calculator()value=0;voidoperator+();voidoperator-();unsignedintoperator() ();private:unsignedintvalue;voidmain()CalculatorCoun

36、ter;inti;for(i=0;i5;i+)+Counter;coutnCounter=Counter();for(i=0;i = 5i = 5;i+)-Counter;coutnCounter=Counter();voidCalculator:operator+()if(value65535)value+;elsecoutnDataoverflow!0)value-;elsecoutnDataoverflow!endl;abort()abort();unsignedintCalculator:operator()()returnvalue;11.1.2 运算符重载的语法形式例例 设计一个安

37、全计数器设计一个安全计数器 #include#includeclassCalculatorpublic:Calculator()value=0;voidoperator+();voidoperator-();unsignedintoperator() ();private:unsignedintvalue;voidmain()CalculatorCounter;inti;for(i=0;i5;i+)+Counter;coutnCounter=Counter();for(i=0;i=5;i+)-Counter;coutnCounter=Counter();voidCalculator:opera

38、tor+()if(value65535)value+;elsecoutnDataoverflow!0)value-;elsecoutnDataoverflow!endl;abort();unsignedintCalculator:operator()()returnvalue;11.1.2 运算符重载的语法形式例例 设计一个安全计数器设计一个安全计数器 运算符函数可以重载为成员函数或友员函数 关键区别在于成员函数具有 this 指针,友员函数没有this指针 不管是成员函数还是友员函数重载,运算符的使用方法相同。但传递参数的方式不同,实现代码不同,应用场合也不同 11.2 11.2 11.2

39、11.2 用成员或友员函数重载运算符用成员或友员函数重载运算符用成员或友员函数重载运算符用成员或友员函数重载运算符 重载为成员函数,解释为:Object.operator op ()操作数由对象Object通过this指针隐含传递重载为友员函数,解释为:operator op (Object)操作数由参数表的参数Object提供11.2 11.2 11.2 11.2 用成员或友员函数重载运算符用成员或友员函数重载运算符用成员或友员函数重载运算符用成员或友员函数重载运算符 1 1一元运算符Objectop或opObject重载为成员函数,解释为:ObjectL.operator op (Obje

40、ctR)左操作数由ObjectL通过this指针传递,右操作数由参数ObjectR传递重载为友员函数,解释为:operator op (ObjectL,ObjectR) 左右操作数都由参数传递11.2 11.2 11.2 11.2 用成员或友员函数重载运算符用成员或友员函数重载运算符用成员或友员函数重载运算符用成员或友员函数重载运算符 2 2二元运算符ObjectLopObjectR 当一元运算符的操作数,或者二元运算符的左操作数 是对象时,定义重载算符函数为成员函数 11.2.1 11.2.1 用成员函数重载运算符用成员函数重载运算符11.2.1用成员函数重载算符例例11-211-2建立一个

41、描述建立一个描述3 3维坐坐标的的类 Tri_CoorTri_Coor,重,重载运运算符算符 “ “+”+”、“+”+”、和、和 “ “=” =” ,实现简单的算的算术运算运算 11.2.1 11.2.1 用成员函数重载用成员函数重载运运算符算符11.2.1用成员函数重载算符#includeclassTriCoorpublic:TriCoor(intmx=0,intmy=0,intmz=0)x=mx;y=my;z=mz;TriCooroperator+(TriCoort)TriCoortemp;temp.x=x+t.x;temp.y=y+t.y;temp.z=z+t.z;returntemp;

42、TriCooroperator=(TriCoort)x=t.x;y=t.y;z=t.z;return*this;TriCooroperator+()x+;y+;z+;return*this;voidshow()coutx,y,zn;voidassign(intmx,intmy,intmz)x=mx;y=my;z=mz;private:intx,y,z;/ 3_d coordinates;voidmain()TriCoora(1,2,3),b,c;a.show();b.show();c.show();for(inti=0;i5;i+)+b;b.show();c.assign(3,3,3);c=a

43、+b+c;c.show();c=b=a;c.show();11.2.1用成员函数重载算符例例11-211-2#includeclassTriCoorpublic:TriCoor(intmx=0,intmy=0,intmz=0)x=mx;y=my;z=mz;TriCoor operator + ( TriCoor t ) TriCoor temp ; temp.x = x+t.x ; temp.y = y+t.y ; temp.z = z+t.z ; return temp ; TriCooroperator=(TriCoort)x=t.x;y=t.y;z=t.z;return*this;Tri

44、Cooroperator+()x+;y+;z+;return*this;voidshow()coutx,y,zn;voidassign(intmx,intmy,intmz)x=mx;y=my;z=mz;private:intx,y,z;/ 3_d coordinates;voidmain()TriCoora(1,2,3),b,c;a.show();b.show();c.show();for(inti=0;i5;i+)+b;b.show();c.assign(3,3,3);c = a + b + c;c.show();c=b=a;c.show(); a + b a.operator + (b)

45、Object1通过匿名对象通过匿名对象Object1返回运算结果返回运算结果11.2.1用成员函数重载算符例例11-211-2#includeclassTriCoorpublic:TriCoor(intmx=0,intmy=0,intmz=0)x=mx;y=my;z=mz;TriCoor operator + ( TriCoor t ) TriCoor temp ; temp.x = x+t.x ; temp.y = y+t.y ; temp.z = z+t.z ; return temp ; TriCooroperator=(TriCoort)x=t.x;y=t.y;z=t.z;return

46、*this;TriCooroperator+()x+;y+;z+;return*this;voidshow()coutx,y,zn;voidassign(intmx,intmy,intmz)x=mx;y=my;z=mz;private:intx,y,z;/ 3_d coordinates;voidmain()TriCoora(1,2,3),b,c;a.show();b.show();c.show();for(inti=0;i5;i+)+b;b.show();c.assign(3,3,3);c = a + b + c;c.show();c=b=a;c.show(); a+ba.operator+

47、(b) Object1a + b+ cObject1 + c Object1.operator + (c)通过匿名对象通过匿名对象Object2返回运算结果返回运算结果 Object211.2.1用成员函数重载算符例例11-211-2#includeclassTriCoorpublic:TriCoor(intmx=0,intmy=0,intmz=0)x=mx;y=my;z=mz;TriCoor operator + ( TriCoor t ) TriCoor temp ; temp.x = x+t.x ; temp.y = y+t.y ; temp.z = z+t.z ; return tem

48、p ; TriCooroperator=(TriCoort)x=t.x;y=t.y;z=t.z;return*this;TriCooroperator+()x+;y+;z+;return*this;voidshow()coutx,y,zn;voidassign(intmx,intmy,intmz)x=mx;y=my;z=mz;private:intx,y,z;/ 3_d coordinates;voidmain()TriCoora(1,2,3),b,c;a.show();b.show();c.show();for(inti=0;i5;i+)+b;b.show();c.assign(3,3,3)

49、;c = a + b + c;c.show();c=b=a;c.show(); a+ba.operator+(b) Object1a + b+ cObject1 + cObject1.operator+(c) Object2c =a + b + c;c =Object2;11.2.1用成员函数重载算符例例11-211-2#includeclassTriCoorpublic:TriCoor(intmx=0,intmy=0,intmz=0)x=mx;y=my;z=mz;TriCooroperator+(TriCoort)TriCoortemp;temp.x=x+t.x;temp.y=y+t.y;t

50、emp.z=z+t.z;returntemp;TriCoor operator = ( TriCoor t ) x = t.x ; y = t.y ; z = t.z ; return * this ; TriCooroperator+()x+;y+;z+;return*this;voidshow()coutx,y,zn;voidassign(intmx,intmy,intmz)x=mx;y=my;z=mz;private:intx,y,z;/ 3_d coordinates;voidmain()TriCoora(1,2,3),b,c;a.show();b.show();c.show();fo

51、r(inti=0;i5;i+)+b;b.show();c.assign(3,3,3);c = a + b + c;c.show(); c = b = a ;c.show();b = a b.operator = (a) c = b c.operator = (b)返回调用函数的对象返回调用函数的对象 11.2.1用成员函数重载算符例例11-211-2#includeclassTriCoorpublic:TriCoor(intmx=0,intmy=0,intmz=0)x=mx;y=my;z=mz;TriCooroperator+(TriCoort)TriCoortemp;temp.x=x+t.x

52、;temp.y=y+t.y;temp.z=z+t.z;returntemp;TriCooroperator=(TriCoort)x=t.x;y=t.y;z=t.z;return*this;TriCoor operator + () x + ; y + ; z + ; return *this ; voidshow()coutx,y,zn;voidassign(intmx,intmy,intmz)x=mx;y=my;z=mz;private:intx,y,z;/ 3_d coordinates;voidmain()TriCoora(1,2,3),b,c;a.show();b.show();c.s

53、how();for(inti=0;i5;i+)+ b;b.show();c.assign(3,3,3);c = a + b + c;c.show(); c=b=a;c.show(); + b b.operator + ()没有参数没有参数11.2.1用成员函数重载算符例例11-211-2#includeclassTriCoorpublic:TriCoor(intmx=0,intmy=0,intmz=0)x=mx;y=my;z=mz;TriCooroperator+(TriCoort)TriCoortemp;temp.x=x+t.x;temp.y=y+t.y;temp.z=z+t.z;retur

54、ntemp;TriCoor operator = ( TriCoor t ) x = t.x ; y = t.y ; z = t.z ; return * this ; TriCooroperator+()x+;y+;z+;return*this;voidshow()coutx,y,zn;void assign( int mx, int my, int mz ) x = mx; y = my; z = mz; private:intx,y,z;/ 3_d coordinates;voidmain()TriCoora(1,2,3),b,c;a.show();b.show();c.show();f

55、or(inti=0;i 11.2.2用友员函数重载算符class Complex public: Complex( double r =0, double i =0 ) Real = r ; Image = i ; Complex(int a) Real = a ; Image = 0 ; void print() const ; friend Complex operator+ ( const Complex & c1, const Complex & c2 ) ; friend Complex operator- ( const Complex & c1, const Complex &

56、c2 ) ; friend Complex operator- ( const Complex & c ) ; private: double Real, Image ;Complex operator + ( const Complex & c1, const Complex & c2 ) double r = c1.Real + c2.Real ; double i = c1.Image+c2.Image ; return Complex ( r, i ) ; Complex operator - ( const Complex & c1, const Complex & c2 ) dou

57、ble r = c1.Real - c2.Real ; double i = c1.Image - c2.Image ; return Complex ( r, i ) ; Complex operator- ( const Complex & c ) return Complex ( -c.Real, - c.Image ) ; void Complex : print() const cout ( Real , Image ) endl ; 例例11-3 11-3 复数运算复数运算 11.2.2用友员函数重载算符#includeclassComplexpublic:Complex(doub

58、ler=0,doublei=0)Real=r;Image=i;Complex(inta)Real=a;Image=0;voidprint()const;friend Complex operator+ ( const Complex & c1, const Complex & c2 ) ;friendComplexoperator-(constComplex&c1,constComplex&c2);friendComplexoperator-(constComplex&c);private:doubleReal,Image;Complex operator + ( const Complex

59、& c1, const Complex & c2 ) double r = c1.Real + c2.Real ; double i = c1.Image+c2.Image ; return Complex ( r, i ) ; Complexoperator-(constComplex&c1,constComplex&c2)doubler=c1.Real-c2.Real;doublei=c1.Image-c2.Image;returnComplex(r,i);Complexoperator-(constComplex&c)returnComplex(-c.Real,-c.Image);voi

60、dComplex:print()constcout(Real,Image)endl;friend Complex operator+ ( const Complex & c1, const Complex & c2 ) ;Complex operator + ( const Complex & c1, const Complex & c2 ) double r = c1.Real + c2.Real ; double i = c1.Image+c2.Image ; return Complex ( r, i ) ; 构造返回对象构造返回对象11.2.2用友员函数重载算符例例11-3 11-3

61、复数运算复数运算 #includeclassComplexpublic:Complex(doubler=0,doublei=0)Real=r;Image=i;Complex(inta)Real=a;Image=0;voidprint()const;friendComplexoperator+(constComplex&c1,constComplex&c2);friend Complex operator- ( const Complex & c1, const Complex & c2 ) ;friendComplexoperator-(constComplex&c);private:doub

62、leReal,Image;Complexoperator+(constComplex&c1,constComplex&c2)doubler=c1.Real+c2.Real;doublei=c1.Image+c2.Image;returnComplex(r,i);Complex operator - ( const Complex & c1, const Complex & c2 ) double r = c1.Real - c2.Real ; double i = c1.Image - c2.Image ; return Complex ( r, i ) ; Complexoperator-(

63、constComplex&c)returnComplex(-c.Real,-c.Image);voidComplex:print()constcout(Real,Image)endl;friend Complex operator- ( const Complex & c1, const Complex & c2 ) ;Complex operator - ( const Complex & c1, const Complex & c2 ) double r = c1.Real - c2.Real ; double i = c1.Image - c2.Image ; return Comple

64、x ( r, i ) ; 11.2.2用友员函数重载算符例例11-3 11-3 复数运算复数运算 #includeclassComplexpublic:Complex(doubler=0,doublei=0)Real=r;Image=i;Complex(inta)Real=a;Image=0;voidprint()const;friendComplexoperator+(constComplex&c1,constComplex&c2);friendComplexoperator-(constComplex&c1,constComplex&c2);friendComplexoperator-(c

65、onstComplex&c);private:doubleReal,Image;Complexoperator+(constComplex&c1,constComplex&c2)doubler=c1.Real+c2.Real;doublei=c1.Image+c2.Image;returnComplex(r,i);Complexoperator-(constComplex&c1,constComplex&c2)doubler=c1.Real-c2.Real;doublei=c1.Image-c2.Image;returnComplex(r,i);Complexoperator-(constCo

66、mplex&c)returnComplex(-c.Real,-c.Image);voidComplex:print()constcout(Real,Image)endl;11.2.2用友员函数重载算符例例11-3 11-3 复数运算复数运算 例例11-3 11-3 复数运算复数运算 #includeclassComplexpublic:Complex(doubler=0,doublei=0)Real=r;Image=i;Complex(int a) Real = a ; Image = 0 ; voidprint()const;friendComplexoperator+(constCompl

67、ex&c1,constComplex&c2);friendComplexoperator-(constComplex&c1,constComplex&c2);friendComplexoperator-(constComplex&c);private:doubleReal,Image;Complexoperator+(const Complex & c1,constComplex&c2)doubler=c1.Real+c2.Real;doublei=c1.Image+c2.Image;returnComplex(r,i);Complexoperator-(constComplex&c1,con

68、stComplex&c2)doubler=c1.Real-c2.Real;doublei=c1.Image-c2.Image;returnComplex(r,i);Complexoperator-(constComplex&c)returnComplex(-c.Real,-c.Image);voidComplex:print()constcout(Real,Image)endl;把整型常数把整型常数25转换成转换成复数对象(复数对象(25,0)11.2.2用友员函数重载算符#includeclassComplexpublic:Complex(doubler=0,doublei=0)Real=r

69、;Image=i;Complex(inta)Real=a;Image=0;voidprint()const;friendComplexoperator+(constComplex&c1,constComplex&c2);friendComplexoperator-(constComplex&c1,constComplex&c2);friendComplexoperator-(constComplex&c);private:doubleReal,Image;Complexoperator+(constComplex&c1,constComplex&c2)doubler=c1.Real+c2.Re

70、al;doublei=c1.Image+c2.Image;returnComplex(r,i);Complexoperator-(constComplex&c1,constComplex&c2)doubler=c1.Real-c2.Real;doublei=c1.Image-c2.Image;returnComplex(r,i);Complexoperator-(constComplex&c)returnComplex(-c.Real,-c.Image);voidComplex:print()constcout(Real,Image) x + ; opl - y + ; opl - z + ;

71、 return *opl ; 问题参数无法传递,下述代码无法编译: TriCoor ob ( 1 , 2 , 3 ) ;&ob + ;/ error二义性二义性对对 ob 的地址进行递加?的地址进行递加?还是还是将对象将对象 ob 递加?递加?11.2.2用友员函数重载算符使用友员重载运算符的讨论使用友员重载运算符的讨论使用友员重载运算符的讨论使用友员重载运算符的讨论 3. 使用引用参数: TriCoor operator + ( TriCoor & & oplopl ) opl . x +; opl . y +; opl . z +; return opl ; 下述代码是正确的: TriCo

72、or ob ( 1 , 2 , 3 ) ; ob +;ob +;/ ok,传名 如果一个运算符的操作要修改类的对象的状态,要重载为友员函数时,应该使用引用参数。11.2.2用友员函数重载算符11.3 11.3 11.3 11.3 运算符重载的例子运算符重载的例子运算符重载的例子运算符重载的例子( ( ( (矩阵运算类矩阵运算类矩阵运算类矩阵运算类) ) ) ) 重载矩阵类的加、减、乘、求负、转置(!)操作、赋值、重载矩阵类的输入和输出操作11.3几个典型运算符重载11.3 11.3 运算符重载的例子运算符重载的例子运算符重载的例子运算符重载的例子( (矩阵运算类矩阵运算类矩阵运算类矩阵运算类)

73、 )istream 和和 ostream 是是 C+ 的预定义流类的预定义流类cin 是是 istream 的对象,的对象,cout 是是 ostream 的对象的对象运算符运算符 由由 istream 重载为提取操作,用于输入重载为提取操作,用于输入基本类型数据基本类型数据用友员函数重载用友员函数重载 ,输出和输入用户自定义的数,输出和输入用户自定义的数据类型据类型friendostream&operator (istream&input,vector&);11.3 11.3 运算符重载的例子运算符重载的例子运算符重载的例子运算符重载的例子( (矩阵运算类矩阵运算类矩阵运算类矩阵运算类) )

74、classMatrixpublic:/两参数构造函数Matrix(intr,intc):rows(r),cols(c)mem=newintrows*cols;if(mem=NULL)throwWrongmem();/四参数构造函数Matrix(intr,intc,int*data,intsize=0):rows(r),cols(c)mem=newintrows*cols;if(mem=NULL)throwWrongmem();for(inti=0;i和输出friendostream&operator(istream&in,Matrix&x);矩阵类定义11.3 11.3 运算符重载的例子运算符

75、重载的例子运算符重载的例子运算符重载的例子( (矩阵运算类矩阵运算类矩阵运算类矩阵运算类) )/析构函数Matrix()deletemem;intsetrows()constreturnrows;intsetcols()constreturncols;/修改矩阵voidsetMatrix(int*data,intsize);voidsetMatrix(int*data);private:int*mem;constintrows,cols;矩阵类定义要求写出操作+、-、*、-(求负)和!(转置)的代码11.3 11.3 运算符重载的例子运算符重载的例子运算符重载的例子运算符重载的例子( (矩阵运

76、算类矩阵运算类矩阵运算类矩阵运算类) )/重载附值运算符=MatrixMatrix:operator=(Matrix&x)if(rows!=x.rows|cols!=x.cols)throwDiffer();if(this!=&x)deletemem;mem=newintrows*cols;if(mem=NULL)throwWrongmem();elsefor(inti=0;ix.rows*x.cols;i+)memi=x.memi;return*this;11.3 11.3 运算符重载的例子运算符重载的例子运算符重载的例子运算符重载的例子( (矩阵运算类矩阵运算类矩阵运算类矩阵运算类) )/

77、重载+MatrixMatrix:operator+(constMatrix&x)inti;if(rows!=x.rows|cols!=x.cols)throwDiffer();Matrixtemp(*this);if(rows=x.rows&cols=x.cols)for(i=0;irows*cols;i+)temp.memi=memi+x.memi;returntemp;elsethrowDiffer();11.3 11.3 运算符重载的例子运算符重载的例子运算符重载的例子运算符重载的例子( (矩阵运算类矩阵运算类矩阵运算类矩阵运算类) )/重载-MatrixMatrix:operator-

78、(constMatrix&x)inti;if(rows!=x.rows|cols!=x.cols)throwDiffer();Matrixtemp(*this);if(rows=x.rows&cols=x.cols)for(i=0;irows*cols;i+)temp.memi=memi-x.memi;returntemp;elsethrowDiffer();11.3 11.3 运算符重载的例子运算符重载的例子运算符重载的例子运算符重载的例子( (矩阵运算类矩阵运算类矩阵运算类矩阵运算类) )/重载矩阵乘法运算符*MatrixMatrix:operator*(constMatrix&x)if(

79、cols!=x.rows)throwDiffer();Matrixtemp(rows,x.cols);for(inti=0;irows;i+)for(intj=0;jx.cols;j+)temp(i,j)=0;for(intk=0;kx.rows;k+)temp(i,j)+=memi*cols+k*x.memk*x.cols+j;returntemp;11.3 11.3 运算符重载的例子运算符重载的例子运算符重载的例子运算符重载的例子( (矩阵运算类矩阵运算类矩阵运算类矩阵运算类) )/重载求负-MatrixMatrix:operator-()Matrixtemp(*this);for(int

80、i=0;irows*cols;i+)temp.memi=(-1)*memi;returntemp;/重载转置!MatrixMatrix:operator!()Matrixtemp(cols,rows);for(inti=0;icols;i+)for(intj=0;j(istream&in,Matrix&x)for(inti=0;ix.setrows();i+)for(intj=0;jx(i,j);returnin;/重载输出ostream&operator(ostream&out,Matrix&x)for(inti=0;ix.setrows();i+)for(intj=0;jx.setcols

81、();j+)outx(i,j);outendl;returnout;类类型也可以和其他数据类型相互转换,称为类类型转换。类类型转换有两种方式说明:构造函数转换函数11.4 11.4 11.4 11.4 类类型转换类类型转换类类型转换类类型转换( ( ( (扩展知识扩展知识扩展知识扩展知识) ) ) )11.4类类型转换11.4.1 11.4.1 构造函数进行类类型转换构造函数进行类类型转换当类ClassX具有以下形式的构造函数:ClassX:ClassX(arg,arg1=E1 ,,argn = En );申明了一种从参数arg的类型到该类类型的转换11.4.1构造函数进行类类型转换11.4.

82、1 11.4.1 构造函数进行类类型转换构造函数进行类类型转换classX/public:X(int);X(constchar*,int=0);voidf(Xarg);:Xa=X(1);/ a = 1Xb=Jessie;/ b = X ( Jessie , 0 )a=2;/ a = X ( 2 )f(3);/ f ( X ( 3 ) )f ( 10 , 20 ) ;/ error例如例如11.4.1构造函数进行类类型转换11.4.1 11.4.1 构造函数进行类类型转换构造函数进行类类型转换classX/public:X ( int ) ;X(constchar*,int=0);voidf(X

83、arg);: X a = X( 1 ) ;/ a = 1Xb=Jessie;/ b = X ( Jessie , 0 )a=2;/ a = X ( 2 )f(3);/ f ( X ( 3 ) )f ( 10 , 20 ) ;/ error例如例如调用构造函数调用构造函数 X ( int ) 把把 1 转换为类类型转换为类类型 X 后赋给对象后赋给对象 a也称也称 X ( 1 ) 为为 X 类的类型常量类的类型常量11.4.1构造函数进行类类型转换11.4.1 11.4.1 构造函数进行类类型转换构造函数进行类类型转换classX/public:X(int);X ( const char * ,

84、 int = 0 ) ;voidf(Xarg);:Xa=X(1);/ a = 1 X b = Jessie ;/ b = X ( Jessie , 0 )a=2;/ a = X ( 2 )f(3);/ f ( X ( 3 ) )f ( 10 , 20 ) ;/ error例如例如调用构造函数调用构造函数X ( const char * , int = 0 ) 把字符串转换为类类型把字符串转换为类类型 X 后赋给对象后赋给对象 b11.4.1构造函数进行类类型转换11.4.1 11.4.1 构造函数进行类类型转换构造函数进行类类型转换classX/public:X ( int ) ;X(cons

85、tchar*,int=0);voidf(Xarg);:Xa=X(1);/ a = 1Xb=Jessie;/ b = X ( Jessie , 0 )a = 2 ;/ a = X ( 2 )f(3);/ f ( X ( 3 ) )f ( 10 , 20 ) ;/ error例如例如隐式调用构造函数隐式调用构造函数 X ( int ) 把把 2 转换为类类型转换为类类型 X 后赋给对象后赋给对象11.4.1构造函数进行类类型转换11.4.1 11.4.1 构造函数进行类类型转换构造函数进行类类型转换classX/public:X ( int ) ;X(constchar*,int=0);void

86、f ( X arg ) ;:Xa=X(1);/ a = 1Xb=Jessie;/ b = X ( Jessie , 0 )a=2;/ a = X ( 2 )f ( 3 ) ;/ f ( X ( 3 ) )f ( 10 , 20 ) ;/ error例如例如隐式调用构造函数隐式调用构造函数 X ( int ) 对实参作类类型转换,然后做参数结合对实参作类类型转换,然后做参数结合11.4.1构造函数进行类类型转换11.4.1 11.4.1 构造函数进行类类型转换构造函数进行类类型转换classX/public:X(int);X(constchar*,int=0);voidf(Xarg);:Xa=X

87、(1);/ a = 1Xb=Jessie;/ b = X ( Jessie , 0 )a=2;/ a = X ( 2 )f(3);/ f ( X ( 3 ) )f ( 10 , 20 ) ;/ error例如例如当找不到匹配的构造函数时当找不到匹配的构造函数时转换转换失败失败11.4.1构造函数进行类类型转换11.4.1 11.4.1 构造函数进行类类型转换构造函数进行类类型转换classX/public:X(int);X(constchar*,int=0);voidf(Xarg);:X a = X( 1 ) ;/ a = 1X b = Jessie ;/ b = X ( Jessie , 0

88、 )a = 2 ;/ a = X ( 2 )f ( 3 ) ;/ f ( X ( 3 ) )f ( 10 , 20 ) ;/ error例如例如这样的隐式类型转换这样的隐式类型转换由系统自动完成由系统自动完成11.4.1构造函数进行类类型转换11.4.2 11.4.2 类型型转换函数函数 带参数的构造函数不能把一个类类型转换成基本类型 类类型转换函数是一种特殊的成员函数,提供类对象之间显式类型转换的机制11.4.2类类型转换函数11.4.2 11.4.2 类型型转换函数函数 语法形式:X : operator T ( ) return T 类型的对象 功能:将类型 X 的对象转换为类型 T 的

89、对象 T 可以是预定义类型,也可以是用户定义类型 函数没有参数,没有返回类型,但必须有一条 return 语句,返回T 类型的对象 该函数只能为成员函数,不能为友员11.4.2类类型转换函数11.4.2 11.4.2 类型型转换函数函数 例如:classXpublic:operatorint();voidf(Xa)inti=int(a);i=(int)a;i=a;11.4.2类类型转换函数11.4.2 11.4.2 类型型转换函数函数 转换函数转换函数三种调用方式三种调用方式11.4.2类类型转换函数例如:classXpublic:operatorint();voidf(Xa)inti=int

90、(a);i=(int)a;i=a;11.4.2 11.4.2 类型型转换函数函数 例如:例如:classXpublic:operator int ( ) ;voidf(Xa)inti=int(a);i=(int)a;i=a;voidg(Xa,Xb)inti=(a)?1+a:0;intj=(a&b)?a+b:i;if(a );除了赋值和初始化,除了赋值和初始化,类型转换函数还可以这样使用:类型转换函数还可以这样使用:对象a、b可用在整型变量出现的地方11.4.2类类型转换函数11.4.2 11.4.2 类型型转换函数函数 类型转换函数有两种使用方式: 隐式使用隐式使用i = a ; 显式使用显式

91、使用i = a . operator int ( )/ int ( a ) ( int ) a 使用不同函数作类型转换函数: int i = a ; / 用类型转换函数进行转换用类型转换函数进行转换 X i = a ;/ 用构造函数进行转换用构造函数进行转换11.4.2类类型转换函数#includeclassRationalpublic:Rational(longn,longd=1);/ 构造函数,把长整型转换成Rational类型friendRationaloperator+(constRational&,constRational&);friendostream&operator(ostr

92、eam&,constRational&);operatordouble();/ 类型转换函数private:longNumerator,Denominator;voidmain()Rationala(2,4),b=(1,2),c(0);c=a+b;/ 使用友员重载 “+” 和 缺省重载 “=”couta+b=cendl;/ 以分数形式显示 / 以实数形式显示,调用类型转换函数:coutdouble(a)+double(b)=double(c)endl;c=b+Rational(1);/ 调用构造函数作类型转换coutb+1=cendl;coutdouble(b)+1=double(c)endl

93、;例例 有理数计算有理数计算 11.4.2类类型转换函数#includeclassRationalpublic:Rational (long n , long d=1) ;/ 构造函数,把长整型转换成Rational类型friendRationaloperator+(constRational&,constRational&);friendostream&operator(ostream&,constRational&);operatordouble();/ 类型转换函数private:longNumerator,Denominator;voidmain()Rationala(2,4),b=(

94、1,2),c(0);c=a+b;/ 使用友员重载 “+” 和 缺省重载 “=”couta+b=cendl;/ 以分数形式显示 / 以实数形式显示,调用类型转换函数:coutdouble(a)+double(b)=double(c)endl;c=b+Rational( 1 );/ 调用构造函数作类型转换coutb+1=cendl;coutdouble(b)+1=double(c)endl;构造函数做类型转换构造函数做类型转换11.4.2类类型转换函数例例 有理数计算有理数计算 #includeclassRationalpublic:Rational(longn,longd=1);/ 构造函数,把

95、长整型转换成Rational类型friendRationaloperator+(constRational&,constRational&);friendostream&operator(ostream&,constRational&);operator double() ;/ 类型转换函数private:longNumerator,Denominator;voidmain()Rationala(2,4),b=(1,2),c(0);c=a+b;/ 使用友员重载 “+” 和 缺省重载 “=”couta+b=cendl;/ 以分数形式显示 / 以实数形式显示,调用类型转换函数:coutdouble

96、(a)+double(b)=double(c)endl;c=b+Rational(1);/ 调用构造函数作类型转换coutb+1=cendl;coutdouble( b )+1=double( c )endl;类型转换函数做类型转换类型转换函数做类型转换11.4.2类类型转换函数例例 有理数计算有理数计算 / 把长整型转换成把长整型转换成Rational类型类型Rational:Rational(longn,longd)Numerator=n;Denominator=d;/ 把把 Rational 类型转换成类型转换成 double 类型类型Rational:operator double()

97、return double(Numerator)/double(Denominator);Rationaloperator+(constRational&r1,constRational&r2)longn,d;n=r1.Numerator*r2.Denominator+r1.Denominator*r2.Numerator;d=r1.Denominator*r2.Denominator;returnRational(n,d);ostream&operator(ostream&output,constRational&x)outputx.Numerator/x.Denominator;retur

98、noutput;11.4.2类类型转换函数例例 有理数计算有理数计算 运算符重载可以像基本数据类型一样,用简洁明确的运算符操作自定义的类对象。重载运算符函数可以对运算符作出新的解释,但原有基本语义不变。运算符函数既可以重载为成员函数,也可以重载为友员函数或普通函数。当一元运算符的操作数,或者二元运算符的左操作数是类的一个对象时,以成员函数重载;当一个运算符的操作需要修改类对象状态时,应该以成员函数重载。如果以成友员函数重载,则使用引用参数修改对象。当运算符的操作数(尤其是第一个操作数)希望有隐式转换,则重载算符时必须用友员函数。构造函数和类型转换函数可以实现基本类型与类类型,以及类类型之间的类型转换。小结小结小结小结作业w11.2w11.32

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号