书签 分享 收藏 举报 版权申诉 / 123
上传文档赚钱

类型《c++程序设计》课件第7章 运算符重载 (2).ppt

  • 上传人(卖家):momomo
  • 文档编号:5787153
  • 上传时间:2023-05-09
  • 格式:PPT
  • 页数:123
  • 大小:1.93MB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《《c++程序设计》课件第7章 运算符重载 (2).ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    c+程序设计 c+程序设计课件第7章 运算符重载 2 c+ 程序设计 课件 运算 重载
    资源描述:

    1、1C+程序设计第第7 7章章 运算符重载运算符重载2第第7章运算符重载章运算符重载本章学习要点本章学习要点v为什么要进行运算符重载为什么要进行运算符重载 v运算符重载的方法运算符重载的方法 v重载运算符的规则重载运算符的规则v运算符重载函数作为类成员函数和友元函运算符重载函数作为类成员函数和友元函数数v重载双目运算符重载双目运算符v重载单目运算符重载单目运算符v重载流插入运算符和流提取运算符重载流插入运算符和流提取运算符v不同类型数据间的转换不同类型数据间的转换3第第7章运算符重载章运算符重载v函数重载函数重载,就是赋给同一个函数名多个含义。,就是赋给同一个函数名多个含义。v运算符重载运算符重

    2、载是指同一个运算符可以施加于不同是指同一个运算符可以施加于不同类型的操作数上面。类型的操作数上面。4#include using namespace std;class Complex public:Complex()real=0;imag=0;Complex(double r,double i)real=r;imag=i;void display()cout(real,imagi)endl;private:double real,imag;int main()Complex c1(3,4),c2(5,-10);coutc1=;c1.display();coutc2=;c2.display()

    3、;return 0;5+8,5.83.67“”运算符重载能适用于int、float和double型构造函数重载5#include using namespace std;class Complex public:Complex()real=0;imag=0;Complex(double r,double i)real=r;imag=i;friend Complex complex_add(Complex&c1,Complex&c2);void display();private:double real;double imag;Complex complex_add(Complex&c1,Com

    4、plex&c2)Complex c;c.real=c1.real+c2.real;c.imag=c1.imag+c2.imag;return c;void Complex:display()cout(real,imagi)endl;int main()Complex c1(3,4),c2(5,-10),c3;c3=complex_add(c1,c2);coutc1=;c1.display();coutc2=;c2.display();coutc1+c2=;c3.display();return 0;构造函数重载复数相加函数,返回值类型为类类型调用6#include using namespac

    5、e std;class Complex public:Complex()real=0;imag=0;Complex(double r,double i)real=r;imag=i;Complex complex_add(Complex&c2);void display();private:double real;double imag;Complex Complex:complex_add(Complex&c2)Complex c;c.real=real+c2.real;c.imag=imag+c2.imag;return c;void Complex:display()cout(real,i

    6、magi)endl;int main()Complex c1(3,4),c2(5,-10),c3;c3=plex_add(c2);coutc1=;c1.display();coutc2=;c2.display();coutc1+c2=;c3.display();return 0;构造函数重载复数相加函数,返回值类型为类类型调用c3=c1+c2;77.1 为什么要进行运算符重载为什么要进行运算符重载但我们但我们希望希望在程序中在程序中直接用运算符直接用运算符“+”对复数进行相加运算对复数进行相加运算。c3=c1+c2对运算符对运算符“+”进行重载以后,就可以进行重载以后,就可以这样书写了。这样书

    7、写了。87.1 为什么要进行运算符重载为什么要进行运算符重载v有了针对自定义类型数据的运算符重载,有了针对自定义类型数据的运算符重载,不仅使我们编程时感到十分方便,而且不仅使我们编程时感到十分方便,而且写出的表达式与数学表达式很相似,符写出的表达式与数学表达式很相似,符合人们的习惯。合人们的习惯。97.2 运算符重载的方法运算符重载的方法v重载运算符的函数的一般格式如下:重载运算符的函数的一般格式如下:函数类型函数类型 operatoroperator运算符名称运算符名称(形参列表形参列表)对运算符的重载处理对运算符的重载处理 函数函数名名函数名是由函数名是由operatoroperator和

    8、运算符组成,和运算符组成,如如operator+operator+意思是对运算符意思是对运算符“+”重载重载。重载运算符的函数重载运算符的函数可以是可以是类的成员函数类的成员函数,也,也可以是可以是类的友元函数类的友元函数,还可以是既非类的成,还可以是既非类的成员函数也非类的友元函数的员函数也非类的友元函数的普通函数普通函数10【例例7-17-1】对对“+”运算符进行重载来实现两个运算符进行重载来实现两个ComplexComplex类对象的加法运算。类对象的加法运算。7.2 运算符重载的方法运算符重载的方法11函数名#include#include using namespace std;cl

    9、ass Complexpublic:Complex(double r=0,double i=0)real=r;imag=i;Complex operator+(Complex&);/对“+”运算符进行重载 void display(string);private:double real,imag;Complex Complex:operator+(Complex&c2)Complex c;c.real=real+c2.real;c.imag=imag+c2.imag;return c;void Complex:display(string str)coutstr=(real,imagi)end

    10、l;int main()Complex c1(3,8),c2(5,7),c3,c4;c3=c1+c2;c4=c1.operator+(c2);c3.display(c3=c1+c2);c4.display(“c4=c1+c2);return 0;Complex Complex:operator+(Complex&c2)return Complex(real+c2.real,imag+c2.imag);在执行本句时,系统自动调用在执行本句时,系统自动调用operator+函数,函数,把把c1和和c2作为实参,与形参进行虚实结合。作为实参,与形参进行虚实结合。c1+c2解释为:解释为:c1.ope

    11、rator+(c2)12函数名#include/using namespace std;#include class Complexpublic:Complex(double r=0,double i=0)real=r;imag=i;friend Complex operator+(Complex&c1,Complex&c2);void display(string);private:double real,imag;Complex operator+(Complex&c1,Complex&c2)Complex c;c.real=c1.real+c2.real;c.imag=c1.imag+c

    12、2.imag;return c;void Complex:display(string str)coutstr=(real,imagi)real+c2.real;c.imag=this-imag+c2.imag;c.real=c1.real+c2.real;c.imag=c1.imag+c2.imag;c3=c1.operator+(c2);当前对象的指针15运算符重载函数可以是:类的成员函数类的成员函数 但必须要求运算表达式第一个参数(即运算符左侧的操作数)是一个类对象,而且与运算符函数的类型相同。因为必须通过类的对象去调用该类的成员函数,而且只有运算符重载函数返回值与该对象同类型,运算结果

    13、才有意义。16成员函数定义:Complex Complex:operator+(Complex&c2)return Complex(real+c2.real,imag+c2.imag);调用:c3=c1+c2;表达式c1+c2中第一个参数c1是Complex类对象,运算符函数返回值的类型也是Complex,这是正确的。如果c1不是Complex类,它就无法通过隐式this指针访问Complex类的成员了。如果函数返回值不是Complex类复数,显然这种运算是没有实际意义的。17将一个复数和一个整数相加,如c1i;成员函数定义:Complex Complex:operator+(int&i)re

    14、turn Complex(real+i,imag);调用:c3=c1i;不能写成:c3=ic1;也就是说也就是说:数学上的交换律不适用如果要计算i+c1的值,必须对“+”运算符再进行重载,重载函数为:Complex operator+(Complex&i,Complex&c);此时只能将重载函数作为友元函数,不能作为成员函数。18声明声明:friend Complex operator+(Complex&i,Complex&c);友元函数定义友元函数定义:Complex operator+(Complex&i,Complex&c)return Complex(i+c.real,c.imag);

    15、调用:c3=i+c1;19类的友元函数类的友元函数双目运算符重载为友元函数时,在函数的形参表列中必须有两个参数。声明:friend Complex operator+(Complex&c1,Complex&c2);友元函数定义:Complex operator+(Complex&c1,Complex&c2)return Complex(c1.real+c2.real,c1.imag+c2.imag);调用:c3=c1+c2;形参的顺序任意,不要求第一个参数必须为类对象。要求运算符左侧的操作数与第一个参数对应,运算符右侧的操作数与第二个参数对应。20u将一个复数和一个整数相加,如i+c1;声明:

    16、friend Complex operator+(Complex&i,Complex&c);友元函数定义:Complex operator+(Complex&i,Complex&c)return Complex(i+c.real,c.imag);调用:c3=i+c1;21注意注意:数学上的交换律不适用调用形式为:c3=c1+i时,再重载运算符“”为:Complex operator+(Complex&c,Complex&i)return Complex(i+c.real,c.imag);这样,c3=c2+i和c3=i+c2都合法,编译系统会根据表达式的形式选择调用与之匹配的运算符重载函数。一般

    17、地,单目运算符重载为成员函数,双目运算符重载为友元函数。既非类的成员函数也非类的友元函数的普通函数普通函数不能访问类的私有成员,所以很少使用。22说明:说明:重载运算符是由相应函数实现的,何必对运算符重载呢?答:虽然重载运算符所实现的功能完全可以用函数实现,但是使用运算符重载能使用户程序易于编写、阅读和维护。在实际工作中,类的声明和类的使用往往是分离的。假如在声明Complex类时,对运算符+,-,*,/都进行了重载,那么使用这个类的用户在编程时可以完全不考虑函数是怎么实现的,放心大胆地直接使用+,-,*,/进行复数的运算即可,十分方便。23说明:说明:运算符重载后,其原有的功能仍保留,没有丧

    18、失或改变;C+允许用户自定义新类型,所以必须允许运算符重载,以扩大C+已有运算符的使用范围,使其能作用于类对象,进行赋值运算、关系运算、逻辑运算和输入输出运算。C+没有为类对象重新定义一批新运算符,而是对现有运算符进行重载。24思考:前例中能否将一个常量和一个复数相加?c3=3+c2;不正确;c3=Complex(3,0)+c2;正确,复数的虚部为0就是实数常量。257.3 重载运算符的规则重载运算符的规则v(1 1)C+C+不允许用户自己定义新的运算符不允许用户自己定义新的运算符,只能对只能对C+C+语言中已有的运算符进行重载。语言中已有的运算符进行重载。例如,虽然在某些程序设计语言中用双字

    19、例如,虽然在某些程序设计语言中用双字符符“*”作为求幂运算符,但是在使用作为求幂运算符,但是在使用C+C+进行程序设计时,不能将进行程序设计时,不能将“*”作为运算作为运算符进行重载,因为符进行重载,因为“*”不是不是C+C+语言的合语言的合法运算符。法运算符。v(2 2)运算符重载针对新类型数据的实际需)运算符重载针对新类型数据的实际需要,对原有运算符进行适当的改造。一般要,对原有运算符进行适当的改造。一般来讲,来讲,重载的功能应当与原有功能相类似重载的功能应当与原有功能相类似。267.3 重载运算符的规则重载运算符的规则v(3 3)C+C+允许重载的运算符包括允许重载的运算符包括C+C+中

    20、几乎中几乎所有的运算符所有的运算符。具体规定如表。具体规定如表7-17-1所示。所示。表表7-1 C+7-1 C+允许重载的运算符允许重载的运算符运算符名称运算符名称具体运算符具体运算符算术运算符算术运算符+(加),(加),-(减),(减),*(乘),(乘),/(除),(除),%(取模),(取模),+(自增),(自增),-(自减)(自减)位操作运算符位操作运算符&(按位与),(按位与),(按位取反),(按位取反),(按位异或),(按位异或),|(按位或),(左移),(按位或),(左移),(右移)(右移)逻辑运算符逻辑运算符!(逻辑非),(逻辑非),&(逻辑与),(逻辑与),|(逻辑或)(逻辑或

    21、)比较运算符比较运算符(小于),(大于),(小于),(大于),=(大于等于),(大于等于),=(小于等于),(小于等于),=(等(等于),于),!=(不等于)(不等于)赋值运算符赋值运算符=,+=,-=,*=,/=,%=,&=,|=,=,=,=其他运算符其他运算符(下标),(下标),()(函数调用),(函数调用),-(成员访问),(逗号),(成员访问),(逗号),new,delete,new,delete,-*(成员指针访问)(成员指针访问)277.3 重载运算符的规则重载运算符的规则运算符运算符功能功能.成员访问运算符成员访问运算符.*成员指针访问运算符成员指针访问运算符:域运算符域运算符s

    22、izeof长度运算符长度运算符?:条件运算符条件运算符表表7-2 C+不允许重载的运算符不允许重载的运算符287.3 重载运算符的规则重载运算符的规则v(4 4)坚持坚持4 4个个“不能改变不能改变”。即。即不能改变不能改变运算运算符操作数的个数符操作数的个数;不能改变不能改变运算符原有的优先运算符原有的优先级级;不能改变不能改变运算符原有的结合性运算符原有的结合性;不能改变不能改变运算符原有的语法结构运算符原有的语法结构。单目运算符重载后只能是单目运算符,双目运算单目运算符重载后只能是单目运算符,双目运算符重载后依然是双目运算符。符重载后依然是双目运算符。C+C+语言已经预先规定了每个运算符

    23、的优先级,以语言已经预先规定了每个运算符的优先级,以决定运算次序。不论怎么进行重载,各运算符之决定运算次序。不论怎么进行重载,各运算符之间的优先级别不会改变。间的优先级别不会改变。C+C+语言已经预先规定了每个运算符的结合性。语言已经预先规定了每个运算符的结合性。297.3 重载运算符的规则重载运算符的规则v(5 5)重载的运算符必须和用户定义的自定义)重载的运算符必须和用户定义的自定义类型对象一起使用,其参数至少应有一个是类类型对象一起使用,其参数至少应有一个是类对象(或类对象的引用)。也就是说,参数不对象(或类对象的引用)。也就是说,参数不能全部是能全部是C+C+的标准类型,以防止用户修改

    24、用的标准类型,以防止用户修改用于标准类型数据的运算符的性质。于标准类型数据的运算符的性质。如果有两个参数,可以都是类对象,也可以一个是类对象,一个是C+标准类型的数据:Complex operator(int a,Complex c)return(Complex(a+c.real,c.image);防止用户:int operator+(int a,int b)return(a-b);307.3 重载运算符的规则重载运算符的规则v(6 6)重载运算符的函数不能有默认的参数,)重载运算符的函数不能有默认的参数,否则就改变了运算符参数的个数。否则就改变了运算符参数的个数。v(7 7)用于类对象的运算

    25、符一般必须重载,但)用于类对象的运算符一般必须重载,但有两个例外,运算符有两个例外,运算符“=”和和“&”可以不必用户可以不必用户重载。重载。赋值运算符赋值运算符(=)(=)可以用于每一个类对象,可以用于每一个类对象,可以利用它在同类对象之间相互赋值。可以利用它在同类对象之间相互赋值。地址运算符地址运算符&也不必重载,它能返回类对也不必重载,它能返回类对象在内存中的起始地址。象在内存中的起始地址。317.3 重载运算符的规则重载运算符的规则v注意:注意:(1 1)考虑到各种因素,)考虑到各种因素,双目运算符双目运算符一般重载为一般重载为类的友元函数,类的友元函数,单目运算符单目运算符一般重载为

    26、类的友一般重载为类的友元函数。元函数。(2 2)C+C+规定,规定,=,()(),,-必需重载为类的必需重载为类的成员函数成员函数,必需重载为类的友元函数必需重载为类的友元函数。327.4 运算符重载函数作为类的运算符重载函数作为类的成员函数和友元函数成员函数和友元函数v7.4.17.4.1运算符重载函数作为类的成员函数运算符重载函数作为类的成员函数v7.4.27.4.2运算符重载函数作为类的友元函数运算符重载函数作为类的友元函数337.4.1运算符重载函数作为类的运算符重载函数作为类的成员函数成员函数v将运算符重载函数定义为类的成员函数的原将运算符重载函数定义为类的成员函数的原型在类的内部声

    27、明格式如下:型在类的内部声明格式如下:class class 类名类名 返回类型返回类型 operator operator 运算符运算符(形参表形参表););v在类外定义运算符重载函数的格式如下:在类外定义运算符重载函数的格式如下:返回类型返回类型 类名类名:operator:operator运算符运算符(形参表形参表)函数体函数体 34【例例7-27-2】通过运算符重载为类的成员函数来实现通过运算符重载为类的成员函数来实现两个有理数对象的加、减、乘和除运算。两个有理数对象的加、减、乘和除运算。#include#include#include#include using namespace

    28、std;using namespace 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 a);(rational a);/重载运算符重载运算符+rational rational operator-operator-(rational a);(rationa

    29、l a);/重载运算符重载运算符-private:private:int num,den;int num,den;void optimi();void optimi();/优化有理数函数优化有理数函数35void 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(num):abs(den);

    30、gcd=(abs(num)abs(den)?abs(num):abs(den);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;/若分子和分母均为负数,则结果为正,所以均改

    31、为正若分子和分母均为负数,则结果为正,所以均改为正 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);36void rational:print()void rational:print()/输出有理数输出有理数 coutnum;

    32、coutnum;/当分子不为当分子不为0 0且分母不为且分母不为1 1时才显示时才显示/分母分母“if(num!=0&den!=1)cout/denn;if(num!=0&den!=1)cout/denn;else coutn;else coutn;7.4.1运算符重载函数作为运算符重载函数作为类的成员函数类的成员函数37rational rational:rational rational:operator+operator+(rational a)(rational a)/“+”运算符重载函数,根据前面所列的算法写出表达式运算符重载函数,根据前面所列的算法写出表达式 rational r;

    33、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;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=

    34、a.den*den;den;r.num=numr.num=num*a.den-dena.den-den*a.num;a.num;r.optimi();r.optimi();return r;return r;38int main()int main()rational r1(3,14),r2(4,14),r3,r4;rational r1(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

    35、=r1-r2;r4=r1-r2;/使用重载了的运算符使用重载了的运算符“-”r4.print();r4.print();return 0;return 0;7.4.1运算符重载函数作为运算符重载函数作为类的成员函数类的成员函数397.4.2运算符重载函数作为类的运算符重载函数作为类的友元函数友元函数v将运算符重载函数定义为类的友元函数,其原型在将运算符重载函数定义为类的友元函数,其原型在类的内部声明格式如下:类的内部声明格式如下:class class 类名类名 friendfriend 返回类型返回类型 operator operator 运算符运算符(形参表形参表););v在类外定义友元运

    36、算符重载函数的格式如下:在类外定义友元运算符重载函数的格式如下:返回类型返回类型 operatoroperator运算符运算符(形参表形参表)函数体函数体 40【例例7-37-3】将运算符将运算符“+”和和“-”重载为适合于有理数加减重载为适合于有理数加减法,重载函数不作为成员函数,而放在类外,作为法,重载函数不作为成员函数,而放在类外,作为rationalrational类的友元函数。类的友元函数。#include#include#include#include class rational class rational/声明有理数类声明有理数类 public:public:/重载函数作为友

    37、元函数重载函数作为友元函数friend friend rational rational operator+operator+(rational a,rational b);(rational a,rational b);/重载函数作为友元函数重载函数作为友元函数friendfriend rational rational operator-operator-(rational a,rational b);(rational a,rational b);private:private:;41/定义作为友元函数的重载函数定义作为友元函数的重载函数rational rational operato

    38、r+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;/定义作为友元函数的重载函数定义作为友元函数的重载函数rational rational operator-operator-(rational a,rational b)

    39、(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;42int main()int main()rational r1(3,14),r2(4,14),r3,r4;rational r1(3,14),r2(4,14),r3,r4;r1.print();r1.print();r2.print()

    40、;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运算符重载函数作为类的运算符重载函数作为类的友元函数友元函数437.5 重载双目运算符重载双目运算符v双目运算符(或称二元运算符)有两个双目运算符(或称二元运算符)有两个操作数,通常在运算符的左右两侧,如操作数,通常在运算符的左右两侧,如x+yx+y,t=3t=3,a=ba=b等。

    41、由于双目运算符有等。由于双目运算符有l l两个操作符,因此如果运算符重载函数两个操作符,因此如果运算符重载函数为友元函数,则有两个参数,如果运算为友元函数,则有两个参数,如果运算符重载函数为成员函数,则可以省略一符重载函数为成员函数,则可以省略一个参数。个参数。445.2 向上类型转换向上类型转换【例例7-47-4】定义一个定义一个TimeTime类,用来存放做某件事所花费的类,用来存放做某件事所花费的时间,如小时分钟,分别重载运算符时间,如小时分钟,分别重载运算符“”用于用于求两段时间的和,重载运算符求两段时间的和,重载运算符“”用于求两段时间的用于求两段时间的差。差。#include#in

    42、clude class Timeclass Time public:public:Time();Time();Time(int h,int m=0);Time(int h,int m=0);friend Time operator+(Time&t1,Time&t2);friend Time operator+(Time&t1,Time&t2);friend Time operator-(Time&t1,Time&t2);friend Time operator-(Time&t1,Time&t2);void Show();void Show();private:private:int hours

    43、,minutes;int hours,minutes;Time:Time()hours=minutes=0;Time:Time()hours=minutes=0;Time:Time(int h,int m)hours=h;minutes=m;Time:Time(int h,int m)hours=h;minutes=m;455.2 向上类型转换向上类型转换void Time:Show()void Time:Show()couthours hours,minutes minutes;couthours hours,minutes minutes;Time operator+(Time&t1,Ti

    44、me&t2)Time operator+(Time&t1,Time&t2)Time sum;Time sum;sum.minutes=t1.minutes+t2.minutes;sum.minutes=t1.minutes+t2.minutes;sum.hours=t1.hours+t2.hours+sum.minutes/60;sum.hours=t1.hours+t2.hours+sum.minutes/60;sum.minutes%=60;sum.minutes%=60;return sum;return sum;Time operator-(Time&t1,Time&t2)Time o

    45、perator-(Time&t1,Time&t2)Time dif;Time dif;int x1,x2;int x1,x2;x1=t2.hoursx1=t2.hours*60+t2.minutes;60+t2.minutes;x2=t1.hours x2=t1.hours*60+t1.minutes;60+t1.minutes;dif.minutes=(x2-x1)%60;dif.minutes=(x2-x1)%60;dif.hours=(x2-x1)/60;dif.hours=(x2-x1)/60;return dif;return dif;465.2 向上类型转换向上类型转换int ma

    46、in()int main()Time t1(5,30),t2(2,48),t3,t4;Time t1(5,30),t2(2,48),t3,t4;coutt1=;coutt1=;t1.Show();t1.Show();coutendl;coutendl;coutt2=;coutt2=;t2.Show();t2.Show();coutendl;coutendl;coutt3=t1+t2=;coutt3=t1+t2=;t3=t1+t2;t3=t1+t2;t3.Show();t3.Show();coutendl;coutendl;coutt4=t1-t2=;coutt4=t1-t2=;t4=t1-t2

    47、;t4=t1-t2;t4.Show();t4.Show();coutendl;coutendl;return 0;return 0;475.2 向上类型转换向上类型转换【例例7-57-5】重载赋值运算符函数解决指针悬挂问题。重载赋值运算符函数解决指针悬挂问题。#include#include using namespace std;using namespace std;class Tclass Tpublic:public:T(int x=0)T(int x=0)/参数带有默认值的构造函数参数带有默认值的构造函数 p=new int(x);p=new int(x);/p/p指向动态创建的整型

    48、变量指向动态创建的整型变量int Get()return int Get()return*p;p;T()T()/析构函数析构函数 delete p;delete p;/动态释放动态释放p p所指向的单元所指向的单元 T&operator=(const T&);T&operator=(const T&);private:private:int int*p;p;/整型指针整型指针p p,将来指向动态申请到的整型变量,将来指向动态申请到的整型变量;485.2 向上类型转换向上类型转换T&T:operator=(const T&right)T&T:operator=(const T&right)if(

    49、this=&right)return if(this=&right)return*this;/this;/检查自身赋值检查自身赋值 delete p;p=new int;delete p;p=new int;*p=p=*right.p;right.p;return return*this;this;int main()int main()T t1(5),t2(8);T t1(5),t2(8);coutt1=t1.Get()tt2=t2.Get()endl;coutt1=t1.Get()tt2=t2.Get()endl;t1=t2;t1=t2;coutt1=t1.Get()tt2=t2.Get(

    50、)endl;coutt1=t1.Get()tt2=t2.Get()endl;return 0;return 0;497.6 重载单目运算符重载单目运算符v单目运算符只有一个操作数,如单目运算符只有一个操作数,如!a!a,-b b,&c&c,*p p,-i-i,+i+i等。由于单目运等。由于单目运算符只有一个操作符,因此如果运算算符只有一个操作符,因此如果运算符重载函数为友元函数,则只能有一符重载函数为友元函数,则只能有一个参数,如果运算符重载函数为成员个参数,如果运算符重载函数为成员函数,则可以省略此参数。函数,则可以省略此参数。505.2 向上类型转换向上类型转换【例例7-67-6】设计一个

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:《c++程序设计》课件第7章 运算符重载 (2).ppt
    链接地址:https://www.163wenku.com/p-5787153.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库