第7章 运算符重载.ppt
《第7章 运算符重载.ppt》由会员分享,可在线阅读,更多相关《第7章 运算符重载.ppt(21页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第7 7章章 运算符重载运算符重载 7.1 7.1 运算符重载概述运算符重载概述 7.2 7.2 运算符重载的实现运算符重载的实现 7.3 7.3 单目运算符重载单目运算符重载 7.4 7.4 双目运算符重载双目运算符重载 7.5 -7.5 -运算符重载运算符重载 7.6 7.6 赋值运算符重载赋值运算符重载7.7 7.7 下标运算符重载下标运算符重载 7.8 7.8 运算符运算符newnew与与deletedelete重载重载 7.9 7.9 逗号运算符重载逗号运算符重载 7.10 7.10 类型转换运算符重载类型转换运算符重载 课后思考题课后思考题课后思考题课后思考题 C+C+语言允许程
2、序员重新定义已有的运算语言允许程序员重新定义已有的运算符,使其能按用户的要求完成一些特定的操符,使其能按用户的要求完成一些特定的操作,这就是所谓的作,这就是所谓的运算符重载运算符重载(operator(operator overload)overload)。运算符重载与函数重载相似,其。运算符重载与函数重载相似,其目的是设置某一运算符,让它具有另一种功目的是设置某一运算符,让它具有另一种功能,尽管此运算符在原先能,尽管此运算符在原先C+C+语言中代表另一语言中代表另一种含义,但他们彼此之间并不冲突。种含义,但他们彼此之间并不冲突。C+C+会根会根据运算符的位置辨别应使用哪一种功能进行据运算符的
3、位置辨别应使用哪一种功能进行运算。运算。7.1 7.1 运算符重载概述运算符重载概述运运算算符符重重载载是是对对系系统统提提供供的的运运算算符符赋赋予予多多重重含含义义,同同一一个个运运算算符符作作用用于于不不同同类类型型的的数数据据导致不同类型的行为。导致不同类型的行为。运运算算符符重重载载的的实实质质就就是是函函数数重重载载。在在实实现现过过程程中中,首首先先把把指指定定的的运运算算表表达达式式转转化化为为对对运运算算符符函函数数的的调调用用,运运算算对对象象转转化化为为运运算算符符函函数数的的实实参参,然然后后根根据据实实参参的的类类型型来来确确定定需需要要调调用用的函数,这个过程是在编
4、译过程中完成的。的函数,这个过程是在编译过程中完成的。C+C+可以重载的运算符如表可以重载的运算符如表7-17-1所示所示 ;C+C+不能被重载的运算符如表不能被重载的运算符如表7-27-2所示。所示。表表7-1 7-1:C+C+可以重载的运算符可以重载的运算符!+-*&/%=!=|&+=*=/=%=&=|=,-*-()=+-newdelete表表7-2 7-2:C+C+不可以重载的运算符不可以重载的运算符.*:?:?:#v运算符重载的规则如下:运算符重载的规则如下:(1 1)C+C+中中的的运运算算符符除除了了少少数数几几个个以以外外,几几乎乎全全部部可可以以重载,而且只能重载已有的这些运算
5、符。重载,而且只能重载已有的这些运算符。(2 2)重载之后运算符的优先级和结合性都不会改变重载之后运算符的优先级和结合性都不会改变。(3 3)运算符重载是针对新类型数据的实际需要,对原)运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。一般来讲,重载的功能应有运算符进行适当的改造。一般来讲,重载的功能应当与原有当与原有功能类似功能类似。(4 4)运算符重载不能改变原运算符的操作对象个数,运算符重载不能改变原运算符的操作对象个数,同时至少要有一个操作对象是自定义类型。同时至少要有一个操作对象是自定义类型。7.2 7.2 运算符重载的实现运算符重载的实现运运算算符符的的重重载载形形
6、式式有有两两种种:重重载载为为类类的的成成员员函函数数和和重重载载为为类类的的友元函数。友元函数。1.1.运算符重载为类的成员函数的语法形式如下:运算符重载为类的成员函数的语法形式如下:operator operator ();friend friend operator operator ();其中其中:v 指定了重载运算符的返回值类型指定了重载运算符的返回值类型;voperatoroperator是定义运算符重载函数的关键词是定义运算符重载函数的关键词;v 给定了要重载的运算符名称,是给定了要重载的运算符名称,是C+C+中可重载的运算符中可重载的运算符;v 中给出重载运算符所需要的参数和类
7、型中给出重载运算符所需要的参数和类型;v对对于于运运算算符符重重载载为为友友元元函函数数的的情情况况,还还要要在在函函数数类类型型说说明明之之前前使使用用friendfriend关键词来说明。关键词来说明。注意事项:注意事项:v当运算符重载为类的成员函数时,函数的参数个数比当运算符重载为类的成员函数时,函数的参数个数比原来的运算数个数要少一个(后缀原来的运算数个数要少一个(后缀+、-除外);当除外);当重载为类的友元函数时,参数个数与原运算数的个数重载为类的友元函数时,参数个数与原运算数的个数相同。相同。v单目运算符最好重载为成员函数;单目运算符最好重载为成员函数;v双目运算符则最好重载为友元
8、函数;双目运算符则最好重载为友元函数;v运算符重载的含义必须清楚;运算符重载的含义必须清楚;v运算符重载不能有二义性;运算符重载不能有二义性;7.3 7.3 单目运算符重载单目运算符重载类类的的单单目目运运算算符符可可重重载载为为一一个个没没有有参参数数的的非非静静态态成成员员函函数数或或者者带带有有一一个个参参数数的的非非成成员员函函数数,参参数数必必须是用户字定义类型的对象或者是对该对象的引用。须是用户字定义类型的对象或者是对该对象的引用。在在C+C+中中,单单目目运运算算符符有有+和和-,它它们们是是变变量量自自动动增增1 1和和自自动动减减1 1的的运运算算符符。在在类类中中可可以以对
9、对这这两两个个单单目运算符进行重载。目运算符进行重载。如如同同“+”+”运运算算符符有有前前缀缀、后后缀缀两两种种使使用用形形式式,“+”+”和和“-”-”重重载载运运算算符符也也有有前前缀缀和和后后缀缀两两种种运运算算符符重重载载形形式式,以以“+”+”重重载载运运算算符符为为例例,其其语语法法格式如下:格式如下:operator+operator+();();/前缀运算前缀运算 operator+operator+(intint);/后缀运算后缀运算 使用前缀运算符的语法格式如下:使用前缀运算符的语法格式如下:+;使使用用运运算算符符前前缀缀时时,对对对对象象(操操作作数数)进进行行增增量
10、量修修改改,然然后后再再返返回回该该对对象象。所所以以前前缀缀运运算算符符操操作作时时,参参数数与与返返回回的的是是同同一一个个对对象象。这这与与基基本本数数据据类类型型的的运运算算符符前前缀缀类类似似,返返回的也是左值。回的也是左值。使用后缀运算符的语法格式如下:使用后缀运算符的语法格式如下:+;使使用用运运算算符符后后缀缀时时,必必须须再再增增量量之之前前返返回回原原有有的的对对象象值值。为为此此,需需要要创创建建一一个个临临时时对对象象,存存放放原原有有的的对对象象,以以便便对对操操作作数数(对对象象)进进行行增增量量修修改改时时,保保存存最最初初的的值值。运运算算符符后后缀缀操操作作时
11、时返返回回的的时时原原有有对对象象值值,不不是是原原有有对对象象,原原有有对对象象已已经经被被增增量量修修改改,所所以以,返返回回的的应应该该是是存存放放原原有有对对象象值值的临时对象。的临时对象。(见例(见例1 1:+运算符重载)运算符重载)7.4 7.4 双目运算符重载双目运算符重载对对于于双双目目运运算算符符,一一个个运运算算数数是是对对象象本本身身的的数数据据,由由thisthis指指针针给给出出,另另一一个个运运算算数数则则需需要要通通过过运运算算符符重重载载函函数数的参数表来传递。下面分别介绍这两种情况。的参数表来传递。下面分别介绍这两种情况。将双目运算符将双目运算符B B重载为类
12、的成员函数:重载为类的成员函数:使之能够实现表达式使之能够实现表达式“oprd1 B oprd2”oprd1 B oprd2”,其中其中oprd1oprd1为为A A类的对象,则应当把类的对象,则应当把B B重载为重载为A A类的成员函数,该函数只有一个形参,形参的类型类的成员函数,该函数只有一个形参,形参的类型是是oprd2oprd2所属的类型。经过重载之后,表达式所属的类型。经过重载之后,表达式oprd1 B oprd1 B oprd2oprd2就相当于函数调用就相当于函数调用“oprd1.operator Boprd1.operator B(oprd2oprd2)”。将双目运算符将双目运
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第7章 运算符重载 运算 重载
限制150内