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

    第18章 运算符重载.ppt

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

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

    第18章 运算符重载.ppt

    1 1 1 1第第18章章运算符重载2 2为运算符定义新的运算功能,使它除具备有为运算符定义新的运算功能,使它除具备有原来系统规定的功能外,还具备有新定义的原来系统规定的功能外,还具备有新定义的功能。功能。例如运算符例如运算符“”,原来规定它能进行整数,原来规定它能进行整数相加和实数相加功能,我们可以对它进行重相加和实数相加功能,我们可以对它进行重载,使它具有复数相加、矩阵相加、同一个载,使它具有复数相加、矩阵相加、同一个类的对象相加等功能。类的对象相加等功能。2 2运算符重载运算符重载3 3 3 3运算符重载运算符重载运算符重载就是将程序设计语言本身提供的运运算符重载就是将程序设计语言本身提供的运算符的功能进行重定义,使该运算符运用于内算符的功能进行重定义,使该运算符运用于内部基本数据类型的语义和语法同样运用于类对部基本数据类型的语义和语法同样运用于类对象等用户自定义类型象等用户自定义类型有了运算符的重载,编程会更加有个性,程序有了运算符的重载,编程会更加有个性,程序的可读性和可理解性也有所提高的可读性和可理解性也有所提高4 4 4 4classCComplexprivate:doublereal,image;public:CComplex(doubler=0.0,doublei=0.0)real=r;image=i;CComplex&addComplexToItself(constCComplex&r_c)real+=r_c.real;image+=r_c.image;return*this;voidprint()constif(image0)coutrealimage0)coutreal+imagein;elsecoutrealendl;voidmain()CComplexa(3,4),b(5,6);a=a.addComplexToItself(b);a+=b;/error,运算符+=没有被重载a.print();5 5 5 5CComplexCComplex类定义了一个类定义了一个addComplexToItself()addComplexToItself()成员成员函数实现复数类对象的自增运算函数实现复数类对象的自增运算基本数据类型变量的自增可以用基本数据类型变量的自增可以用+=+=运算符实现运算符实现能否直接对一个能否直接对一个CCompleCComple类对象进行类对象进行+=+=运算运算?如如a+=ba+=b这里的运算符重载问题这里的运算符重载问题怎样重新定义怎样重新定义+=+=运算符运算符的功能使之能对两个复数类对象操作的功能使之能对两个复数类对象操作6 6 6 6运算符重载运算符重载运算符重载是通过函数实现的,运算符的重载运算符重载是通过函数实现的,运算符的重载即函数的重载。运算符重载函数的一般形式为:即函数的重载。运算符重载函数的一般形式为:返回类型返回类型 operator operator 运算符符号运算符符号 (参数说明参数说明););7 7 7 7运算符重载举例运算符重载举例CComplexCComplex类定义一个运算符重载函数类定义一个运算符重载函数 CComplex&operator+=(const CComplex CComplex&operator+=(const CComplex&r_c)&r_c)编译程序将复数类对象的运算表达式转化为对编译程序将复数类对象的运算表达式转化为对运算符重载成员函数的调用,运算的运算符重载成员函数的调用,运算的左操作数左操作数对象作为对象作为成员函数调用的目标对象成员函数调用的目标对象,右操作数右操作数转化为运算符函数的转化为运算符函数的实参实参 a.operator+=(b)a.operator+=(b)编译程序根据函数重载的选择原则对运算符重编译程序根据函数重载的选择原则对运算符重载函数进行选择载函数进行选择8 8 8 8classCComplexprivate:doublereal,image;public:CComplex(doubler=0.0,doublei=0.0)real=r;image=i;CComplex&operator+=(constCComplex&r_c)real+=r_c.real;image+=r_c.image;return*this;voidprint()constif(image0)coutrealimage0)coutreal+imagein;elsecoutrealendl;voidmain()CComplexa(3,4),b(5,6);a+=b;a.print();9 9 9 9运算符重载的限制运算符重载的限制只能重载已经存在的只能重载已经存在的C+运算符运算符运算符重载不能改变运算符操作数的个数,优先级运算符重载不能改变运算符操作数的个数,优先级和结合性和结合性运算符的操作数必须至少有一个某个类的类对象,运算符的操作数必须至少有一个某个类的类对象,否则不能对运算符进行重载否则不能对运算符进行重载重载运算符不可以使用缺省参数;重载运算符不可以使用缺省参数;除了赋值运算符除了赋值运算符=外,重载运算符可由派生类继承外,重载运算符可由派生类继承下去;下去;10101010运算符重载的限制运算符重载的限制下列运算符不能重载:下列运算符不能重载:作用域运算符作用域运算符:成员对象选择运算符成员对象选择运算符.*类对象选择运算符类对象选择运算符.条件运算符条件运算符?:11111111运算符重载函数作为类的成员函数运算符重载函数作为类的成员函数运算符重载函数可以通过运算符重载函数可以通过2种形式实现:种形式实现:类成员函数类成员函数友元函数友元函数1212编译程序处理成员函数时,为它设置了一个编译程序处理成员函数时,为它设置了一个this指针。指针。在重载运算符函数中,默认在重载运算符函数中,默认this指针对应的指针对应的缺省参数就是其中之一个参数缺省参数就是其中之一个参数对于一元运算符函数使用的就是规定的对于一元运算符函数使用的就是规定的this指针指针所指的参数(自身的参数)所指的参数(自身的参数)对于二元运算符对应是二元运算的左操作数。对于二元运算符对应是二元运算的左操作数。1212运算符重载函数作为类的成员函数运算符重载函数作为类的成员函数13131313运算符重载函数作为类的成员函数运算符重载函数作为类的成员函数当运算符重载函数定义为其操作数所属类的当运算符重载函数定义为其操作数所属类的成员函数成员函数时,参数的个数要比运算符的操作时,参数的个数要比运算符的操作数个数数个数少一个少一个。重载一元运算符,不再显式指明参数;重载一元运算符,不再显式指明参数;重载二元运算符时,只需显式指明一个参重载二元运算符时,只需显式指明一个参数;数;二元运算符以成员函数形式重载二元运算符以成员函数形式重载,左操作数左操作数必必须为类对象须为类对象,目标对象作为左操作数目标对象作为左操作数14141414运算符重载函数作为类的成员函数运算符重载函数作为类的成员函数成员运算符重载函数在类中的声明格式为:成员运算符重载函数在类中的声明格式为:class X operator ();;成员运算符重载函数在类外定义的格式为:成员运算符重载函数在类外定义的格式为:X:operator ()15151515class CComplexprivate:double real,image;public:CComplex(double a=0.0,double b=0.0)real=a;image=b;CComplex(const CComplex&r)real=r.real;image=r.image;void print()const;const CComplex&operator+=(const CComplex&r_c);const CComplex&operator+=(double c);CComplex operator+(const CComplex&r_c)const;CComplex operator+(double c)const;const CComplex&operator+();/前缀前缀 CComplex operator+(int);/后缀后缀;1.CComplex1.CComplex类中哪些是运算符重载成员函数类中哪些是运算符重载成员函数?2.2.判断各运算符重载成员函数是怎样被调用的判断各运算符重载成员函数是怎样被调用的?3.3.说明说明constconst在各个成员函数中的用法在各个成员函数中的用法4.4.总结运算符重载成员函数函数原型的确定规总结运算符重载成员函数函数原型的确定规则则(函数的返回类型、函数名和函数参数函数的返回类型、函数名和函数参数)5.5.注意自增运算符前缀与后缀的不同注意自增运算符前缀与后缀的不同16161616运算符重载函数作为友元函数运算符重载函数作为友元函数运算符重载函数可以用运算符重载函数可以用友元函数友元函数的形式来实的形式来实现。现。函数参数的个数与运算符的操作数个数函数参数的个数与运算符的操作数个数相同相同第一个参数表示左操作数第一个参数表示左操作数第二个参数表示右操作数第二个参数表示右操作数第一个参数类型为类对象的引用第一个参数类型为类对象的引用赋值运算符赋值运算符=、下标运算符、下标运算符、成员、成员选择运算符选择运算符-和函数调用运算符和函数调用运算符()等等不能用友元函数形式重载不能用友元函数形式重载17171717运算符重载函数作为友元函数运算符重载函数作为友元函数友元运算符重载函数在类中的声明格式为:友元运算符重载函数在类中的声明格式为:class X friend operator ();;友元运算符重载函数在类外定义的格式为:友元运算符重载函数在类外定义的格式为:operator ()18181818classCComplexprivate:doublereal,image;public:CComplex(doublea=0.0,doubleb=0.0)real=a;image=b;CComplex(doublec)real=c;image=0.0;voidprint()const;friendvoidoperator+=(CComplex&r_x,constCComplex&r_y);friendCComplexoperator+(constCComplex&r_x,constCComplex&r_y);friendCComplex&operator+(CComplex&r_x);friendCComplexoperator+(CComplex&r_x,int);1.CComplex1.CComplex类的构造函数什么时类的构造函数什么时候被调用候被调用?2.2.判断各运算符重载成员函数判断各运算符重载成员函数是怎样被调用的是怎样被调用的?3.3.总结友元运算符重载函数函数原型总结友元运算符重载函数函数原型的确定规则的确定规则(函数的返回类型、函函数的返回类型、函数名和函数参数数名和函数参数)练习练习定义复数类的加法与减法,使之能够执行下列运算:Complexa(2,5),b(7,8),c(0,0);c=a+b;c=4.1+a;c=b+5.6;1919定义一个描述电视的定义一个描述电视的CTelevision类。类中包含电视品牌类。类中包含电视品牌(p_brand)、当前频道、当前频道(channel)和当前音量和当前音量(volume)等数等数据成员。要求提供缺省以及带参构造函数,以及输出对据成员。要求提供缺省以及带参构造函数,以及输出对象信息的方法(不能改变类的数据成员)。象信息的方法(不能改变类的数据成员)。为该类重载为该类重载+和和-,以分别实现对音量增加和减,以分别实现对音量增加和减小一个单位;小一个单位;为该类重载为该类重载和和标准类型。标准类型。标准类型标准类型-类类型。类类型。类类型类类型-标准类型。标准类型。类类型类类型-类类型。类类型。2424标准类型是除标准类型是除class,struct和和union类型外的其类型外的其他所有类型他所有类型对于标准类型,对于标准类型,C+语言提供了两种类型转换:语言提供了两种类型转换:隐式类型转换。隐式类型转换。显式类型转换。显式类型转换。2525隐式转换发生在下述情况下隐式转换发生在下述情况下 1)混合运算:级别低的向级别高的转换。混合运算:级别低的向级别高的转换。2)将表达式的值赋给变量:表达式的值向变将表达式的值赋给变量:表达式的值向变量类型的值转换量类型的值转换 3)实参向形参传值:实参的值向形参的值进实参向形参传值:实参的值向形参的值进行转换。行转换。4)函数返回结果:返回的值向函数返回类型函数返回结果:返回的值向函数返回类型的值进行转换。的值进行转换。26262.显式类型转换方式为:显式类型转换方式为:1)强制法。强制法。(类型名类型名)表达式表达式 或者或者 (类型名类型名)(表达式表达式)2)转换函数法。转换函数法。类型名类型名(表达式表达式)它们都将表达式强制地转换为类型名所代表的类型它们都将表达式强制地转换为类型名所代表的类型的值。的值。2727标准类型转换为类类型标准类型转换为类类型可以通过自定义的重载赋值号可以通过自定义的重载赋值号“=”的函数和构造函的函数和构造函数实现转换:标准类型数实现转换:标准类型-类类型;类类型;需要有标准类型的参数。需要有标准类型的参数。具有标准类型参数的构造函数说明了一种从参数类具有标准类型参数的构造函数说明了一种从参数类型到该类类型的转换。型到该类类型的转换。Complex(double r)real=r;imag=0;Complex c1(3.5);/调用转换构造函数建立对象调用转换构造函数建立对象Complex(3.6);/建立一个无名的对象建立一个无名的对象Complex c1=Complex(3.6);/将将3.6强制转换为对象强制转换为对象2828例:classINTEGERintnum;public:INTEGER(int);INTEGER(constchar*,int=0);voidmen_fun(INTEGERanint);2929例:voidfun(INTEGERarg)INTEGERobj1=INTEGER(1);INTEGERobj2=“ChengDu”;intanint=10;INTEGERobj3=INTEGER(anint);obj1=20;/obj1=(INTEGER(20);obj2.mem_fun(3);/obj2.mem_fun(INTEGER(3);3030INTEGER obj1=INTEGER(1);将将1转换为类类型转换为类类型INTEGER obj2=“ChengDu”;编译尝试用构造函编译尝试用构造函数数X(const char*,int=0)对赋值号右边的字符串进对赋值号右边的字符串进行类类型转换,转换成功后,赋给行类类型转换,转换成功后,赋给INTEGER的对的对象象obj2。语句语句obj2.mem_fun(3);中函数中函数mem_fun由于需由于需要一个要一个INTEGER的对象作为参数,故尝试用构造的对象作为参数,故尝试用构造函数对实参进行转换,转换成功后,进行虚实参数函数对实参进行转换,转换成功后,进行虚实参数匹配,执行函数调用。这样的转换是系统自动做的匹配,执行函数调用。这样的转换是系统自动做的,称为隐式类型转换。,称为隐式类型转换。3131构造函数构造函数INTEGER(int)将整数类型转换为类类型将整数类型转换为类类型INTEGER;构造函数构造函数INTEGER(const char*,int=0)将字符串将字符串转换为类类型转换为类类型INTEGER.当当INTEGER的构造函数不进行这个转换时,该转的构造函数不进行这个转换时,该转换失败。亦即,系统不再作其他转换的尝试。换失败。亦即,系统不再作其他转换的尝试。3232例如:classXpublic:X(int);classYpublic:Y(X);void main()X objX=1;Y objY=objX;Y a=1;/错误错误 类类Y没有构造函数没有构造函数Y(int),因此不进行转,因此不进行转换,但系统不会再去换,但系统不会再去试试转换试试转换Y(X(1)。33333333运算符重载应用运算符重载应用以下运算符经常需要重载:算术运算符关系运算符逻辑运算符赋值运算符下标运算符函数调用运算符如果某个类包含有指向动态堆内存的指针数据成员,则一定要为该类定义一个赋值运算符重载函数(为什么?)3434重载赋值运算符重载赋值运算符“=”作为类成员重载赋值运算,若对象内部数据不包括指作为类成员重载赋值运算,若对象内部数据不包括指针,则可采用浅复制方式,直接修改当前对象并把当针,则可采用浅复制方式,直接修改当前对象并把当前对象当作返回结果。前对象当作返回结果。COMPLEX COMPLEX:operator=(const COMPLEX&other)real=other.real;/相当于相当于this-real=other.real image=other.image;/相当于相当于this-image=other.image return*this;运算符重载应用运算符重载应用3535系统会提供缺省的赋值运算符,采用浅复制完成系统会提供缺省的赋值运算符,采用浅复制完成数据复制数据复制若对象数据成员包含指针,就必须考虑重载赋值若对象数据成员包含指针,就必须考虑重载赋值运算。运算。声明一个对象时作初始化也采用运算符声明一个对象时作初始化也采用运算符“=”,但,但此时采用的是拷贝构造函数而不是调用重载赋值此时采用的是拷贝构造函数而不是调用重载赋值运算符。运算符。课本课本 程序程序6-56-5:如果某个类包含有指向动态堆内存的指针数据成:如果某个类包含有指向动态堆内存的指针数据成员,则一定要为该类定义一个赋值运算符重载函数员,则一定要为该类定义一个赋值运算符重载函数class CStringprivate:char*p_str;/含指针的数据成员含指针的数据成员public:CString(const char*p_s);CString(const CString&r_s);CString();const char*show()const;void operator+=(const CString&r_s);bool operator=(const CString&r_s)const;CString&operator=(const CString&r_s);CString&CString:operator=(const CString&r_s)if(this=&r_s)return*this;delete p_str;p_str=new charstrlen(r_s.p_str)+1;if(p_str=NULL)exit(1);strcpy(p_str,r_s.p_str);cout Assigned:p_str endl;return*this;3838例例重载下标运算符重载下标运算符“”下标运算符下标运算符“”用来取某个向量的某个元素,或直接用来取某个向量的某个元素,或直接对向量中某个元素赋值,它被视为一个二元运算符。对向量中某个元素赋值,它被视为一个二元运算符。下标运算符下标运算符只能作类成员运算符只能作类成员运算符进行重载,不可作为进行重载,不可作为友元运算符。友元运算符。重载下标运算符的最大好处是提供一种向量访问的安重载下标运算符的最大好处是提供一种向量访问的安全方法。全方法。3939#include#includeconstintMAX_SIZE=10;classVECTORprotected:inttableMAX_SIZE;/向量的内容public:VECTOR()/构造函数intloop;for(loop=0;loop=MAX_SIZE-1;loop=loop+1)tableloop=loop;4040int&operator(intindex)/取向量元素if(indexMAX_SIZE-1)cout”Indexoutofbounds.n”;exit(1);returntableindex;4141intmain()VECTORlabel;/定义向量对象coutlabel2”n”;/输出结果为2babel2=8;/改变第三个变量的值coutlabel2”n”;/输出结果为8coutlabel10”n”;/引起程序异常终止,提示Indexoutofboundsreturn0;重载重载()()运算符运算符函数调用运算符”()”可以看作一个双目运算符,它的两个操作数分别为函数名和函数参数列表。f(x,y)f()函数调用运算符只能采用非静态的成员函数类重载。函数调用运算符重载可以不带或带任意个参数。4343例例 重载重载()()运算符运算符数学函数的抽象:数学函数的抽象:f(x,y)=(x+5)*y#includeclassFpublic:doubleoperator()(doublex,doubley)const;doubleF:operator()(doublex,doubley)constreturn(x+5)*y;/(1.5+5)*2.2voidmain()Ff;coutf(1.5,2.2)endl;输出:输出:输出:输出:14.3补充:补充:newnew和和deletedelete的重载的重载重载重载new和和delete是可能的。这样做的原是可能的。这样做的原因是,有时希望使用某种特殊的动态内存因是,有时希望使用某种特殊的动态内存分配方法。例如,可能用户希望控制某一分配方法。例如,可能用户希望控制某一片存储空间的分配等等。片存储空间的分配等等。

    注意事项

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

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




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

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

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

    收起
    展开