ImageVerifierCode 换一换
格式:PPT , 页数:67 ,大小:307.50KB ,
资源ID:13187672      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/13187672.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(第 四 章运算符重载.ppt)为本站上传会员【xrp****65】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

第 四 章运算符重载.ppt

1、单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,第 四 章,运算符重载,4.1,重载运算符,4.2,自由存储,4.3,类型转换,4.1.1,概述,4.1.2,一元和二元运算符,4.,1.3,用成员,函,数,重载运算符,4.1.4,用友员函数,重载运算符,4.1.5,重载+和-,4.1.6,重载赋值运算符,4.1.7,重载()和 ,4.1,重载运算符,4.1.1,概述,1.运算符重载的需要,运算符重载使得用户自定义的数据以一种更简洁的方式工作,例如:,int,x,y,y=x+y;,matrix m1,m2;/,矩阵类对象,m2=,Madd,(m1,m2);/,

2、调用函数计算两个矩阵的和,complex c1,c2;/,复数类对象,c1=,Cadd,(c1,c2);/,调用函数计算两个复数的和,能表示为,c1=c1+c2;,?,能表示为,m1=m1+m2;,?,4.1.1,概述,2.,C+,中可以被重载的运算符,+-*/%&|,!=+=-=*=/=%=,=&=|=,new newdeletedelete,不能重载的算符,.:*?:#,4.1.1,概述,2.,C+,中可以被重载的运算符,+-*/%&|,!=+=-=*=/=%=,=&=|=,new newdeletedelete,运算符重载后,可以按它的表达方式使用,不能改变它们的优先级,不能改变算符要求

3、的操作数数目,4.1.1,概述,3.运算符重载的语法形式,运算符通过运算符函数重载。,运算符函数是一种特殊的成员函数,语法形式为:,type,X :operator (,参数表,),/,相对于该类定义的操作,4.1.1,概述,3.运算符重载的语法形式,运算符通过运算符函数重载。,运算符函数是一种特殊的成员函数,语法形式为:,type,X :operator (,参数表,),/,相对于该类定义的操作,返回类型,4.1.1,概述,3.运算符重载的语法形式,运算符通过运算符函数重载。,运算符函数是一种特殊的成员函数,语法形式为:,type,X,:operator (,参数表,),/,相对于该类定义的

4、操作,重载该算符的类的类名,4.1.1,概述,3.运算符重载的语法形式,运算符通过运算符函数重载。,运算符函数是一种特殊的成员函数,语法形式为:,type,X :operator,(,参数表,),/,相对于该类定义的操作,要重载的算符,4.1.1,概述,3.运算符重载的语法形式,运算符通过运算符函数重载。,运算符函数是一种特殊的成员函数,语法形式为:,type,X :,operator,(,参数表,),/,相对于该类定义的操作,关键字,4.1.1,概述,3.运算符重载的语法形式,运算符通过运算符函数重载。,运算符函数是一种特殊的成员函数,语法形式为:,type,X :,operator ,(,

5、参数表,),/,相对于该类定义的操作,由关键字和要重载算符组成函数名,4.1.1,概述,3.运算符重载的语法形式,运算符通过运算符函数重载。,运算符函数是一种特殊的成员函数,语法形式为:,type,X :operator (,参数表,),/,相对于该类定义的操作,运算符要求的操作数,4.1.1,概述,3.运算符重载的语法形式,运算符通过运算符函数重载。,运算符函数是一种特殊的成员函数,语法形式为:,type,X :operator (,参数表,),/,相对于该类定义的操作,一个,运算符被重载后,原有意义没有失去,只是,定义了相对一特定类的一个新运算符,重载了,三个算符,/,ex1,三个算符的重

6、载,(,P90-92),#include,class counter,unsigned,int,value;,public:,counter()value=0;,void,operator +,();,void,operator-,();,unsigned,int,operator(),();,;,void counter:,operator+,(),if (value 0)value,-,;,unsigned,int,counter:,operator(),(),return value;,main(),counter my_counter;,for(,int,i=0;i 12;i,+,),

7、my_counter+;,cout,“n my_counter=”,my_counter();,my_counter-,;,my_counter-,;,cout,“n my_counter=”,my_counter(),;,/,ex1,三个算符的重载,(,P90-92),#include,class counter,unsigned,int,value;,public:,counter()value=0;,void,operator +,();,void,operator-,();,unsigned,int,operator(),();,;,void counter:,operator+,()

8、if (value 0)value,-,;,unsigned,int,counter:,operator(),(),return value;,main(),counter my_counter;,for(,int,i=0;i 12;i,+,),my_counter+;,cout,“n my_counter=”,my_counter();,my_counter-,;,my_counter-,;,cout,“n my_counter=”,my_counter(),;,使用,系统预定义版本,/,ex1,三个算符的重载,(,P90-92),#include,class counter,unsign

9、ed,int,value;,public:,counter()value=0;,void,operator +,();,void,operator-,();,unsigned,int,operator(),();,;,void counter:,operator+,(),if (value 0),value-,;,unsigned,int,counter:,operator(),(),return value;,main(),counter my_counter;,for(,int,i=0;i 12;i,+,),my_counter+;,cout,“n my_counter=”,my_coun

10、ter();,my_counter-,;,my_counter-,;,cout,“n my_counter=”,my_counter(),;,使用,系统预定义版本,/,ex1,三个算符的重载,(,P90-92),#include,class counter,unsigned,int,value;,public:,counter()value=0;,void,operator +,();,void,operator-,();,unsigned,int,operator(),();,;,void counter:,operator+,(),if (value 0),value-,;,unsigne

11、d,int,counter:,operator(),(),return value;,main(),counter my_counter;,for(,int,i=0;i 12;,i+,),my_counter+;,cout,“n my_counter=”,my_counter();,my_counter-,;,my_counter-,;,cout,“n my_counter=”,my_counter(),;,使用,系统预定义版本,“,=,”,运算符重载不能被派生类继承,由于重载可以对定义算符新的含义,要注意程序的可读性,例如:用运算符,“,+,”,表示减运算;用,“,*,”,表示除运算,违反程

12、序阅读习惯,注意:,4.1.2,一元和二元运算符,运算符重载时,运算符函数只能定义为两种方式:,类的成员函数,友员函数,这两种方式非常相似,关键区别在于,成员函数,具有,this,指针,友员函数,没有,this,指针,1.一元运算符,一元运算符,不论是前缀还是后缀,都需要一个操作数:,aa,及,aa,重载的运算符,重载的运算符,1.一元运算符,一元运算符,不论是前缀还是后缀,都需要一个操作数:,aa,及,aa,重载算符 的类的对象,重载算符 的类的对象,1.一元运算符,一元运算符,不论是前缀还是后缀,都需要一个操作数:,aa,及,aa,可以解释为:,aa.operator (),或,opera

13、tor (aa),1.一元运算符,一元运算符,不论是前缀还是后缀,都需要一个操作数:,aa,及,aa,可以解释为:,aa.operator (),或,operator (aa),一元运算符函数,operator,所需的一个操作数由对象,aa,通过,this,指针隐含地传递,因此参数表为空。这时,运算符函,数用类的,成员函数,表示,1.一元运算符,一元运算符,不论是前缀还是后缀,都需要一个操作数:,aa,及,aa,可以解释为:,aa.operator (),或,operator (aa),一元运算符函数,operator,所需的一个操作数在参数表中,由对象显式地提供,适用于没有,this,指针的

14、情况。这时,运算符,函数用类的,友员函数,表示,一元运算符函数,operator,所需的一个操作数由对象,aa,通过,this,指针隐含地传递,因此参数表为空。这时,运算符函,数用类的,成员函数,表示,1.一元运算符,一元运算符,不论是前缀还是后缀,都需要一个操作数:,aa,及,aa,不管用成员函数或用友员函数重载运算符,,对运算符的使用方法都是相同的,2.二元运算符,同样,对任意二元运算符:,aa,bb,可以解释为:,aa.operator (bb),或,operator (aa,bb),2.二元运算符,同样,对任意二元运算符:,aa,bb,可以解释为:,aa.operator (bb),或

15、operator (aa,bb),二元运算符函数,operator,所需的一个操作数由对象,aa,通过,this,指针隐含地传递。因此它只有一个参数。这时,运算符,函数用类的,成员函数,表示,2.二元运算符,同样,对任意二元运算符:,aa,bb,可以解释为:,aa.operator (bb),或,operator (aa,bb),二元运算符函数,operator,所需的一个操作数由对象,aa,通过,this,指针隐含地传递。因此它只有一个参数。这时,运算符,函数用类的,成员函数,表示,二元运算符函数,operator,所需的两个操作数在参数表中,由对象,aa,和,bb,显式地提供,适用于没有

16、this,指针的情况。这时,,运算符函数用类的,友员函数,表示,2.二元运算符,同样,对任意二元运算符:,aa,bb,不管用成员函数或用友员函数重载运算符,,对运算符的使用方法都是相同的,4.1.3,用成员函数重载运算符,例:创建一个名为,three_d,的简单类,,three,类含有三维空间,中的一对象坐标。该程序相对于,three_d,类对,“,+,”,和,“,=,”,运算符进行重载。,/,ex2(,例,4-1,P94-96),#include,class three_d,int,x,y,z;/3_d coordinates,public:,three_d operator,+,(thr

17、ee_d t);,/,重载,“,+,”,three_d operator,=,(three_d t);,/,重载,“,=,”,three_d operator,+,();,/,重载,“,+,”,void show();,void assign(,int mx,int,my,int mz,);,;,three_d three_d:operator,+,(three_d t),/,重载,“,+,”,three_d temp;,temp.x=x+t.x;temp.y=y+t.y;temp.z=z+t.z;,return temp;,three_d three_d:operator,=,(three_

18、d t),/,重载,“,=,”,x=t.x;y=t.y;z=t.z;return *this;,three_d three_d:operator,+,(),/,重载一元运算符,“,+,”,x+;y+;z+;return *this;,void three_d:show(),/,显示,x,y,z,坐标,cout,x “,”y “,”z “n”;,void three_d:assign(,int mx,int,my,int mz,),/,指定坐标,x=,mx,;y=my;z=,mz,;,three_d three_d:operator,+,(,three_d t,),/,重载,“,+,”,thre

19、e_d temp;,temp.x=x+t.x;temp.y=y+t.y;temp.z=z+t.z;,return temp;,three_d three_d:operator,=,(three_d t),/,重载,“,=,”,x=t.x;y=t.y;z=t.z;return *this;,three_d three_d:operator,+,(),/,重载一元运算符,“,+,”,x+;y+;z+;return *this;,void three_d:show(),/,显示,x,y,z,坐标,cout,x “,”y “,”z “n”;,void three_d:assign(,int mx,in

20、t,my,int mz,),/,指定坐标,x=,mx,;y=my;z=,mz,;,重载二元算符参数表只明确一个变元,另一个变元用,this,指针隐含传递,three_d three_d:operator,+,(,three_d t,),/,重载,“,+,”,three_d temp;,temp.x=,x,+t.x;temp.y=y+t.y;temp.z=z+t.z;,return temp;,three_d three_d:operator,=,(three_d t),/,重载,“,=,”,x=t.x;y=t.y;z=t.z;return *this;,three_d three_d:oper

21、ator,+,(),/,重载一元运算符,“,+,”,x+;y+;z+;return *this;,void three_d:show(),/,显示,x,y,z,坐标,cout,x “,”y “,”z x,three_d,three_d:operator,+,(three_d t),/,重载,“,+,”,three_d temp;,temp.x=x+t.x;temp.y=y+t.y;temp.z=z+t.z;,return temp;,three_d three_d:operator,=,(three_d t),/,重载,“,=,”,x=t.x;y=t.y;z=t.z;return *this;

22、three_d three_d:operator,+,(),/,重载一元运算符,“,+,”,x+;y+;z+;return *this;,void three_d:show(),/,显示,x,y,z,坐标,cout,x “,”y “,”z “n”;,void three_d:assign(,int mx,int,my,int mz,),/,指定坐标,x=,mx,;y=my;z=,mz,;,返回类类型,便于作复杂运算,例如,a+b+c,事实上该函数可以返回任意正确,C+,类型,three_d three_d:operator,+,(three_d t),/,重载,“,+,”,three_d t

23、emp;,temp.x=x+t.x;temp.y=y+t.y;temp.z=z+t.z;,return temp;,three_d three_d:operator,=,(three_d t),/,重载,“,=,”,x,=t.x;,y,=t.y;,z,=t.z;return,*this,;,three_d three_d:operator,+,(),/,重载一元运算符,“,+,”,x+;y+;z+;return *this;,void three_d:show(),/,显示,x,y,z,坐标,cout,x “,”y “,”z “n”;,void three_d:assign(,int mx,i

24、nt,my,int mz,),/,指定坐标,x=,mx,;y=my;z=,mz,;,赋值运算符修改第一个操作数(,this,所指对象),返回对象类型,使得连续赋值合法,a=b=c=d;,three_d three_d:operator,+,(three_d t),/,重载,“,+,”,three_d temp;,temp.x=x+t.x;temp.y=y+t.y;temp.z=z+t.z;,return temp;,three_d three_d:operator,=,(three_d t),/,重载,“,=,”,x=t.x;y=t.y;z=t.z;return *this;,three_d

25、three_d:operator,+,(),/,重载一元运算符,“,+,”,x+;y+;z+;return *this;,void three_d:show(),/,显示,x,y,z,坐标,cout,x “,”y “,”z “n”;,void three_d:assign(,int mx,int,my,int mz,),/,指定坐标,x=,mx,;y=my;z=,mz,;,“,+,”,运算符没有对象明确传送给函数,通过,this,指针隐含传送,main(),three_d a,b,c;,a.assign(1,2,3);,b.assign(10,10,10);,a.show();b.show()

26、c,=,a,+,b,;,/,将,a,和,b,加在一起,c.show();,c,=,a,+,b,+,c;,/,将,a、b、c,加在一起,c.show();,c,=,b,=,a;,/,多重赋值,c.show();,b.show();,c,+,;,/,对,c,递加,c.show();,程序输出:,1,2,3,10,10,10,11,12,13,22,24,26,1,2,3,1,2,3,2,3,4,表达式引起对算符函数调用的对象是,a,,算符右边的对象,b,作为参数传递给函数,可以解释为,a.operator+(b);,4.1.4,用友员重载运算符,有时候,用成员函数重载运算符会碰到麻烦。例如:,

27、class Complex,int,Real;,int Imag,;,public:,Complex(,int,a)Real=a;,Imag,=0;,Complex(,int,a ,int,b)Real=a;,Imag,=b;,Complex operator+(Complex);,.,;,int,f(),Complex z(2,3),k(3,4);,z=z+27;,z=27+z;,.,4.1.4,用友员重载运算符,有时候,用成员函数重载运算符会碰到麻烦。例如:,class Complex,int,Real;,int Imag,;,public:,Complex(,int,a),Real=a;

28、Imag,=0;,Complex(,int,a ,int,b)Real=a;,Imag,=b;,Complex operator+(Complex),;,.,;,int,f(),Complex z(2,3),k(3,4);,z=z+27;,/ok,z=27+z;,.,表达式,z+27,可被解释为,z.operator+(27),z,是复数对象,使用,“,+,”,的,重载版本;,由于重载算符函数要求的,右操作数也为复数,系统通过,构造函数,Complex(,int,a),将,整数 27 转换为,Complex,类常,量,Complex(27),4.1.4,用友员重载运算符,有时候,用成员函数重

29、载运算符会碰到麻烦。例如:,class Complex,int,Real;,int Imag,;,public:,Complex(,int,a)Real=a;,Imag,=0;,Complex(,int,a ,int,b)Real=a;,Imag,=b;,Complex operator+(Complex);,.,;,int,f(),Complex z(2,3),k(3,4);,z=z+27;,/ok,z=27+z,;,/error,.,表达式 27+,z,可被解释为,27,.,operator+(z),该式子,毫无意义,。,27不是,Complex,类对象,,不能调用算符重载函数与对象,z,

30、相加,!,此时,成员函数重载的算,符,“,+,”,不支持交换律。,4.1.4,用友员函数重载运算符,在第一个参数需要隐式转换的情形下,使用友员函数重载算符是正确的选择。,由于友员函数没有隐含,this,指针,用友员函数重载算符时,所需操作数都必须在参数表显式声明,所以很容易实现类型的隐式转换。,4.1.4,用友员重载运算符,把重载运算符函数改为友员函数:,class Complex,int,Real;,int Imag,;,public:,Complex(,int,a)Real=a;,Imag,=0;,Complex(,int,a ,int,b)Real=a;,Imag,=b;,friend,

31、Complex operator+(,Complex,Complex,);,.,;,int,f(),Complex z(2,3),k(3,4);,z=z+27;,/ok,z=27+z,;,/ok,.,/,ex3,使用友员函数重载运算符,#,include,class complex,public:,complex(double r=0,double i=0);,void print()const;,friend complex operator+(,const,complex&c1,const,complex,friend complex operator-(,const,complex&c1

32、const,complex,friend complex operator-(,const,complex,private:double real,imag,;,;,常参数,,函数体内不能修改实际参数,常参数,,函数体内不能修改实际参数,complex:complex(double r,double i )real=r;,imag,=i;,complex operator+(const complex&c1,const complex&c2),double r=c1.real+c2.real;double i=c1.,imag,+c2.,imag,;,return complex(r,i);

33、complex operator-(const complex&c1,const complex&c2),double r=c1.real-c2.real;double i=c1.,imag,-c2.,imag,;,return complex(r,i);,complex operator-(const complex&c),return complex(-c.real,-c.,imag,);,void complex:print()const,cout,(real “,”,imag,)x+;,opl,-y+;,opl,-z+;return *,opl,;,使用友员的问题,问题,C+,不知道

34、如何激活该函数,下述代码无法编译:,three_d ob(1,2,3);,/error,二义性,对,ob,的地址进行递加?,还是,将对象,ob,递加?,3.使用引用参数,:,three_d three_d:operator+(three_d,&,opl,),opl,.x+;,opl,.y+;,opl,.z+;return,opl,;,使用友员的问题,下述代码是正确的:,three_d ob(1,2,3);,ob+;/ok,可见,如果一个运算符的操作要修改类的对象的状态,要重载为友员函数时,应该使用引用参数,4.1.4,用友员函数重载运算符,若一运算符的操作需要修改类对象状态时,则它应该是成员函

35、数。需要左值操作数的运算符(如=,*=,+)应该用成员函数重载。,定义成友员时要用引用参数。,如果运算符的操作数(尤其是第一个操作数)希望有,隐式转换,则重载算符时必须用友员函数,不能用友员函数重载的运算符是,=(),4.1.5,重载,+,和,-,C,语言中,运算符+和-有两种方式:,前缀方式:,+,i;-i;,后缀方式:,i+;i-;,一元,成员函数,重载:,aa.operator+();,友员函数,重载:,operator+(X&aa),/,其中,aa,是,X,类的对象,二元,成员函数,重载:,aa.operator+(,int,);,友员函数,重载:,operator+(X&aa,int

36、),这时,,第二个参数(,int,),一般,设置为 0,例如:,i+;,等价于,i+(0);,4.1.5,重载,+,和,-,例如:,用成员函数重载,class X,public:,operator +();,/,前缀方式,operator +(,int,);,/,后缀,方式,void f(X a),+a;,/a.operator+(),a+;,/a.operator+(0),a.operator+();,/,显式调用,意为+,a;,a.operator+(0);,/,显式调用,意为,a+;,4.1.5,重载,+,和,-,例如:,用友员函数重载,class Y,public:,friend,o

37、perator +(Y,/+a;,friend,operator +(Y&,int,);,/a+0;,void g(Y a),+a;,/operator+(a),a+;,/operator+(a,0),operator+(a);,/,显式调用,意为+,a;,operator+(a,0);,/,显式调用,意为,a+;,4.1.5,重载,+,和,-,重载,运算符+(或-)后,可以用两种方式使用:,a+;,/,隐式,调用,a.operator+(0);,/,显式调用,讨论,有时,它们的使用方式不等价:,a+3;,/error,但,operator+(a,3);,/ok,或,a.operator+(3

38、);,/ok,合法,等价于,a+=3;,/,ex4,#,include,class Increase,public:,Increase()value=0;void display()const coutvaluen;,Increase operator+();Increase operator+(int);,private:unsigned value;,;,Increase Increase:operator+()value+;return*this;,/前缀,Increase Increase:operator+(int),/后缀,Increase temp;temp.value=valu

39、e+;return temp;,void main(),Increase a,b,n;,for(int i=0;i 10;i+)a=n+;,cout“n=”;n.display();cout“a=”;a.display();,for(i=0;i 10;i+)b=+n;,cout “n=”;n.display();cout “b=”;b.display();,成员函数重载+,输出,n=10,a=9,n=20,b=20,/,ex5,#,include,class Increase,public:,Increase()value=0;void display()const coutvaluen;,f

40、riend,Increase operator +(Increase,friend,Increase operator +(Increase,private:unsigned value;,;,Increase operator+(Increase ,/前缀,Increase operator+(Increase&a,int),/后缀,Increase temp(a);a.value+;return temp;,void main(),Increase a,b,n;,for(int i=0;i 10;i+)a=n+;,cout“n=”;n.display();cout“a=”;a.displa

41、y();,for(i=0;i 10;i+)b=+n;,cout“n=”;n.display();cout“b=”;b.display();,友员函数重载+,输出,n=10,a=9,n=20,b=20,4.1.6,重载赋值运算符,1.重载格式,X&X:operator=(,const,X&from),/,复制,X,的成员,返回类类型的引用是为了与,C+,原有赋值号的语义相匹配,用,const,修饰参数,保证函数体内不修改实际参数,/,ex6,class three_d,int,x,y,z;/3_d coordinates,public:,three_d,three_d operator+();v

42、oid show();,void assign(,int mx,int,my,int mz,);,;,three_d&three_d:operator=(three_d&t,),x=t.x;y=t.y;z=t.z;return*this;,/,其它成员函数定义,main(),three_d a,b;,a.assign(1,2,3);b.assign(10,10,10);,(b=a)+;,a.show();b.show();,输出,1,2,3,2,3,4,能够正确使用赋值号语义,赋值表达式左边的表达式(对象)是左值,/,ex7,class three_d,int,x,y,z;/3_d coord

43、inates,public:,three_d operator+();void show();,void assign(,int mx,int,my,int mz,);,;,x=t.x;y=t.y;z=t.z;return*this;,/,其它成员函数定义,main(),three_d a,b;,a.assign(1,2,3);b.assign(10,10,10);,a.show();b.show();,输出,1,2,3,1,2,3,b=a,返回是对象值而不是引用,+重载函数是传值参数,不能修改实参,b,three_d operator=(three_d t);,three_d three_d

44、operator=(three_d t),(b=a)+;,4.1.6,重载赋值运算符,2.有关说明,重载的运算符函数,operator=,不能被继承,重载的运算符函数,operator=,必须是成员函数,如果用户没有为类重载赋值运算符函数,编辑程序将生成一个,缺省的赋值运算符。,拷贝函数用于创建一个新对象,赋值运算符是改变一个已存在,的对象的值,4.1.7,重载,(),和,1.重载函数调用运算符,(),函数调用的一般格式为,(,),可以看成一个二元运算符,“,(),”,:,左操作数 为,右操作数 为,对应的函数是,operator(),设,x,是类,X,的一个对象,则表达式,x(arg1,a

45、rg2),可被解释为,x.operator()(arg1,arg2),只能用成员函数重载,不能用友员函数重载,/,ex8,用重载函数调用运算符实现数学函数的抽象,#,include,class F,public:double,operator(),(double x,double y),;,;,double F:operator()(double x,double y),return x*y+5;,main(),F,f,;,cout,f,(,5.2,2.5,),endl,;,C+,解释为,f.operator()(5.2,2.5),调用重载成员函数,double,operator(),(dou

46、ble x,double y),;,1.重载函数调用运算符,(),/,ex9,对比用普通成员函数的实现,#,include,class F,public:,double ff(double x,double y);,;,double F:ff(double x,double y),return x*y+5;,main(),F,fobj,;,cout,fobj,.ff(5.2,2.5),endl,;,注意,成员函数的定义和调用,1.重载函数调用运算符,(),4.1.7,重载,(),和,2.重载下标运算符,下标运算的格式为,可以看成一个二元运算符,“,”,:,左操作数 为,右操作数 为,对应的函数

47、是,operator ,设,x,是类,X,的一个对象,则表达式,x y,可被解释为,x.operator (y),重载时,只能显式地声明一个参数,/,ex10,#include,class vector,public:,vector(,int,size);vector();,int,&operator (,int,i);,private:,int,*v;,;,vector:vector(,int,size)v=new,int,size ;,vector:vector()delete v;,int,&vector:operator (,int,i)return v i ;,main(),vect

48、or a(5);,a 2,=12;,cout,a 2,;,2.重载下标运算符,C+,解释为,a.operator()(2),调用重载成员函数,int,&operator (,int,i);,C+,解释为,a.operator()(2),调用重载成员函数,int,&operator (,int,i);,/,ex10,#include,class vector,public:,vector(,int,size);vector();,int,&operator (,int,i);,private:,int,*v;,;,vector:vector(,int,size)v=new,int,size ;,vector:vector()delete v;,int,&vector:operator (,int,i)return v i ;,main(),vector a(5);,a 2,=12;,cout,a 2,;,2.重载下标运算符,请试一试,不用重载下标算符函数,如何访问对象数据成员的元素?,

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服