《c++程序设计》课件第7章 运算符重载.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《c++程序设计》课件第7章 运算符重载.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+程序设计 c+程序设计课件第7章 运算符重载 c+ 程序设计 课件 运算 重载
- 资源描述:
-
1、第第7章章 运算符重载运算符重载2第第7章运算符重载章运算符重载本章学习要点本章学习要点v为什么要进行运算符重载为什么要进行运算符重载 v运算符重载的方法运算符重载的方法 v重载运算符的规则重载运算符的规则v运算符重载函数作为类成员函数和友元函数运算符重载函数作为类成员函数和友元函数v重载双目运算符重载双目运算符v重载单目运算符重载单目运算符v重载流插入运算符和流提取运算符重载流插入运算符和流提取运算符v不同类型数据间的转换不同类型数据间的转换3第第7章运算符重载章运算符重载v函数重载函数重载,就是赋给同一个函数名多个含义。,就是赋给同一个函数名多个含义。v运算符重载运算符重载是指同一个运算符
2、可以施加于不同是指同一个运算符可以施加于不同类型的操作数上面。类型的操作数上面。4class Moneypublic:Money(int y=0,int j=0,int f=0)yuan=y;jiao=j;fen=f;optimize();void Display(string);private:int yuan,jiao,fen;void Optimize();/优化函数优化函数;void Money:Optimize()if(fen=10)jiao+;fen-=10;if(jiao=10)yuan+;jiao-=10;void Money:Display(string str)cout s
3、tr =yuan .jiao fen¥=10)jiao+;fen-=10;if(jiao=10)yuan+;jiao-=10;void Money:Display(string str)cout str =yuan .jiao fen¥=10)jiao+;fen-=10;if(jiao=10)yuan+;jiao-=10;void Money:Display(string str)cout str =yuan .jiao fen¥endl;Money Money:MoneyAdd(Money&c2)return Money(yuan+c2.yuan,jiao+c2.jiao,fen+c2.fe
4、n);int main()Money cost1(300,5,6),cost2(105,7,6),total1;total1=cost1.MonetAdd(cost2);total1.Display(total1=cost1+cost2);return 0;77.1 为什么要进行运算符重载为什么要进行运算符重载但我们但我们希望希望在程序中在程序中直接用运算符直接用运算符“+”对对Money类的对象进行相加运算。类的对象进行相加运算。total1=cost1+cost2;对运算符对运算符“+”进行重载以后,就可以进行重载以后,就可以这样书写了。这样书写了。87.1 为什么要进行运算符重载为什么要
5、进行运算符重载v有了针对自定义类型数据的运算符重载有了针对自定义类型数据的运算符重载,不仅使我们编程时感到十分方便,而,不仅使我们编程时感到十分方便,而且写出的表达式与数学表达式很相似,且写出的表达式与数学表达式很相似,符合人们的习惯。符合人们的习惯。97.2 运算符重载的方法运算符重载的方法v重载运算符的函数的一般格式如下:重载运算符的函数的一般格式如下:函数类型函数类型 operator运算符名称运算符名称(形参列表形参列表)对运算符的重载处理对运算符的重载处理 函数名函数名函数名是由函数名是由operatoroperator和运算符组成,和运算符组成,如如operator+operato
6、r+意思是对运算符意思是对运算符“+”重载。重载。重载运算符的函数重载运算符的函数可以是可以是类的成员函数类的成员函数,也,也可以是可以是类的友元函数类的友元函数,还可以是既非类的成,还可以是既非类的成员函数也非类的友元函数的员函数也非类的友元函数的普通函数普通函数10【例【例7-1】对对“+”运算符进行重载来实现运算符进行重载来实现两个两个Money类对象的加法运算。类对象的加法运算。7.2 运算符重载的方法运算符重载的方法11#include#include using namespace std;class Moneypublic:Money(int y=0,int j=0,int f=
7、0);Money operator+(Money&);void Display(string);private:int yuan,jiao,fen;void Optimize();void Money:Optimize()if(fen=10)jiao+;fen-=10;if(jiao=10)yuan+;jiao-=10;Money:Money(int y,int j,int f)yuan=y;jiao=j;fen=f;Optimize();Money Money:operator+(Money&c2)return Money(yuan+c2.yuan,jiao+c2.jiao,fen+c2.f
8、en);void Money:Display(string str)cout str =yuan .jiao fen¥必须重载为类的成必须重载为类的成员函数员函数,必须重载为类的友元函数。必须重载为类的友元函数。227.4 运算符重载函数作为类的运算符重载函数作为类的成员函数和友元函数成员函数和友元函数v7.4.1运算符重载函数作为类的成员函数运算符重载函数作为类的成员函数v7.4.2运算符重载函数作为类的友元函数运算符重载函数作为类的友元函数237.4.1运算符重载函数作为类运算符重载函数作为类的成员函数的成员函数v将运算符重载函数定义为类的成员函数的原将运算符重载函数定义为类的成员函数的原
9、型在类的内部声明格式如下:型在类的内部声明格式如下:class 类名类名 返回类型返回类型 operator 运算符运算符(形参表形参表);v在类外定义运算符重载函数的格式如下:在类外定义运算符重载函数的格式如下:返回类型返回类型 类名类名:operator运算符运算符(形参表形参表)函数体函数体24【例例7-27-2】通过运算符重载为类的成员函数来实现通过运算符重载为类的成员函数来实现两个有理数对象的加、减、乘和除运算。两个有理数对象的加、减、乘和除运算。#include#include#include#include using namespace std;using namespace
10、std;class rational class rational /声明有理数类声明有理数类public:public:rational(int x=0,int y=1);rational(int x=0,int y=1);/构造函数构造函数 void print();void print();rational rational operator+(operator+(rational arational a););/重载运算符重载运算符+rationalrational operator-operator-(rational arational a););/重载运算符重载运算符-priva
11、te:private:int num,den;int num,den;void optimi();void optimi();/优化有理数函数优化有理数函数25void rational:optimi()void rational:optimi()/定义有理数优化函数定义有理数优化函数 int gcd;int gcd;if(num=0)if(num=0)/若分子为若分子为0 0,则置分母为,则置分母为1 1后返回后返回 den=1;return;den=1;return;gcd=(abs(num)abs(den)?abs(gcd=(abs(num)abs(den)?abs(denden):ab
12、s():abs(numnum););if(gcd=0)return;if(gcd=0)return;/若为若为0 0,则返回,则返回 for(int i=gcd;i1;i-)for(int i=gcd;i1;i-)/用循环找最大公约数用循环找最大公约数 if(num%i=0)&(den%i=0)break;if(num%i=0)&(den%i=0)break;num/=i;num/=i;/i i为最大公约数为最大公约数,将分子、分母均整除它将分子、分母均整除它,重新赋值重新赋值 den/=i;den/=i;/若分子和分母均为负数,则结果为正,所以均改为正若分子和分母均为负数,则结果为正,所以均
13、改为正 if(num0&den0)num=-num;den=-den;if(num0&den0)num=-num;den=-den;else if(num0|den0)else if(num0|den0)/若分子和分母中只有一个为负数,则调整为分子取负,分母取正若分子和分母中只有一个为负数,则调整为分子取负,分母取正 num=-abs(num);den=abs(den);num=-abs(num);den=abs(den);26void rational:print()/输出有理数输出有理数 coutnum;/当分子不为当分子不为0且分母不为且分母不为1时才显示时才显示/分母分母“if(num
14、!=0&den!=1)cout/denn;else coutn;7.4.1运算符重载函数作为运算符重载函数作为类的成员函数类的成员函数27rational rational:rational rational:operator+operator+(rational a)(rational a)/“+”运算符重载函数,根据前面所列的算法写出表达式运算符重载函数,根据前面所列的算法写出表达式 rational r;rational r;r.den=a.den r.den=a.den*den;den;r.num=a.numr.num=a.num*den+a.denden+a.den*num;num;
15、r.optimi();r.optimi();return r;return r;rational rational:rational rational:operator-operator-(rational a)(rational a)/“-”运算符重载函数,根据前面所列的算法写出表达式运算符重载函数,根据前面所列的算法写出表达式 rational r;rational r;r.den=a.den r.den=a.den*den;den;r.num=numr.num=num*a.den-dena.den-den*a.num;a.num;r.optimi();r.optimi();return
16、r;return r;28int main()rational r1(3,14),r2(4,14),r3,r4;r1.print();r2.print();r3=r1+r2;/使用重载了的运算符使用重载了的运算符“+”r3.print();r4=r1-r2;/使用重载了的运算符使用重载了的运算符“-”r4.print();return 0;7.4.1运算符重载函数作为运算符重载函数作为类的成员函数类的成员函数297.4.2运算符重载函数作为类的运算符重载函数作为类的友元函数友元函数v将运算符重载函数定义为类的友元函数,其原型在将运算符重载函数定义为类的友元函数,其原型在类的内部声明格式如下:类
17、的内部声明格式如下:class 类名类名 friend 返回类型返回类型 operator 运算符运算符(形参表形参表);v在类外定义友元运算符重载函数的格式如下:在类外定义友元运算符重载函数的格式如下:返回类型返回类型 operator运算符运算符(形参表形参表)函数体函数体30【例例7-37-3】将运算符将运算符“+”和和“-”重载为适合于有理数加减重载为适合于有理数加减法,重载函数不作为成员函数,而放在类外,作为法,重载函数不作为成员函数,而放在类外,作为rationalrational类的友元函数。类的友元函数。#include#include#include#include clas
18、s rational class rational/声明有理数类声明有理数类 public:public:/重载函数作为友元函数重载函数作为友元函数friendfriend rationalrational operator+operator+(rational a,rational brational a,rational b););/重载函数作为友元函数重载函数作为友元函数friendfriend rationalrational operator-operator-(rational a,rational brational a,rational b););private:private
19、:;31/定义作为友元函数的重载函数定义作为友元函数的重载函数rationalrational operator+operator+(rational a,rational b)(rational a,rational b)rational r;rational r;r.den=a.den r.den=a.den*b.den;b.den;r.num=a.num r.num=a.num*b.den+a.denb.den+a.den*b.num;b.num;r.optimi();r.optimi();return r;return r;/定义作为友元函数的重载函数定义作为友元函数的重载函数rati
20、onal rational operator-operator-(rational a,rational b)(rational a,rational b)rational r;rational r;r.den=a.den r.den=a.den*b.den;b.den;r.num=a.num r.num=a.num*b.den-a.denb.den-a.den*b.num;b.num;r.optimi();r.optimi();return r;return r;32int main()int main()rational r1(3,14),r2(4,14),r3,r4;rational r
21、1(3,14),r2(4,14),r3,r4;r1.print();r1.print();r2.print();r2.print();r3=r1+r2;r3=r1+r2;/使用重载了的运算符使用重载了的运算符“+”r3.print();r3.print();r4=r1-r2;r4=r1-r2;/使用重载了的运算符使用重载了的运算符“-”r4.print();r4.print();return 0;return 0;7.4.2运算符重载函数作为类的运算符重载函数作为类的友元函数友元函数337.5 重载双目运算符重载双目运算符v双目运算符(或称二元运算符)有两个双目运算符(或称二元运算符)有两个操
22、作数,通常在运算符的左右两侧,如操作数,通常在运算符的左右两侧,如x+y,t=3,a=b等。由于双目运算符有等。由于双目运算符有两个操作符,因此:两个操作符,因此:如果运算符重载函数为如果运算符重载函数为友元友元函数函数,则,则有两有两个参数。个参数。如果运算符重载函数为如果运算符重载函数为成员成员函数函数,则,则可以可以省略一个参数。省略一个参数。345.2 向上类型转换向上类型转换【例【例7-4】定义一个】定义一个Time类,用来存放做某件事所花费的类,用来存放做某件事所花费的时间,如小时分钟,分别重载运算符时间,如小时分钟,分别重载运算符“”用于用于求两段时间的和,重载运算符求两段时间的
23、和,重载运算符“”用于求两段时间的用于求两段时间的差。差。#include class Time public:Time();Time(int h,int m=0);friend Time operator+(Time&t1,Time&t2);friend Time operator-(Time&t1,Time&t2);void Show();private:int hours,minutes;Time:Time()hours=minutes=0;Time:Time(int h,int m)hours=h;minutes=m;355.2 向上类型转换向上类型转换void Time:Show()
24、couthours hours,minutes minutes;Time operator+(Time&t1,Time&t2)Time sum;sum.minutes=t1.minutes+t2.minutes;sum.hours=t1.hours+t2.hours+sum.minutes/60;sum.minutes%=60;return sum;Time operator-(Time&t1,Time&t2)Time dif;int x1,x2;x1=t2.hours*60+t2.minutes;x2=t1.hours*60+t1.minutes;dif.minutes=(x2-x1)%60
25、;dif.hours=(x2-x1)/60;return dif;365.2 向上类型转换向上类型转换int main()Time t1(5,30),t2(2,48),t3,t4;coutt1=;t1.Show();coutendl;coutt2=;t2.Show();coutendl;coutt3=t1+t2=;t3=t1+t2;t3.Show();coutendl;coutt4=t1-t2=;t4=t1-t2;t4.Show();coutendl;return 0;37指针悬挂指针悬挂【例例3-19】默认赋值运算符重载函数引起的指针悬挂默认赋值运算符重载函数引起的指针悬挂问题。问题。【例例
展开阅读全文