运算符重载 (3)幻灯片.ppt
《运算符重载 (3)幻灯片.ppt》由会员分享,可在线阅读,更多相关《运算符重载 (3)幻灯片.ppt(121页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、运算符重载运算符重载第1页,共121页,编辑于2022年,星期三第2页 共125页第第7章章 运算符重载运算符重载运算符重载是面向对象程序设计的重要特征。运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据导致不同的行为。C+中经重载后的运算符能直接对用户自定义的数据进行操作运算,这就是C+语言中的运算符重载所提供的功能。第2页,共121页,编辑于2022年,星期三第3页 共125页第第7章章 运算符重载运算符重载7.1 运算符重载概述7.2 运算符重载函数的两种形式7.3几个常用运算符的重载7.4 类型转换7.5 本章小结第3页,共121页,编辑于2022年,星期三第4
2、页 共125页7.1 运算符重载概述运算符重载概述7.1.1 运算符重载的好处7.1.2 运算符重载的规则第4页,共121页,编辑于2022年,星期三第5页 共125页7.1.1 运算符重载的好处运算符重载的好处C+预定义的运算符只能对基本类型的数据进行操作,不能用于自定义数据类型的运算。对于用户自定义的数据类型往往需要有类似的运算操作,客观上需要定义适用用户自定义数据类型的有关运算。第5页,共121页,编辑于2022年,星期三第6页 共125页7.1.1 运算符重载的好处运算符重载的好处定义一个简化的复数类complex:class complex public:double real,im
3、ag;complex(double r=0,double i=0)real=r;imag=i;第6页,共121页,编辑于2022年,星期三第7页 共125页7.1.1 运算符重载的好处运算符重载的好处若要把类complex的两个对象com1和com2加在一起,下面的语句是不能实现的:void main()complex com1(1.1,2.2),com2(3.3,4.4),total;total=com1+com2;/错误错误 /第7页,共121页,编辑于2022年,星期三第8页 共125页7.1.1 运算符重载的好处运算符重载的好处若要将上述类complex的两个对象相加,只要编写一个运算
4、符函数operator+(),如下所示:complex operator+(complex om1,complex om2)complex temp;temp.real=om1.real+om2.real;temp.imag=om1.imag+om2.imag;return temp;我们就能方便地使用语句:total=com1+com2;将类complex的两个对象com1和com2相加。第8页,共121页,编辑于2022年,星期三第9页 共125页表表7-1 运算符重载函数运算符重载函数函数功能operator+()加法operator-()减法operator*()乘法operator/
5、()除法operator()小于.第9页,共121页,编辑于2022年,星期三第10 共125页 7.1.2 运算符重载的规则运算符重载的规则运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造完成的。一般来讲,重载的功能应当与原有的功能相类似。只能重载C+预定义中已有的运算符,不可自己“创造”新的运算符进行重载。第10页,共121页,编辑于2022年,星期三第11 共125页 7.1.2 运算符重载的规则运算符重载的规则以下运算符不可重载:运算符语义.成员(分量)运算符*指向成员的指针:作用域运算符?:条件运算符sizeof类型长度运算符第11页,共121页,编辑于2022年,星
6、期三第12 共125页 7.1.2 运算符重载的规则运算符重载的规则不能改变运算符的操作个数。不能改变运算符的原有优先级。不能改变运算符的原有结合特性。不能改变运算符对预定义类型数据的操作方式。重载运算符时,必须至少有一个自定义类型的数据作为操作数。第12页,共121页,编辑于2022年,星期三第13 共125页 7.2 运算符重载函数的两种形式运算符重载函数的两种形式运算符重载是通过创建运算符重载函数来实现的,运算符重载函数定义了重载的运算符将要进行的操作。运算符重载函数一般采用以下两种形式:成员运算符函数友元运算符函数第13页,共121页,编辑于2022年,星期三第14 共125页 7.2
7、 运算符重载函数的两种形式运算符重载函数的两种形式7.2.1 友元运算符函数7.2.2 成员运算符函数7.2.3 成员运算符函数与友元运算符函数的比较第14页,共121页,编辑于2022年,星期三第15 共125页 7.2.1 友元运算符函数友元运算符函数在C+中,可以把运算符重载函数定义成某个类的友元函数,称为友元运算符函数。当运算符重载为友元函数时可以自由地访问类的所有成员。运算符重载为友元函数时,运算符所需要的操作数都需要通过函数的形参来传递,在参数表中参数从左至右的顺序就是运算符操作数的顺序。第15页,共121页,编辑于2022年,星期三第16 共125页 7.2.1 友元运算符函数友
8、元运算符函数 友元运算符函数定义的语法形式 双目运算符重载 单目运算符重载第16页,共121页,编辑于2022年,星期三第17 共125页 友元运算符函数定义的语法形式友元运算符函数定义的语法形式友元运算符函数的原型在类的内部声明格式如下:class X /friend 返回类型返回类型 operator运算符运算符(形参表形参表);/第17页,共121页,编辑于2022年,星期三第18 共125页 友元运算符函数定义的语法形式友元运算符函数定义的语法形式在类外定义友元运算符函数的格式如下:返回类型返回类型 operator运算符运算符(形参表形参表)函数体函数体 第18页,共121页,编辑于
9、2022年,星期三第19 共125页 双目运算符重载双目运算符重载当用友元函数重载双目运算符时,两个操作数都要传递给运算符函数。第19页,共121页,编辑于2022年,星期三第20 共125页 例例7.2 用友元运算符进行复数运算用友元运算符进行复数运算两个复数a+bi和c+di进行加、减、乘、除的方法如下:加法:(a+bi)+(c+di)=(a+c)+(b+d)i减法:(a+bi)-(c+di)=(a-c)+(b-d)i乘法:(a+bi)*(c+di)=(ac-bd)+(ad+bc)i除法:(a+bi)/(c+di)=(a+bi)*(c-di)/c2+d2第20页,共121页,编辑于2022
10、年,星期三第21 共125页 例例7.2 用友元运算符进行复数运算用友元运算符进行复数运算#include class complexpublic:complex(double r=0.0,double i=0.0);void print();friend complex operator+(complex a,complex b);friend complex operator-(complex a,complex b);friend complex operator*(complex a,complex b);friend complex operator/(complex a,compl
11、ex b);private:double real;double imag;第21页,共121页,编辑于2022年,星期三第22 共125页 例例7.2 用友元运算符进行复数运算用友元运算符进行复数运算complex:complex(double r,double i)real=r;imag=i;complex operator+(complex a,complex b)complex temp;temp.real=a.real+b.real;temp.imag=a.imag+b.imag;return temp;第22页,共121页,编辑于2022年,星期三第23 共125页 例例7.2 用
12、友元运算符进行复数运算用友元运算符进行复数运算complex operator-(complex a,complex b)complex temp;temp.real=a.real-b.real;temp.imag=a.imag-b.imag;return temp;第23页,共121页,编辑于2022年,星期三第24 共125页 例例7.2 用友元运算符进行复数运算用友元运算符进行复数运算complex operator*(complex a,complex b)complex temp;temp.real=a.real*b.real-a.imag*b.imag;temp.imag=a.re
13、al*b.imag+a.imag*b.real;return temp;complex operator/(complex a,complex b)complex temp;double t;t=1/(b.real*b.real+b.imag*b.imag);temp.real=(a.real*b.real+a.imag*b.imag)*t;temp.imag=(b.real*a.imag-a.real*b.imag)*t;return temp;第24页,共121页,编辑于2022年,星期三第25 共125页 例例7.2 用友元运算符进行复数运算用友元运算符进行复数运算void comple
14、x:print()cout0)cout+;if(imag!=0)coutimagin;void main()complex A1(2.3,4.6),A2(3.6,2.8),A3,A4,A5,A6;A3=A1+A2;A4=A1-A2;A5=A1*A2;A6=A1/A2;A1.print();A2.print();A3.print();A4.print();A5.print();A6.print();第25页,共121页,编辑于2022年,星期三第26 共125页 说明说明主函数中的A3=A1+A2;A4=A1-A2;A5=A1*A2;A6=A1/A2;在执行时将被解释为:A3=operator+
15、(A1,A2);A4=operator-(A1,A2);A5=operator*(A1,A2);A6=operator/(A1,A2);第26页,共121页,编辑于2022年,星期三第27 共125页 说明说明一一般般而而言言,如如果果在在类类X中中采采用用友友元元函函数数重重载载双双目目运运算算符符,而而aa和和bb是是类类X的的两两个个对对象象,则则以以下下两两种种函函数调用方法是等价的数调用方法是等价的:aa bb;/隐式调用隐式调用 operator(aa,bb);/显式调用显式调用第27页,共121页,编辑于2022年,星期三第28 共125页 单目运算符重载单目运算符重载用友元函数
16、重载单目运算符时,需要一个显式的操作数。第28页,共121页,编辑于2022年,星期三第29 共125页 例例7.3 用友元函数重载单目运算符用友元函数重载单目运算符“-”#include class ABpublic:AB(int x=0,int y=0)a=x;b=y;friend AB operator-(AB obj);void print();private:int a,b;第29页,共121页,编辑于2022年,星期三第30 共125页 例例7.3 用友元函数重载单目运算符用友元函数重载单目运算符“-”AB operator-(AB obj)obj.a=-obj.a;obj.b=-
17、obj.b;return obj;void AB:print()couta=a b=bendl;void main()AB ob1(50,60),ob2;ob1.print();ob2=-ob1;ob2.print();第30页,共121页,编辑于2022年,星期三第31 共125页 例例7.4 使用友元函数重载使用友元函数重载使用友元函数重载使用友元函数重载“+”,“-”时有问题时有问题时有问题时有问题#include class coordpublic:coord(int i=0,int j=0);void print();friend coord operator+(coord op);
18、private:int x,y;coord:coord(int i,int j)x=i;y=j;第31页,共121页,编辑于2022年,星期三第32 共125页 例例7.4 使用友元函数重载使用友元函数重载“+”,“-”+”,“-”时有问题时有问题时有问题时有问题void coord:print()coutx:x,y:yendl;coord operator+(coord op)+op.x;+op.y;return op;void main()coord ob(10,20);ob.print();operator+(ob);ob.print();+ob;ob.print();第32页,共121
19、页,编辑于2022年,星期三第33 共125页 例例7.5 使用引用参数重写例使用引用参数重写例7.4#include class coordpublic:coord(int i=0,int j=0);void print();friend coord operator+(coord&op);private:int x,y;coord:coord(int i,int j)x=i;y=j;第33页,共121页,编辑于2022年,星期三第34 共125页 例例7.5 使用引用参数重写例使用引用参数重写例7.4void coord:print()coutx:x,y:y用指针访问对象成员第38页,共1
20、21页,编辑于2022年,星期三第39 共125页 7.2.2 成员运算符函数成员运算符函数在C+中,可以把运算符函数定义成某个类的成员函数,称为成员运算符函数。运算符重载为成员函数后,可以自由访问本类的任何成员。对于双目运算符,其左操作数一定是对象本身,由this指针给出,另一个操作数则需要通过运算符重载函数的参数表进行传递。对于单目运算符,对象的this指针直接给出操作数,因此不再需要任何其他参数。第39页,共121页,编辑于2022年,星期三第40 共125页 7.2.2 成员运算符函数成员运算符函数 成员运算符函数定义的语法形式 双目运算符重载 单目运算符重载第40页,共121页,编辑
21、于2022年,星期三第41 共125页 成员运算符函数定义的语法形式成员运算符函数定义的语法形式成员运算符函数的原型在类的内部声明格式如下:class X /返回类型返回类型 operator运算符运算符(形参表形参表);/第41页,共121页,编辑于2022年,星期三第42 共125页 成员运算符函数定义的语法形式成员运算符函数定义的语法形式在类外定义成员运算符函数的格式如下:返回类型返回类型 X:operator运算符运算符(形参表形参表)函数体函数体第42页,共121页,编辑于2022年,星期三第43 共125页 成员运算符函数定义的语法形式成员运算符函数定义的语法形式在成员运算符函数的
22、形参表中,若运算符是单目的,则参数表为空;若运算符是双目的,则参数表中有一个参数。第43页,共121页,编辑于2022年,星期三第44 共125页 双目运算符重载双目运算符重载对双目运算符而言,成员运算符函数的形参表中仅有一个参数,它作为运算符的右操作数,此时当前对象作为运算符的左操作数,它是通过this指针隐含地传递给函数的。第44页,共121页,编辑于2022年,星期三第45 共125页 例例7.6 采用成员运算符函数改写例采用成员运算符函数改写例7.2#include class complexpublic:complex(double r=0.0,double i=0.0);void
23、print();complex operator+(complex c);complex operator-(complex c);complex operator*(complex c);complex operator/(complex c);private:double real;double imag;第45页,共121页,编辑于2022年,星期三第46 共125页 例例7.6 采用成员运算符函数改写例采用成员运算符函数改写例7.2 complex:complex(double r,double i)real=r;imag=i;complex complex:operator+(com
24、plex c)return complex(real+c.real,imag+c.imag);complex complex:operator-(complex c)return complex(real-c.real,imag-c.imag);第46页,共121页,编辑于2022年,星期三第47 共125页 例例7.6 采用成员运算符函数改写例采用成员运算符函数改写例7.2 complex complex:operator*(complex c)return complex(real*c.real-imag*c.imag,real*c.imag+imag*c.real);complex co
25、mplex:operator/(complex c)complex t1(c.real,-c.imag),t2(1/(c.real*c.real+c.imag*c.imag);return(*this)*t1*t2;void complex:print()cout0)cout+;if(imag!=0)coutimagin;第47页,共121页,编辑于2022年,星期三第48 共125页 例例7.6 采用成员运算符函数改写例采用成员运算符函数改写例7.2 void main()complex A1(2.3,4.6),A2(3.6,2.8),A3,A4,A5,A6;A3=A1+A2;A4=A1-A
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 运算符重载 3幻灯片 运算 重载 幻灯片
限制150内