运算符重载解读.ppt

上传人:wuy****n92 文档编号:78650070 上传时间:2023-03-18 格式:PPT 页数:26 大小:553.50KB
返回 下载 相关 举报
运算符重载解读.ppt_第1页
第1页 / 共26页
运算符重载解读.ppt_第2页
第2页 / 共26页
点击查看更多>>
资源描述

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

1、C+程序设计程序设计西南林业大学计科系西南林业大学计科系邢丽伟邢丽伟4.运算符重载运算符重载4.1 4.1 什么是运算符重载什么是运算符重载4.2 4.2 运算符重载的方法运算符重载的方法4.3 4.3 重载运算符的规则重载运算符的规则4.4 4.4 运算符重载函数作为类成员函数和友元函数运算符重载函数作为类成员函数和友元函数4.5 4.5 重载双目运算符重载双目运算符4.6 4.6 重载单目运算符重载单目运算符4.运算符重载运算符重载n4.1 什么是运算符重载什么是运算符重载n所谓重载,就是重新赋予新的含义。函数重载就是所谓重载,就是重新赋予新的含义。函数重载就是对一个已有的函数赋予新的含义

2、,使之实现新功能。对一个已有的函数赋予新的含义,使之实现新功能。同样,运算符也可以重载。同样,运算符也可以重载。n现在要讨论的问题是:现在要讨论的问题是:用户能否根据自己的需要对用户能否根据自己的需要对C+已提供的运算符进行重载,赋予它们新的含义,已提供的运算符进行重载,赋予它们新的含义,使之一名多用。使之一名多用。n譬如,能否用譬如,能否用“+”号进行两个复数的相加。在号进行两个复数的相加。在C+中不能在程序中直接用运算符中不能在程序中直接用运算符“+”对复数进行相加对复数进行相加运算。用户必须自己设法实现复数相加。例如用户可运算。用户必须自己设法实现复数相加。例如用户可以通过定义一个专门的

3、函数来实现复数相加。见例以通过定义一个专门的函数来实现复数相加。见例4.1。n结果是正确的,但调用方式不直观、不方便。能否也结果是正确的,但调用方式不直观、不方便。能否也和整数的加法运算一样,直接用加号和整数的加法运算一样,直接用加号“+”来实现复来实现复数运算呢?如数运算呢?如c3=c1+c2;这就需要对运算符这就需要对运算符“+”进进行重载。行重载。4.运算符重载运算符重载n4.2 运算符重载的方法运算符重载的方法n运算符重载的方法是定义一个重载运算符的函数,在运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,需要执行被重载的运算符时,系统就自动

4、调用该函数,以实现相应的运算。也就是说,运算符重载是通过定以实现相应的运算。也就是说,运算符重载是通过定义函数实现的。运算符重载实质上是函数的重载。义函数实现的。运算符重载实质上是函数的重载。n重载运算符的函数一般格式如下:重载运算符的函数一般格式如下:n函数类型函数类型 operator 运算符名称运算符名称(形参列表形参列表)n 对运算符的重载处理对运算符的重载处理 n例如,想将例如,想将“+”用于用于Complex类类(复数复数)的加法运的加法运算,函数的原型可以是这样的:算,函数的原型可以是这样的:nComplex operator+(Complex&c1,Complex&c2);4.

5、运算符重载运算符重载n例例4.24.运算符重载运算符重载比较例比较例4.1和例和例4.2,只有两处不同:,只有两处不同:(1)在例在例4.2中以中以operator+函数取代了例函数取代了例4.1中的中的complex_add函数,而且只是函数名不同,函数体和函数返回值的类型函数,而且只是函数名不同,函数体和函数返回值的类型都是相同的。都是相同的。(2)在在main函数中,以函数中,以“c3=c1+c2;”取代了例取代了例4.1中的中的“c3=plex_add(c2);”。在将运算符。在将运算符+重载为类的重载为类的成员函数后,成员函数后,C+编译系统将程序中的表达式编译系统将程序中的表达式c

6、1+c2解释为解释为nc1.operator+(c2)/其中其中c1和和c2是是Complex类的对象类的对象n即以即以c2为实参调用为实参调用c1的运算符重载函数的运算符重载函数operator+(Complex&c2),进行求值,得到两个复数之和。,进行求值,得到两个复数之和。4.运算符重载运算符重载n虽然重载运算符所实现的功能完全可以用函数实现,但是使虽然重载运算符所实现的功能完全可以用函数实现,但是使用运算符重载能使用户程序易于编写、阅读和维护。在实际用运算符重载能使用户程序易于编写、阅读和维护。在实际工作中,类的声明和类的使用往往是分离的。假如在声明工作中,类的声明和类的使用往往是分

7、离的。假如在声明Complex类时,对运算符类时,对运算符+,-,*,/都进行了重载,那么使用这个都进行了重载,那么使用这个类的用户在编程时可以完全不考虑函数是怎么实现的,放心类的用户在编程时可以完全不考虑函数是怎么实现的,放心大胆地直接使用大胆地直接使用+,-,*,/进行复数的运算即可,十分方便。进行复数的运算即可,十分方便。n对上面的运算符重载函数对上面的运算符重载函数operator+还可以改写得更简练一些:还可以改写得更简练一些:nComplex Complex operator+(Complex&c2)nreturn Complex(real+c2.real,imag+c2.imag

8、);n需要说明的是:需要说明的是:运算符被重载后,其原有的功能仍然保留,运算符被重载后,其原有的功能仍然保留,没有丧失或改变。没有丧失或改变。n通过运算符重载,扩大了通过运算符重载,扩大了C+已有运算符的作用范围,使之已有运算符的作用范围,使之能用于类对象。能用于类对象。n运算符重载对运算符重载对C+有重要的意义,把运算符重载和类结合起有重要的意义,把运算符重载和类结合起来,可以在来,可以在C+程序中定义出很有实用意义而使用方便的新程序中定义出很有实用意义而使用方便的新的数据类型。运算符重载使的数据类型。运算符重载使C+具有更强大的功能、更好的具有更强大的功能、更好的可扩充性和适应性,这是可扩

9、充性和适应性,这是C+最吸引人的特点之一。最吸引人的特点之一。4.运算符重载运算符重载n4.3 重载运算符的规则重载运算符的规则nC+不允许用户自己定义新的运算符,只能对已有的不允许用户自己定义新的运算符,只能对已有的C+运算符进行重载。运算符进行重载。nC+允许重载的运算符允许重载的运算符nC+中绝大部分的运算符允许重载。不能重载的运中绝大部分的运算符允许重载。不能重载的运算符只有算符只有5个:个:.(成员访问运算符成员访问运算符).*.*(成员指针访问运算符成员指针访问运算符)(域运算符域运算符)sizeofsizeof (长度运算符长度运算符)?:?:(条件运算符条件运算符)n前两个运算

10、符不能重载是为了保证访问成员的功能前两个运算符不能重载是为了保证访问成员的功能不能被改变,域运算符和不能被改变,域运算符和sizeof运算符的运算对象是运算符的运算对象是类型而不是变量或一般表达式,不具重载的特征。类型而不是变量或一般表达式,不具重载的特征。4.运算符重载运算符重载n重载不能改变运算符运算对象重载不能改变运算符运算对象(即操作数即操作数)的个数。的个数。n重载不能改变运算符的优先级别。重载不能改变运算符的优先级别。n重载不能改变运算符的结合性。重载不能改变运算符的结合性。n重载的运算符必须和用户定义的自定义类型的对象一起使重载的运算符必须和用户定义的自定义类型的对象一起使用,其

11、参数至少应有一个是类对象用,其参数至少应有一个是类对象(或类对象的引用或类对象的引用)。也。也就是说,参数不能全部是就是说,参数不能全部是C+的标准类型,以防止用户修的标准类型,以防止用户修改用于标准类型数据的运算符的性质。改用于标准类型数据的运算符的性质。n用于类对象的运算符一般必须重载,但有两个例外,运算用于类对象的运算符一般必须重载,但有两个例外,运算符符“=”和和“&”不必用户重载。不必用户重载。n赋值运算符赋值运算符(=)可以用于每一个类对象,可以利用它在同类对象可以用于每一个类对象,可以利用它在同类对象之间相互赋值。之间相互赋值。n地址运算符地址运算符&也不必重载,它能返回类对象在

12、内存中的起始地址。也不必重载,它能返回类对象在内存中的起始地址。n应当使重载运算符的功能类似于该运算符作用于标准类型应当使重载运算符的功能类似于该运算符作用于标准类型数据时所实现的功能。数据时所实现的功能。n运算符重载函数可以是类的成员函数,也可以是类的友元运算符重载函数可以是类的成员函数,也可以是类的友元函数,还可以是普通函数。函数,还可以是普通函数。4.运算符重载运算符重载n4.4 运算符重载函数作为类成员函数和友元函数运算符重载函数作为类成员函数和友元函数n在例在例4.2程序中对运算符程序中对运算符“+”进行了重载,使之能用于两个进行了重载,使之能用于两个复数的相加。在该例中运算符重载函

13、数复数的相加。在该例中运算符重载函数operator+作为作为Complex类中的成员函数。类中的成员函数。n“+”是双目运算符,为什么在例是双目运算符,为什么在例4.2程序中的重载函数中只程序中的重载函数中只有一个参数呢?实际上,运算符重载函数有两个参数,由于有一个参数呢?实际上,运算符重载函数有两个参数,由于重载函数是重载函数是Complex类中的成员函数,有一个参数是隐含的,类中的成员函数,有一个参数是隐含的,运算符函数是用运算符函数是用this指针隐式地访问类对象的成员。指针隐式地访问类对象的成员。nthis-real+c2.real,this-real就是就是c1.real。n在将运

14、算符函数重载为成员函数后,如果出现含该运算符的在将运算符函数重载为成员函数后,如果出现含该运算符的表达式,如表达式,如c1+c2,编译系统把它解释为编译系统把它解释为nc1.operator+(c2)n即通过对象即通过对象c1调用运算符重载函数,并以表达式中第二个参调用运算符重载函数,并以表达式中第二个参数数(运算符右侧的类对象运算符右侧的类对象c2)作为函数实参。运算符重载函数作为函数实参。运算符重载函数的返回值是的返回值是Complex类型,返回值是复数类型,返回值是复数c1和和c2之和之和(Complex(c1.real+c2.real,c1.imag+c2.imag)。4.运算符重载运

15、算符重载n运算符重载函数除了可以作为类的成员函数外,还可以运算符重载函数除了可以作为类的成员函数外,还可以是非成员函数。可以将例是非成员函数。可以将例4.2改写为例改写为例4.3。n例例4.3 将运算符将运算符“+”重载为适用于复数加法,重载函数重载为适用于复数加法,重载函数不作为成员函数,而放在类外,作为不作为成员函数,而放在类外,作为Complex类的友元函类的友元函数。数。4.运算符重载运算符重载n与例与例4.2相比较,只作了一处改动,将运算符函数不作相比较,只作了一处改动,将运算符函数不作为成员函数,而把它放在类外,在为成员函数,而把它放在类外,在Complex类中声明类中声明它为友元

16、函数。同时将运算符函数改为有两个参数。它为友元函数。同时将运算符函数改为有两个参数。在将运算符在将运算符“+”重载为非成员函数后,重载为非成员函数后,C+编译系统编译系统将程序中的表达式将程序中的表达式c1+c2解释为解释为noperator+(c1,c2)n即执行即执行c1+c2相当于调用以下函数:相当于调用以下函数:nComplex operator+(Complex&c1,Complex&c2)nreturn Complex(c1.real+c2.real,c1.imag+c2.imag);n为什么把运算符函数作为友元函数呢?因为运算符函为什么把运算符函数作为友元函数呢?因为运算符函数要

17、访问数要访问Complex类对象中的成员。如果运算符函数类对象中的成员。如果运算符函数不是不是Complex类的友元函数,而是一个普通的函数,类的友元函数,而是一个普通的函数,它是没有权利访问它是没有权利访问Complex类的私有成员的。类的私有成员的。4.运算符重载运算符重载n运算符重载函数可以是运算符重载函数可以是类的成员函数类的成员函数,也可以是,也可以是类类的友元函数的友元函数,还可以是既非类的成员函数也不是友,还可以是既非类的成员函数也不是友元函数的元函数的普通函数普通函数。现在分别讨论这。现在分别讨论这3种情况。种情况。n首先,只有在极少的情况下才使用既不是类的成员函数首先,只有在

18、极少的情况下才使用既不是类的成员函数也不是友元函数的普通函数,原因是普通函数不能直接也不是友元函数的普通函数,原因是普通函数不能直接访问类的私有成员。访问类的私有成员。n在剩下的两种方式中,什么时候应该用成员函数方在剩下的两种方式中,什么时候应该用成员函数方式,什么时候应该用友元函数方式?二者有何区别式,什么时候应该用友元函数方式?二者有何区别呢?呢?n如果将运算符重载函数作为成员函数,它可以通过如果将运算符重载函数作为成员函数,它可以通过this指针自由地访问本类的数据成员,因此可以少写一个函指针自由地访问本类的数据成员,因此可以少写一个函数的参数。但必须要求运算表达式数的参数。但必须要求运

19、算表达式第一个参数第一个参数(即运算即运算符左侧的操作数符左侧的操作数)是一个类对象是一个类对象,而且与运算符函数的而且与运算符函数的类型相同类型相同。因为必须通过类的对象去调用该类的成员函。因为必须通过类的对象去调用该类的成员函数,而且只有运算符重载函数返回值与该对象同类型,数,而且只有运算符重载函数返回值与该对象同类型,运算结果才有意义。运算结果才有意义。4.运算符重载运算符重载n如想将一个复数和一个整数相加,如如想将一个复数和一个整数相加,如c1+i,可以将运算,可以将运算符重载函数作为成员函数,如下面的形式:符重载函数作为成员函数,如下面的形式:Complex Complex oper

20、ator+(int&i)return Complex(real+i,imag);n注意在表达式中重载的运算符注意在表达式中重载的运算符“+”左侧应为左侧应为Complex类的对象,如类的对象,如 c3=c2+i;不能写成不能写成 c3=i+c2;n如果出于某种考虑,要求在使用重载运算符时运算符如果出于某种考虑,要求在使用重载运算符时运算符左侧的操作数是整型量(如表达式左侧的操作数是整型量(如表达式i+c2,运算符左侧,运算符左侧的操作数的操作数i是整数)则运算符重载函数不能作为成员函是整数)则运算符重载函数不能作为成员函数,只能作为非成员函数。数,只能作为非成员函数。4.运算符重载运算符重载n

21、可以在可以在Complex类中声明:类中声明:friend Complex operator+(int&i,Complex&c);n在类外定义友元函数:在类外定义友元函数:Complex operator+(int&i,Complex&c)/运算符重载函数不是成员函数运算符重载函数不是成员函数return Complex(i+c.real,c.imag);n此时,此时,c3=i+c2;正确,类型匹配正确,类型匹配n如果希望如果希望c3=c2+i;也合法,则应再重载一次运算符也合法,则应再重载一次运算符“+”。如如Complex operator+(Complex&c,int&i)/此时第一个参

22、数为类对象此时第一个参数为类对象return Complex(i+c.real,c.imag);n由于友元的使用会破坏类的封装,因此从原则上说,要尽由于友元的使用会破坏类的封装,因此从原则上说,要尽量将运算符函数作为成员函数。但考虑到各方面的因素,量将运算符函数作为成员函数。但考虑到各方面的因素,一般将单目运算符重载为成员函数,将双目运算符重载为一般将单目运算符重载为成员函数,将双目运算符重载为友元函数。友元函数。4.运算符重载运算符重载n4.5 重载双目运算符重载双目运算符n双目运算符双目运算符(或称二元运算符或称二元运算符)是是C+中最常用的运中最常用的运算符。双目运算符有两个操作数,通常

23、在运算符的算符。双目运算符有两个操作数,通常在运算符的左右两侧,如左右两侧,如3+5,a=b,i10等。等。n例例4.4 定义一个字符串类定义一个字符串类String,用来存放不定长的,用来存放不定长的字符串,重载运算符字符串,重载运算符“=”,“”,用于,用于两个字符串的等于、小于和大于的比较运算。两个字符串的等于、小于和大于的比较运算。4.运算符重载运算符重载4.运算符重载运算符重载4.运算符重载运算符重载4.运算符重载运算符重载n4.6 重载单目运算符重载单目运算符n单目运算符只有一个操作数,如单目运算符只有一个操作数,如!a,-b,&c,*p,还有最常用的,还有最常用的+i和和-i等。

24、重载单目等。重载单目运算符的方法与重载双目运算符的方法是类运算符的方法与重载双目运算符的方法是类似的。由于单目运算符只有一个操作数,因似的。由于单目运算符只有一个操作数,因此运算符重载函数只有一个参数,如果运算此运算符重载函数只有一个参数,如果运算符重载函数作为成员函数,则还可省略此参符重载函数作为成员函数,则还可省略此参数。数。n例例4.5 有一个有一个Time类,包含数据成员类,包含数据成员minute(分分)和和sec(秒秒),模拟秒表,每次走一秒,满,模拟秒表,每次走一秒,满60秒进一分钟,此时秒又从秒进一分钟,此时秒又从0开始算。要求开始算。要求输出分和秒的值。输出分和秒的值。4.运

25、算符重载运算符重载4.运算符重载运算符重载n可以看到:可以看到:在程序中对运算符在程序中对运算符“+”进行了进行了重载,使它能用于重载,使它能用于Time类对象。类对象。“+”和和“-”运算符有两种使用方式,前置自增运运算符有两种使用方式,前置自增运算符和后置自增运算符,它们的作用是不一算符和后置自增运算符,它们的作用是不一样的,在重载时怎样区别这二者呢?样的,在重载时怎样区别这二者呢?n针对针对“+”和和“-”这一特点,这一特点,C+约定:约定:在自增在自增(自减自减)运算符重载函数中,运算符重载函数中,增加一个增加一个int型形参型形参,就是,就是后置后置自增自增(自减自减)运算符函数。运

26、算符函数。n例例4.6 在例在例4.5程序的基础上增加对后置自增程序的基础上增加对后置自增运算符的重载。运算符的重载。4.运算符重载运算符重载4.运算符重载运算符重载重载后置自增运算符时,多了一重载后置自增运算符时,多了一个个intint型的参数,增加这个参数型的参数,增加这个参数只是为了与前置自增运算符重载只是为了与前置自增运算符重载函数有所区别,此外没有任何作函数有所区别,此外没有任何作用。编译系统在遇到重载后置自用。编译系统在遇到重载后置自增运算符时,会自动调用此函数。增运算符时,会自动调用此函数。练习:练习:n定义一个描述平面中点的类定义一个描述平面中点的类Point,成员变量包括,成员变量包括点的坐标点的坐标xPoint,yPoint,并且都为私有变量,利,并且都为私有变量,利用类的构造函数为对象设初值用类的构造函数为对象设初值point1(0,0),),point2(3.0,4.0),在主函数中定义两点并利用友),在主函数中定义两点并利用友元函数计算两点间的距离。元函数计算两点间的距离。n使用数学函数使用数学函数sqrt需包含库函数需包含库函数#include

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

当前位置:首页 > 教育专区 > 大学资料

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

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