欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    第7章 运算符重载.ppt

    • 资源ID:67294403       资源大小:144.50KB        全文页数:21页
    • 资源格式: PPT        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第7章 运算符重载.ppt

    第第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+语言允许程序员重新定义已有的运算语言允许程序员重新定义已有的运算符,使其能按用户的要求完成一些特定的操符,使其能按用户的要求完成一些特定的操作,这就是所谓的作,这就是所谓的运算符重载运算符重载(operator(operator overload)overload)。运算符重载与函数重载相似,其。运算符重载与函数重载相似,其目的是设置某一运算符,让它具有另一种功目的是设置某一运算符,让它具有另一种功能,尽管此运算符在原先能,尽管此运算符在原先C+C+语言中代表另一语言中代表另一种含义,但他们彼此之间并不冲突。种含义,但他们彼此之间并不冲突。C+C+会根会根据运算符的位置辨别应使用哪一种功能进行据运算符的位置辨别应使用哪一种功能进行运算。运算。7.1 7.1 运算符重载概述运算符重载概述运运算算符符重重载载是是对对系系统统提提供供的的运运算算符符赋赋予予多多重重含含义义,同同一一个个运运算算符符作作用用于于不不同同类类型型的的数数据据导致不同类型的行为。导致不同类型的行为。运运算算符符重重载载的的实实质质就就是是函函数数重重载载。在在实实现现过过程程中中,首首先先把把指指定定的的运运算算表表达达式式转转化化为为对对运运算算符符函函数数的的调调用用,运运算算对对象象转转化化为为运运算算符符函函数数的的实实参参,然然后后根根据据实实参参的的类类型型来来确确定定需需要要调调用用的函数,这个过程是在编译过程中完成的。的函数,这个过程是在编译过程中完成的。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+中中的的运运算算符符除除了了少少数数几几个个以以外外,几几乎乎全全部部可可以以重载,而且只能重载已有的这些运算符。重载,而且只能重载已有的这些运算符。(2 2)重载之后运算符的优先级和结合性都不会改变重载之后运算符的优先级和结合性都不会改变。(3 3)运算符重载是针对新类型数据的实际需要,对原)运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。一般来讲,重载的功能应有运算符进行适当的改造。一般来讲,重载的功能应当与原有当与原有功能类似功能类似。(4 4)运算符重载不能改变原运算符的操作对象个数,运算符重载不能改变原运算符的操作对象个数,同时至少要有一个操作对象是自定义类型。同时至少要有一个操作对象是自定义类型。7.2 7.2 运算符重载的实现运算符重载的实现运运算算符符的的重重载载形形式式有有两两种种:重重载载为为类类的的成成员员函函数数和和重重载载为为类类的的友元函数。友元函数。1.1.运算符重载为类的成员函数的语法形式如下:运算符重载为类的成员函数的语法形式如下:operator operator ();friend friend operator operator ();其中其中:v 指定了重载运算符的返回值类型指定了重载运算符的返回值类型;voperatoroperator是定义运算符重载函数的关键词是定义运算符重载函数的关键词;v 给定了要重载的运算符名称,是给定了要重载的运算符名称,是C+C+中可重载的运算符中可重载的运算符;v 中给出重载运算符所需要的参数和类型中给出重载运算符所需要的参数和类型;v对对于于运运算算符符重重载载为为友友元元函函数数的的情情况况,还还要要在在函函数数类类型型说说明明之之前前使使用用friendfriend关键词来说明。关键词来说明。注意事项:注意事项:v当运算符重载为类的成员函数时,函数的参数个数比当运算符重载为类的成员函数时,函数的参数个数比原来的运算数个数要少一个(后缀原来的运算数个数要少一个(后缀+、-除外);当除外);当重载为类的友元函数时,参数个数与原运算数的个数重载为类的友元函数时,参数个数与原运算数的个数相同。相同。v单目运算符最好重载为成员函数;单目运算符最好重载为成员函数;v双目运算符则最好重载为友元函数;双目运算符则最好重载为友元函数;v运算符重载的含义必须清楚;运算符重载的含义必须清楚;v运算符重载不能有二义性;运算符重载不能有二义性;7.3 7.3 单目运算符重载单目运算符重载类类的的单单目目运运算算符符可可重重载载为为一一个个没没有有参参数数的的非非静静态态成成员员函函数数或或者者带带有有一一个个参参数数的的非非成成员员函函数数,参参数数必必须是用户字定义类型的对象或者是对该对象的引用。须是用户字定义类型的对象或者是对该对象的引用。在在C+C+中中,单单目目运运算算符符有有+和和-,它它们们是是变变量量自自动动增增1 1和和自自动动减减1 1的的运运算算符符。在在类类中中可可以以对对这这两两个个单单目运算符进行重载。目运算符进行重载。如如同同“+”+”运运算算符符有有前前缀缀、后后缀缀两两种种使使用用形形式式,“+”+”和和“-”-”重重载载运运算算符符也也有有前前缀缀和和后后缀缀两两种种运运算算符符重重载载形形式式,以以“+”+”重重载载运运算算符符为为例例,其其语语法法格式如下:格式如下:operator+operator+();();/前缀运算前缀运算 operator+operator+(intint);/后缀运算后缀运算 使用前缀运算符的语法格式如下:使用前缀运算符的语法格式如下:+;使使用用运运算算符符前前缀缀时时,对对对对象象(操操作作数数)进进行行增增量量修修改改,然然后后再再返返回回该该对对象象。所所以以前前缀缀运运算算符符操操作作时时,参参数数与与返返回回的的是是同同一一个个对对象象。这这与与基基本本数数据据类类型型的的运运算算符符前前缀缀类类似似,返返回的也是左值。回的也是左值。使用后缀运算符的语法格式如下:使用后缀运算符的语法格式如下:+;使使用用运运算算符符后后缀缀时时,必必须须再再增增量量之之前前返返回回原原有有的的对对象象值值。为为此此,需需要要创创建建一一个个临临时时对对象象,存存放放原原有有的的对对象象,以以便便对对操操作作数数(对对象象)进进行行增增量量修修改改时时,保保存存最最初初的的值值。运运算算符符后后缀缀操操作作时时返返回回的的时时原原有有对对象象值值,不不是是原原有有对对象象,原原有有对对象象已已经经被被增增量量修修改改,所所以以,返返回回的的应应该该是是存存放放原原有有对对象象值值的临时对象。的临时对象。(见例(见例1 1:+运算符重载)运算符重载)7.4 7.4 双目运算符重载双目运算符重载对对于于双双目目运运算算符符,一一个个运运算算数数是是对对象象本本身身的的数数据据,由由thisthis指指针针给给出出,另另一一个个运运算算数数则则需需要要通通过过运运算算符符重重载载函函数数的参数表来传递。下面分别介绍这两种情况。的参数表来传递。下面分别介绍这两种情况。将双目运算符将双目运算符B B重载为类的成员函数:重载为类的成员函数:使之能够实现表达式使之能够实现表达式“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)”。将双目运算符将双目运算符B B重载为类的友元函数:重载为类的友元函数:这样,它就可以自由这样,它就可以自由地访问该类的任何数据成员。这时,运算符所需要的运算地访问该类的任何数据成员。这时,运算符所需要的运算数都需要通过函数的形参表来传递,在参数表中形参从左数都需要通过函数的形参表来传递,在参数表中形参从左到右的顺序就是运算符运算数的顺序。到右的顺序就是运算符运算数的顺序。(见例(见例2 2:双目运算符重载):双目运算符重载)7.5 -7.5 -运算符重载运算符重载“-”-”运运算算符符是是成成员员访访问问运运算算符符,这这种种一一元元的的运运算算符符只只能能被被重重载载为为成成员员函函数数,所所以以也也决决定定了了它它不不能能定定义义任任何何参参数。数。1.1.成员访问运算符成员访问运算符“-”-”函数重载的一般形式为:函数重载的一般形式为:class_nameclass_name*class_name:operatorclass_name:operator-();();2.2.成员访问运算符的调用形式是:成员访问运算符的调用形式是:对象对象-成员;成员;/与对象指针调用成员比较与对象指针调用成员比较注意:注意:“-”-”成员重载运算符不能是静态成员函数;成员重载运算符不能是静态成员函数;通过对象通过对象-成员;实现访问的成员应该是成员;实现访问的成员应该是publicpublic型;型;(/例例1010:“-”-”运算符重载为成员函数)运算符重载为成员函数)7.6 7.6 赋值运算符重载赋值运算符重载在在C+C+中中有有两两种种类类型型的的赋赋值值运运算算符符:一一类类是是“+=”+=”和和“-=”-=”等等先先计计算算后后赋赋值值的的运运算算符符,另另一一类类是是“=”=”即直接赋值的运算符。下面分别进行讨论。即直接赋值的运算符。下面分别进行讨论。1.1.运算符运算符“+=”+=”和和“-=”-=”的重载的重载对于标准数据类型,对于标准数据类型,“+=”+=”和和“-=”-=”的作用是的作用是将一个数据与另一个数据进行加法或减法运算后再将一个数据与另一个数据进行加法或减法运算后再将结果回送给赋值号左边的变量中。对它们重载后,将结果回送给赋值号左边的变量中。对它们重载后,使其实现其他相关的功能。使其实现其他相关的功能。(见例(见例4 4:复合赋值运算符重载):复合赋值运算符重载)2.2.运算符运算符“=”=”的重载的重载赋赋值值运运算算符符“=”=”的的原原有有含含义义是是将将赋赋值值号号右右边边表表达达式式的的结结果果拷拷贝贝给给赋赋值值号号左左边边的的变变量量,通通过过运运算算符符“=”=”的的重重载载将将赋赋值值号号右右边边对对象象的的私私有有数数据据依依次次拷拷贝贝到到赋赋值值号号左左边边对对象象的的私私有有数数据据中中。在在正正常常情情况况下下,系系统统会会为为每每一一个个类类自自动动生生成成一一个个默默认认的的完完成成上上述述功功能能的的赋赋值值运运算算符符,当当然然,这这种种赋赋值值只只限于由一个类类型说明的对象之间赋值。限于由一个类类型说明的对象之间赋值。如果一个类包含指针成员,采用这种默认的按如果一个类包含指针成员,采用这种默认的按成员赋值,那么当这些成员撤消后,内存的使用成员赋值,那么当这些成员撤消后,内存的使用将变得不可靠。将变得不可靠。(见例(见例5 5:赋值运算符:赋值运算符“=”=”的重载)的重载)7.7 7.7 下标运算符重载下标运算符重载下下标标运运算算符符“”通通常常用用于于在在数数组组中中标标识识数数组组元元素素的的位位置置,通通过过下下标标运运算算符符重重载载可可以以实实现现数数组组数数据据的的赋值和取值。赋值和取值。下标运算符实质是求地址运算。下标运算符实质是求地址运算。下下标标运运算算符符重重载载函函数数只只能能作作为为类类的的成成员员函函数数,不不能能作作为类的友元函数。为类的友元函数。下标运算符下标运算符“”函数重载的一般形式为:函数重载的一般形式为:type class_name:operator type class_name:operator(intint argarg);其中其中argarg为该重载函数的参数。重载了的下标运算符只能且必为该重载函数的参数。重载了的下标运算符只能且必须带一个参数,该参数给出下标的值。重载函数须带一个参数,该参数给出下标的值。重载函数operator operator 的返回值类型的返回值类型typetype是引用类型。是引用类型。(见例(见例6 6:下标运算符重载:下标运算符重载 )7.8 7.8 运算符运算符newnew与与deletedelete重载重载C+C+提提供供了了newnew与与deletedelete两两个个运运算算符符用用于于内内存存管管理理,但但有有些些情情况况下下用用户户需需要要自自己己管管理理内内存存,为为自自己己所所定定义义的的类类体体系系建建立立一一种种新新的的动动态态内内存存管管理理算算法法,以以克克服服newnew与与deletedelete的的不不足足。这这就就要要重重载载运运算算符符newnew与与deletedelete,使其按照要求完成对内存的管理。使其按照要求完成对内存的管理。注意:注意:newnew和和deletedelete只只能能被被重重载载为为类类的的成成员员函函数数,不不能能重重载载为友元。为友元。重载了的重载了的newnew和和deletedelete均默认为类的静态成员函数。均默认为类的静态成员函数。v运算符运算符newnew重载的一般形式为:重载的一般形式为:void*class_name:operator newvoid*class_name:operator new(size_tsize_t ,););newnew重载应返回一个无值型的指针,且至少有一个类型为重载应返回一个无值型的指针,且至少有一个类型为size_tsize_t的参数。若该重载带有多于一个的参数,则其第一个参的参数。若该重载带有多于一个的参数,则其第一个参数的类型必须为数的类型必须为size_tsize_t。v运算符运算符deletedelete重载的一般形式为:重载的一般形式为:void*class_name:operator deletevoid*class_name:operator delete(void*void*,););deletedelete重载应返回一个无值型的指针,且至少有一个类型为无重载应返回一个无值型的指针,且至少有一个类型为无值型指针的参数。该重载最多可以带有两个参数,若有第二个值型指针的参数。该重载最多可以带有两个参数,若有第二个参数,则其第二个参数的类型必须为参数,则其第二个参数的类型必须为size_tsize_t。(见例(见例7 7:运算符:运算符newnew与与deletedelete重载)重载)7.9 7.9 逗号运算符重载逗号运算符重载逗号运算符是双目运算符,和其他运算符一样,逗号运算符是双目运算符,和其他运算符一样,也可以通过重载逗号运算符来完成期望完成的工作。也可以通过重载逗号运算符来完成期望完成的工作。逗号运算符构成的表达式为逗号运算符构成的表达式为“左运算数,右运算数左运算数,右运算数”,该表达式返回右运算数的值。如果用类的成员,该表达式返回右运算数的值。如果用类的成员函数来重载逗号运算符,则只带一个右运算数,而函数来重载逗号运算符,则只带一个右运算数,而左运算数由指针左运算数由指针thisthis提供。提供。(见例(见例8 8:逗号运算符重载):逗号运算符重载)7.10 7.10 类型转换运算符重载类型转换运算符重载类型转换运算符重载函数的格式如下:类型转换运算符重载函数的格式如下:operator operator ()();与以前的重载运算符函数不同的是,与以前的重载运算符函数不同的是,类型转换运算符重类型转换运算符重载函数没有返回类型,因为载函数没有返回类型,因为 就代表了它的返回类型,就代表了它的返回类型,而且也没有任何参数。而且也没有任何参数。在调用过程中要带一个对象实参。在调用过程中要带一个对象实参。类类型型转转换换运运算算符符的的实实质质将将对对象象转转换换成成类类型型名名规规定定的的类类型型。转转换换时时的的形形式式就就像像强强制制转转换换一一样样。如如果果没没有有转转换换运运算算符符定定义义,直直接接用用强强制制转转换换是是不不行行的的,因因为为强强制制转转换换只只能能对对标标准准数数据据类类型进行操作,对类类型的操作是没有定义的。型进行操作,对类类型的操作是没有定义的。类型转换运算符重载类型转换运算符重载的的缺点缺点是无法定义其是无法定义其类对象运算符操作的真正含义,因为只能进行类对象运算符操作的真正含义,因为只能进行相应对象成员数据和一般数据变量的转换操作。相应对象成员数据和一般数据变量的转换操作。(见例(见例9 9:类型转换运算符重载):类型转换运算符重载)课后思考题(编程验证)课后思考题(编程验证)将将“-”-”运算符重载为成员函数运算符重载为成员函数将将“”和和“”运算符重载运算符重载测试类类型转换运算符重载。如测试类类型转换运算符重载。如Circle(Circle(圆类圆类)与与PointPoint(点类)的转换。(点类)的转换。测试运算符测试运算符newnew和和deletedelete的重载,要求参数多于的重载,要求参数多于1 1个。个。

    注意事项

    本文(第7章 运算符重载.ppt)为本站会员(s****8)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

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

    收起
    展开