第8章操作符重载课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第8章操作符重载课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作 重载 课件
- 资源描述:
-
1、第第8章章 操作符重载操作符重载 8.1 操作符重载概述操作符重载概述 8.2操作符重载为类的成员函数操作符重载为类的成员函数 8.3操作符重载为友员函数操作符重载为友员函数8.4 增量增量/减量减量操作符的重载操作符的重载8.5 下标操作符的重载下标操作符的重载 8.6 函数调用操作符的函数调用操作符的重载重载 8.7 类成员访问操作符的重载类成员访问操作符的重载 重载是重载是C+C+多态性的体现之一。多态性的体现之一。C+语言允许程序员重新定义已有的语言允许程序员重新定义已有的操作操作符,使其能按用户的要求完成一些特定的操作,符,使其能按用户的要求完成一些特定的操作,这就是所谓的这就是所谓
2、的操作操作符重载。符重载。操作操作符重载与函数符重载与函数重载相似,其目的是设置某一重载相似,其目的是设置某一操作操作符,让它具符,让它具有另一种功能,尽管此有另一种功能,尽管此操作操作符在原先符在原先C+语言语言中代表另一种含义,但他们彼此之间并不冲突。中代表另一种含义,但他们彼此之间并不冲突。C+会根据会根据操作操作符的位置辨别应使用哪一种功符的位置辨别应使用哪一种功能进行能进行操作操作。8.1操作符重载概述操作符重载概述1.1.重载的意义重载的意义赋予操作符新的含义,使它能象完成标准类型的数赋予操作符新的含义,使它能象完成标准类型的数据操作一样来完成对类对象的操作。据操作一样来完成对类对
3、象的操作。2 2重载规则重载规则 (1)(1)只能重载只能重载C+C+语言中原先已有定义的语言中原先已有定义的操作操作符。符。(2)(2)不能重载下列四个不能重载下列四个操作操作符:符:.,.*,:,?:?:(3)(3)不能改变不能改变操作操作符的操作数个数。符的操作数个数。(4)(4)不能改变不能改变操作操作符原有的优先级。符原有的优先级。(5)(5)不能改变不能改变操作操作符原有的结合特性。符原有的结合特性。(6)(6)不能改变不能改变操作操作符对预定义类型数据的操作方式。符对预定义类型数据的操作方式。3 3重载形式有两种:重载形式有两种:成员函数成员函数形式和形式和友元函数友元函数形式。
4、形式。8.2 8.2 操作符重载为类的成员函数操作符重载为类的成员函数 假设需要针对类假设需要针对类X X重载操作符重载操作符“”(代表任何一个被重载的代表任何一个被重载的操作符操作符),则在定义类,则在定义类X X时时,可用如下形式来实现该操作符重载:可用如下形式来实现该操作符重载:class Xclass X public public:ReturnType operator(ReturnType operator(参数表参数表);;其中:其中:ReturnTypeReturnType为操作符函数的返回值类型,即操作结果的类型;为操作符函数的返回值类型,即操作结果的类型;operatoro
5、perator为操作符重载时必须使用的关键字,它和被重载的操为操作符重载时必须使用的关键字,它和被重载的操作符连在一起,作为操作符函数的专用函数名,作符连在一起,作为操作符函数的专用函数名,务必把该函数说务必把该函数说明为公有的明为公有的;是被重载的操作符;是被重载的操作符;参数表中列出该运算符所需要的操作数,如下所述:参数表中列出该运算符所需要的操作数,如下所述:(1)(1)重载一元重载一元(单目单目)操作符时,参数表为空。在这种操作符时,参数表为空。在这种情况下,当前对象情况下,当前对象(即,调用该操作符函数的对象即,调用该操作符函数的对象)作为作为该操作符唯一的操作数。该操作符唯一的操作
6、数。(2)(2)重载二元重载二元(双目双目)操作符时,参数表中有一个参数。操作符时,参数表中有一个参数。在这种情况下,当前对象作为该操作符的左操作数,参在这种情况下,当前对象作为该操作符的左操作数,参数作为右操作数。数作为右操作数。不难看出,当使用成员函数重载运算符时,定义操作符函不难看出,当使用成员函数重载运算符时,定义操作符函数的方法与定义普通成员函数的方法基本相同,唯一差数的方法与定义普通成员函数的方法基本相同,唯一差别是,操作符函数的名字必须为别是,操作符函数的名字必须为operator(operator(为任何一为任何一个被重载的运算符个被重载的运算符),而不能由程序员随意为运算符函
7、,而不能由程序员随意为运算符函数起名字。数起名字。例:复数类中以例:复数类中以成员函数成员函数形式重载操作符形式重载操作符#includeclass Complex public:Complex(int r=0,int i=0);void display();Complex operator+(Complex&c);protected:int real;int imag;Complex:Complex(int r,int i)real=r;imag=i;void Complex:display()coutreal0?+:)imagiendl;Complex Complex:operator+(
8、Complex&c)return Complex(real+c.real,imag+c.imag);void main()Complex c1(35,56);c1.display();Complex c2(-12,-78),c3;c2.display();c3=c1+c2;c3.display();8.3操作符重载为友员函数操作符重载为友员函数 假设需要针对类假设需要针对类X X重载操作符重载操作符“”(代表任何一个被重代表任何一个被重载的运算符载的运算符),则在定义类,则在定义类X X时时,可用如下形式来实现该操作可用如下形式来实现该操作符重载,使它成为类符重载,使它成为类X X的友元函数:
9、的友元函数:class Xclass X friend ReturnType operator(friend ReturnType operator(参数表参数表)该格式与前面说明运算符函数使之成为类该格式与前面说明运算符函数使之成为类X X的成员函数的格式的成员函数的格式相比,主要有以下几点差别:相比,主要有以下几点差别:(1)(1)在函数原型前多了一个关键字在函数原型前多了一个关键字friendfriend。(2)(2)由于是友元函数,因此在类由于是友元函数,因此在类X X的公有段和私有段说明此函数的公有段和私有段说明此函数的效果相同;而若作为成员函数说明运算符函数,则必须的效果相同;而若
10、作为成员函数说明运算符函数,则必须放在类放在类X X的公有段,否则无法公开使用被重载的运算符。的公有段,否则无法公开使用被重载的运算符。(3)(3)由于这样说明的由于这样说明的操作操作符函数是类符函数是类X X的友元函数而的友元函数而不是成员函数,因此它没有不是成员函数,因此它没有thisthis指针。由此可以指针。由此可以推知,必须在参数表中显式列出每一个操作数。推知,必须在参数表中显式列出每一个操作数。因此,用友元函数重载运算符时参数表中参数个因此,用友元函数重载运算符时参数表中参数个数,比用成员函数重载运算符时参数表中的参数数,比用成员函数重载运算符时参数表中的参数个数多一个。也就是说,
11、重载一元个数多一个。也就是说,重载一元操作操作符时参数符时参数表中应该有一个参数;重载二元表中应该有一个参数;重载二元操作操作符时参数表符时参数表中应该有两个参数,其中第一个参数作为左操作中应该有两个参数,其中第一个参数作为左操作数,第二个参数作为右操作数。数,第二个参数作为右操作数。用友元函数重载之后,用友元函数重载之后,操作符的语义:操作符的语义:(1)(1)一元操作符的语义。一元操作符的语义。如果在类如果在类X X中重载了一元运算符中重载了一元运算符,xobjxobj为为X X类的一个对类的一个对象,则象,则xobjxobj或或xobjxobj的语义为:的语义为:operator(xob
12、j)operator(xobj)(2)(2)二元运算符的语义。二元运算符的语义。如果在类如果在类X X中重载了二元运算符中重载了二元运算符,xobj1xobj1和和xobj2xobj2是是X X类类的 两 个 对 象,则的 两 个 对 象,则 x o b j 1 x o b j 2x o b j 1 x o b j 2 的 语 义 为:的 语 义 为:operator(xobj1,xobj2)operator(xobj1,xobj2)总之,使用重载后的运算符操作类的对象时,虽然可以总之,使用重载后的运算符操作类的对象时,虽然可以像操作预定义类型数据时一样,也采用人们习惯的形像操作预定义类型数据
13、时一样,也采用人们习惯的形式,但是它的实际含义却是调用相应的运算符函数。式,但是它的实际含义却是调用相应的运算符函数。例:复数类中以例:复数类中以友元函数友元函数形式重载操作符形式重载操作符#includeclass Complex public:Complex(int r=0,int i=0);void display();friend Complex operator+(Complex&a,Complex&b);protected:int real;int imag;Complex:Complex(int r,int i)real=r;imag=i;void Complex:display
14、()coutreal0?+:)imagiendl;Complex operator+(Complex&a,Complex&b)return Complex(a.real+b.real,a.imag+b.imag);void main()Complex c1(35,56);c1.display();Complex c2(-12,-78),c3;c2.display();c3=c1+c2;c3.display();8.4 8.4 增量增量/减量操作符的重载减量操作符的重载 在进行增量操作符在进行增量操作符+和减量操作符和减量操作符-的重载的重载时,要注意时,要注意+和和-有前缀式与后缀式之分。有前
15、缀式与后缀式之分。1.1.当前缀当前缀+和前缀和前缀-重载为类的成员函数时,重载为类的成员函数时,+obj+obj和和-obj-obj编译器理解的形式为:编译器理解的形式为:obj.operator+()obj.operator+()和和obj.operator-()obj.operator-()函数原型为:函数原型为:T operator+()T operator+();和和 T operator-()T operator-();其中,其中,T T为返回类型。为返回类型。2.2.当前缀当前缀+和前缀和前缀-重载为类的友员函数时,重载为类的友员函数时,+obj+obj和和-obj-obj编译器
16、理解的形式为:编译器理解的形式为:operator+(obj)operator+(obj)和和 operator-(obj)operator-(obj)函数原型为:函数原型为:friend T operator+(U obj)friend T operator+(U obj);和和 friend T operator-(U obj)friend T operator-(U obj);其中,其中,T T为返回类型,为返回类型,U U为操作数为操作数objobj的数据类型。函数的数据类型。函数定义时不要用定义时不要用friendfriend关键字。关键字。同理,当后缀同理,当后缀+和后缀和后缀-重
展开阅读全文