第7章 运算符重载优秀课件.ppt

上传人:石*** 文档编号:78745114 上传时间:2023-03-19 格式:PPT 页数:21 大小:1,014KB
返回 下载 相关 举报
第7章 运算符重载优秀课件.ppt_第1页
第1页 / 共21页
第7章 运算符重载优秀课件.ppt_第2页
第2页 / 共21页
点击查看更多>>
资源描述

《第7章 运算符重载优秀课件.ppt》由会员分享,可在线阅读,更多相关《第7章 运算符重载优秀课件.ppt(21页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第7章 运算符重载第1页,本讲稿共21页 C+C+语言允许程序员重新定义已有的运算符,使语言允许程序员重新定义已有的运算符,使其能按用户的要求完成一些特定的操作,这就是所其能按用户的要求完成一些特定的操作,这就是所谓的谓的运算符重载运算符重载(operator overload)(operator overload)。运算符重载。运算符重载与函数重载相似,其目的是设置某一运算符,让它具与函数重载相似,其目的是设置某一运算符,让它具有另一种功能,尽管此运算符在原先有另一种功能,尽管此运算符在原先C+C+语言中代表语言中代表另一种含义,但他们彼此之间并不冲突。另一种含义,但他们彼此之间并不冲突。C

2、+C+会根据会根据运算符的位置辨别应使用哪一种功能进行运算。运算符的位置辨别应使用哪一种功能进行运算。第2页,本讲稿共21页7.1 7.1 运算符重载概述运算符重载概述运运算算符符重重载载是是对对系系统统提提供供的的运运算算符符赋赋予予多多重重含含义义,同同一一个个运运算算符符作作用用于于不不同同类类型型的的数数据据导致不同类型的行为。导致不同类型的行为。运运算算符符重重载载的的实实质质就就是是函函数数重重载载。在在实实现现过过程程中中,首首先先把把指指定定的的运运算算表表达达式式转转化化为为对对运运算算符符函函数数的的调调用用,运运算算对对象象转转化化为为运运算算符符函函数数的的实实参参,然

3、然后后根根据据实实参参的的类类型型来来确确定定需需要要调调用用的函数,这个过程是在编译过程中完成的。的函数,这个过程是在编译过程中完成的。C+C+可以重载的运算符如表可以重载的运算符如表7-17-1所示所示 ;C+C+不能被重载的运算符如表不能被重载的运算符如表7-27-2所示。所示。第3页,本讲稿共21页表表7-1 7-1:C+C+可以重载的运算符可以重载的运算符!+-*&/%=!=|&+=*=/=%=&=|=,-*-()=+-newdelete表表7-2 7-2:C+C+不可以重载的运算符不可以重载的运算符.*:?:?:#第4页,本讲稿共21页v运算符重载的规则如下:运算符重载的规则如下:

4、(1 1)C+C+中中的的运运算算符符除除了了少少数数几几个个以以外外,几几乎乎全全部部可可以以重重载载,而且只能重载已有的这些运算符。而且只能重载已有的这些运算符。(2 2)重载之后运算符的优先级和结合性都不会改变重载之后运算符的优先级和结合性都不会改变。(3 3)运算符重载是针对新类型数据的实际需要,对原有)运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。一般来讲,重载的功能应当与运算符进行适当的改造。一般来讲,重载的功能应当与原有原有功能类似功能类似。(4 4)运算符重载不能改变原运算符的操作对象个数,同时运算符重载不能改变原运算符的操作对象个数,同时至少要有一个操作对

5、象是自定义类型。至少要有一个操作对象是自定义类型。第5页,本讲稿共21页7.2 7.2 运算符重载的实现运算符重载的实现运运算算符符的的重重载载形形式式有有两两种种:重重载载为为类类的的成成员员函函数数和和重重载载为为类类的的友友元函数。元函数。1.1.运算符重载为类的成员函数的语法形式如下:运算符重载为类的成员函数的语法形式如下:operator operator ();friend friend operator operator ();其中其中:指定了重载运算符的返回值类型指定了重载运算符的返回值类型;operatoroperator是定义运算符重载函数的关键词是定义运算符重载函数的关键

6、词;给定了要重载的运算符名称,是给定了要重载的运算符名称,是C+C+中可重载的运算符中可重载的运算符;中给出重载运算符所需要的参数和类型中给出重载运算符所需要的参数和类型;对对于于运运算算符符重重载载为为友友元元函函数数的的情情况况,还还要要在在函函数数类类型型说说明明之之前前使使用用friendfriend关关键键词来说明。词来说明。第6页,本讲稿共21页注意事项:注意事项:当运算符重载为类的成员函数时,函数的参数个数比原来当运算符重载为类的成员函数时,函数的参数个数比原来的运算数个数要少一个(后缀的运算数个数要少一个(后缀+、-除外);当重载为类除外);当重载为类的友元函数时,参数个数与原

7、运算数的个数相同。的友元函数时,参数个数与原运算数的个数相同。单目运算符最好重载为成员函数;单目运算符最好重载为成员函数;双目运算符则最好重载为友元函数;双目运算符则最好重载为友元函数;运算符重载的含义必须清楚;运算符重载的含义必须清楚;运算符重载不能有二义性;运算符重载不能有二义性;第7页,本讲稿共21页7.3 7.3 单目运算符重载单目运算符重载类类的的单单目目运运算算符符可可重重载载为为一一个个没没有有参参数数的的非非静静态态成成员员函函数数或或者者带带有有一一个个参参数数的的非非成成员员函函数数,参参数数必必须须是是用用户户字字定定义义类型的对象或者是对该对象的引用。类型的对象或者是对

8、该对象的引用。在在C+C+中中,单单目目运运算算符符有有+和和-,它它们们是是变变量量自自动动增增1 1和和自自动动减减1 1的的运运算算符符。在在类类中中可可以以对对这这两两个个单单目目运运算算符符进进行行重载。重载。如如同同“+”运运算算符符有有前前缀缀、后后缀缀两两种种使使用用形形式式,“+”和和“-”重重载载运运算算符符也也有有前前缀缀和和后后缀缀两两种种运运算算符符重重载载形式,以形式,以“+”重载运算符为例,其语法格式如下:重载运算符为例,其语法格式如下:operator+operator+();();/前缀运算前缀运算 operator+operator+(intint););/

9、后缀运算后缀运算 第8页,本讲稿共21页使用前缀运算符的语法格式如下:使用前缀运算符的语法格式如下:+;使使用用运运算算符符前前缀缀时时,对对对对象象(操操作作数数)进进行行增增量量修修改改,然然后后再再返返回回该该对对象象。所所以以前前缀缀运运算算符符操操作作时时,参参数数与与返返回回的的是是同同一一个个对象。这与基本数据类型的运算符前缀类似,返回的也是左值。对象。这与基本数据类型的运算符前缀类似,返回的也是左值。使用后缀运算符的语法格式如下:使用后缀运算符的语法格式如下:+;使使用用运运算算符符后后缀缀时时,必必须须再再增增量量之之前前返返回回原原有有的的对对象象值值。为为此此,需需要要创

10、创建建一一个个临临时时对对象象,存存放放原原有有的的对对象象,以以便便对对操操作作数数(对对象象)进进行行增增量量修修改改时时,保保存存最最初初的的值值。运运算算符符后后缀缀操操作作时时返返回回的的时时原原有有对对象象值值,不不是是原原有有对对象象,原原有有对对象象已已经经被被增增量量修修改改,所所以以,返返回回的的应应该该是是存存放放原原有有对对象象值的临时对象。值的临时对象。(见例(见例1 1:+运算符重载)运算符重载)第9页,本讲稿共21页7.4 7.4 双目运算符重载双目运算符重载对对于于双双目目运运算算符符,一一个个运运算算数数是是对对象象本本身身的的数数据据,由由thisthis指

11、指针针给给出出,另另一一个个运运算算数数则则需需要要通通过过运运算算符符重重载载函函数数的的参参数数表表来来传传递。下面分别介绍这两种情况。递。下面分别介绍这两种情况。将双目运算符将双目运算符B B重载为类的成员函数:重载为类的成员函数:使之能够实现表达式使之能够实现表达式“oprd1 B oprd1 B oprd2oprd2”,其中,其中oprd1oprd1为为A A类的对象,则应当把类的对象,则应当把B B重载为重载为A A类的成员函数,类的成员函数,该函数只有一个形参,形参的类型是该函数只有一个形参,形参的类型是oprd2oprd2所属的类型。经过重载之后,所属的类型。经过重载之后,表达

12、式表达式oprd1 B oprd2oprd1 B oprd2就相当于函数调用就相当于函数调用“oprd1.operator oprd1.operator B B(oprd2oprd2)”。将双目运算符将双目运算符B B重载为类的友元函数:重载为类的友元函数:这样,它就可以自由地访问该这样,它就可以自由地访问该类的任何数据成员。这时,运算符所需要的运算数都需要通过函数类的任何数据成员。这时,运算符所需要的运算数都需要通过函数的形参表来传递,在参数表中形参从左到右的顺序就是运算符运算的形参表来传递,在参数表中形参从左到右的顺序就是运算符运算数的顺序。数的顺序。(见例(见例2 2:双目运算符重载):

13、双目运算符重载)第10页,本讲稿共21页7.5 -7.5 -运算符重载运算符重载“-”运运算算符符是是成成员员访访问问运运算算符符,这这种种一一元元的的运运算算符符只只能能被被重重载为成员函数载为成员函数,所以也决定了它不能定义任何参数。,所以也决定了它不能定义任何参数。1.1.成员访问运算符成员访问运算符“-”函数重载的一般形式为:函数重载的一般形式为:class_name*class_name:operator-class_name*class_name:operator-();();2.2.成员访问运算符的调用形式是:成员访问运算符的调用形式是:对象对象-成员;成员;/与对象指针调用成员

14、比较与对象指针调用成员比较注意:注意:“-”成员重载运算符不能是静态成员函数;成员重载运算符不能是静态成员函数;通过对象通过对象-成员;实现访问的成员应该是成员;实现访问的成员应该是publicpublic型;型;(/例例1010:“-”运算符重载为成员函数)运算符重载为成员函数)第11页,本讲稿共21页7.6 7.6 赋值运算符重载赋值运算符重载在在C+C+中中有有两两种种类类型型的的赋赋值值运运算算符符:一一类类是是“+=+=”和和“-=-=”等等先先计计算算后后赋赋值值的的运运算算符符,另另一一类类是是“=”即即直接赋值的运算符。下面分别进行讨论。直接赋值的运算符。下面分别进行讨论。1.

15、1.运算符运算符“+=+=”和和“-=-=”的重载的重载对于标准数据类型,对于标准数据类型,“+=+=”和和“-=-=”的作用是将一个的作用是将一个数据与另一个数据进行加法或减法运算后再将结果回送给赋数据与另一个数据进行加法或减法运算后再将结果回送给赋值号左边的变量中。对它们重载后,使其实现其他相关的功值号左边的变量中。对它们重载后,使其实现其他相关的功能。能。(见例(见例4 4:复合赋值运算符重载):复合赋值运算符重载)第12页,本讲稿共21页2.2.运算符运算符“=”的重载的重载赋赋值值运运算算符符“=”的的原原有有含含义义是是将将赋赋值值号号右右边边表表达达式式的的结结果果拷拷贝贝给给赋

16、赋值值号号左左边边的的变变量量,通通过过运运算算符符“=”的的重重载载将将赋赋值值号号右右边边对对象象的的私私有有数数据据依依次次拷拷贝贝到到赋赋值值号号左左边边对对象象的的私私有有数数据据中中。在在正正常常情情况况下下,系系统统会会为为每每一一个个类类自自动动生生成成一一个个默默认认的的完完成成上上述述功功能能的的赋赋值值运运算算符符,当当然然,这这种种赋赋值值只只限限于于由由一一个个类类类类型型说说明明的的对对象象之之间间赋赋值。值。如果一个类包含指针成员,采用这种默认的按如果一个类包含指针成员,采用这种默认的按成员赋值,那么当这些成员撤消后,内存的使用将成员赋值,那么当这些成员撤消后,内

17、存的使用将变得不可靠。变得不可靠。(见例(见例5 5:赋值运算符:赋值运算符“=”的重载)的重载)第13页,本讲稿共21页7.7 7.7 下标运算符重载下标运算符重载下下标标运运算算符符“”通通常常用用于于在在数数组组中中标标识识数数组组元元素素的的位位置,通过下标运算符重载可以实现数组数据的赋值和取值。置,通过下标运算符重载可以实现数组数据的赋值和取值。下标运算符实质是求地址运算。下标运算符实质是求地址运算。下下标标运运算算符符重重载载函函数数只只能能作作为为类类的的成成员员函函数数,不不能能作作为为类类的的友元函数。友元函数。下标运算符下标运算符“”函数重载的一般形式为:函数重载的一般形式

18、为:type class_name:operator type class_name:operator(int argint arg););其中其中argarg为该重载函数的参数。重载了的下标运算符只能且必须带一为该重载函数的参数。重载了的下标运算符只能且必须带一个参数,该参数给出下标的值。重载函数个参数,该参数给出下标的值。重载函数operator operator 的返回值类型的返回值类型typetype是引用类型。是引用类型。(见例(见例6 6:下标运算符重载:下标运算符重载 )第14页,本讲稿共21页7.8 7.8 运算符运算符newnew与与deletedelete重载重载C+C+提

19、提供供了了newnew与与deletedelete两两个个运运算算符符用用于于内内存存管管理理,但但有有些些情情况况下下用用户户需需要要自自己己管管理理内内存存,为为自自己己所所定定义义的的类类体体系系建建立立一一种种新新的的动动态态内内存存管管理理算算法法,以以克克服服newnew与与deletedelete的的不不足足。这这就就要要重重载载运运算算符符newnew与与deletedelete,使其按照要求完成对内存的管理。,使其按照要求完成对内存的管理。注意:注意:newnew和和deletedelete只只能能被被重重载载为为类类的的成成员员函函数数,不不能能重重载载为为友元。友元。重载

20、了的重载了的newnew和和deletedelete均默认为类的静态成员函数。均默认为类的静态成员函数。第15页,本讲稿共21页v运算符运算符newnew重载的一般形式为:重载的一般形式为:void*class_name:operator newvoid*class_name:operator new(size_t size_t,););newnew重载应返回一个无值型的指针,且至少有一个类型为重载应返回一个无值型的指针,且至少有一个类型为size_tsize_t的参数。的参数。若该重载带有多于一个的参数,则其第一个参数的类型必须为若该重载带有多于一个的参数,则其第一个参数的类型必须为size

21、_tsize_t。v运算符运算符deletedelete重载的一般形式为:重载的一般形式为:void*class_name:operator deletevoid*class_name:operator delete(void*void*,););deletedelete重载应返回一个无值型的指针,且至少有一个类型为无值型指针的重载应返回一个无值型的指针,且至少有一个类型为无值型指针的参数。该重载最多可以带有两个参数,若有第二个参数,则其第二个参数参数。该重载最多可以带有两个参数,若有第二个参数,则其第二个参数的类型必须为的类型必须为size_tsize_t。(见例(见例7 7:运算符:运算符

22、newnew与与deletedelete重载)重载)第16页,本讲稿共21页7.9 7.9 逗号运算符重载逗号运算符重载逗号运算符是双目运算符,和其他运算符一样,逗号运算符是双目运算符,和其他运算符一样,也可以通过重载逗号运算符来完成期望完成的工作。也可以通过重载逗号运算符来完成期望完成的工作。逗号运算符构成的表达式为逗号运算符构成的表达式为“左运算数,右运算数左运算数,右运算数”,该表达式返回右运算数的值。如果用类的成员函,该表达式返回右运算数的值。如果用类的成员函数来重载逗号运算符,则只带一个右运算数,而左数来重载逗号运算符,则只带一个右运算数,而左运算数由指针运算数由指针thisthis

23、提供。提供。(见例(见例8 8:逗号运算符重载):逗号运算符重载)第17页,本讲稿共21页7.10 7.10 类型转换运算符重载类型转换运算符重载类型转换运算符重载函数的格式如下:类型转换运算符重载函数的格式如下:operator operator ()();与以前的重载运算符函数不同的是,与以前的重载运算符函数不同的是,类型转换运算符重载函数类型转换运算符重载函数没有返回类型,因为没有返回类型,因为 就代表了它的返回类型,而且也没有任何就代表了它的返回类型,而且也没有任何参数。参数。在调用过程中要带一个对象实参。在调用过程中要带一个对象实参。类类型型转转换换运运算算符符的的实实质质将将对对象

24、象转转换换成成类类型型名名规规定定的的类类型型。转转换换时时的的形形式式就就像像强强制制转转换换一一样样。如如果果没没有有转转换换运运算算符符定定义义,直直接接用用强强制制转转换换是是不不行行的的,因因为为强强制制转转换换只只能能对对标标准准数数据据类类型型进行操作,对类类型的操作是没有定义的。进行操作,对类类型的操作是没有定义的。第18页,本讲稿共21页类型转换运算符重载类型转换运算符重载的的缺点缺点是无法定义其类对象是无法定义其类对象运算符操作的真正含义,因为只能进行相应对象成员运算符操作的真正含义,因为只能进行相应对象成员数据和一般数据变量的转换操作。数据和一般数据变量的转换操作。(见例(见例9 9:类型转换运算符重载):类型转换运算符重载)第19页,本讲稿共21页第20页,本讲稿共21页课后思考题(编程验证)课后思考题(编程验证)将将“-”运算符重载为成员函数运算符重载为成员函数将将“”和和“”运算符重载运算符重载测试类类型转换运算符重载。如测试类类型转换运算符重载。如Circle(Circle(圆类圆类)与与PointPoint(点类)的转换。(点类)的转换。测试运算符测试运算符newnew和和deletedelete的重载,要求参数多于的重载,要求参数多于1 1个。个。第21页,本讲稿共21页

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 资格考试

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁