《c++程序设计》课件第7章 运算符重载 (2).ppt
- 【下载声明】
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)考虑到各种因素,)考虑到各种因素,双目运算符双目运算符一般重载为一般重载为类的友元函数,类的友元函数,单目运算符单目运算符一般重载为
展开阅读全文