《运算符重载与友元》PPT课件.ppt

上传人:M****1 文档编号:572102027 上传时间:2024-08-12 格式:PPT 页数:56 大小:307KB
返回 下载 相关 举报
《运算符重载与友元》PPT课件.ppt_第1页
第1页 / 共56页
《运算符重载与友元》PPT课件.ppt_第2页
第2页 / 共56页
《运算符重载与友元》PPT课件.ppt_第3页
第3页 / 共56页
《运算符重载与友元》PPT课件.ppt_第4页
第4页 / 共56页
《运算符重载与友元》PPT课件.ppt_第5页
第5页 / 共56页
点击查看更多>>
资源描述

《《运算符重载与友元》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《运算符重载与友元》PPT课件.ppt(56页珍藏版)》请在金锄头文库上搜索。

1、第6章 运算符重载与友元内容提要内容提要q运算符重载的目的、定义和实质运算符重载的目的、定义和实质 q运算符重载的规则运算符重载的规则 q运算符重载的两种形式运算符重载的两种形式 q友元的作用和定义友元的作用和定义 2024/8/122第6章运算符重载与友元提出问题复数的加减运算问题:复数的加减运算问题:对于非基本数据类型,如复数、分数,如何在对于非基本数据类型,如复数、分数,如何在对于非基本数据类型,如复数、分数,如何在对于非基本数据类型,如复数、分数,如何在程序中进行运算?程序中进行运算?程序中进行运算?程序中进行运算?能否直接用能否直接用能否直接用能否直接用运算符(运算符(运算符(运算符

2、(+ + + +、- - - -、* * * *、/ / / /)进行运算?)进行运算?)进行运算?)进行运算?2024/8/123第6章运算符重载与友元分析问题分析问题自定义一个复数类自定义一个复数类自定义一个复数类自定义一个复数类ComplexComplex完成复数的加减运算完成复数的加减运算完成复数的加减运算完成复数的加减运算设计复数类设计复数类设计复数类设计复数类classComplexclassComplex/ /复数类复数类复数类复数类 public:public:Complex(doubleComplex(doubler=0.0,doublei=0.0)/r=0.0,double

3、i=0.0)/构造函数构造函数构造函数构造函数real=r;image=i;real=r;image=i;private:private:doublereal,image;doublereal,image;/ /定义实部、虚部定义实部、虚部定义实部、虚部定义实部、虚部; ; 2024/8/124第6章运算符重载与友元思考思考是否能通过下面的代码完成复数的加减运算:是否能通过下面的代码完成复数的加减运算:是否能通过下面的代码完成复数的加减运算:是否能通过下面的代码完成复数的加减运算: intintmain()main() / /定义一个复数对象定义一个复数对象定义一个复数对象定义一个复数对象c1

4、c1,其实部为其实部为其实部为其实部为2 2,虚部为,虚部为,虚部为,虚部为2.52.5 Complexc1(2,2.5);Complexc1(2,2.5); Complexc2(3,1.4);Complexc2(3,1.4); Complexc3,c4;Complexc3,c4; c3=c1+c2;c3=c1+c2; c4=c1-c2;c4=c1-c2; return0;return0; 2024/8/125第6章运算符重载与友元编译程序,显示:编译程序,显示:2024/8/126第6章运算符重载与友元说明说明C+C+预定定义的的“+ +”、“- -”运算只支持基本数据运算只支持基本数据类型

5、,并不支持型,并不支持用户自定义用户自定义类型。型。 复数复数类的加减运算不能采用系的加减运算不能采用系统预定定义的的运算符运算符“+ +”、“- -”完成,那么完成,那么编写成写成员函数来函数来实现加、减运算加、减运算。2024/8/127第6章运算符重载与友元重新设计重新设计复数类复数类ComplexclassComplexclassComplex public:public:Complex(doubler=0.0,doublei=0.0)/Complex(doubler=0.0,doublei=0.0)/构造函数构造函数构造函数构造函数real=r;image=i;real=r;imag

6、e=i;doubleReal()returnreal;/doubleReal()returnreal;/返回复数的实部返回复数的实部返回复数的实部返回复数的实部doubledoubleImag()returnImag()returnimage;/image;/返回复数的虚部返回复数的虚部返回复数的虚部返回复数的虚部Complexadd(Complex&c);/Complexadd(Complex&c);/函数重载,实现复数加复数函数重载,实现复数加复数函数重载,实现复数加复数函数重载,实现复数加复数Complexadd(doubled);/Complexadd(doubled);/函数重载,实

7、现复数加实数函数重载,实现复数加实数函数重载,实现复数加实数函数重载,实现复数加实数Complexsub(Complex&c);/Complexsub(Complex&c);/函数重载,实现复数减复数函数重载,实现复数减复数函数重载,实现复数减复数函数重载,实现复数减复数Complexsub(doubled);/Complexsub(doubled);/函数重载,实现复数减实数函数重载,实现复数减实数函数重载,实现复数减实数函数重载,实现复数减实数voidset_value(Complex&c);/voidset_value(Complex&c);/函数重载,实现复数对象的赋值函数重载,实现复

8、数对象的赋值函数重载,实现复数对象的赋值函数重载,实现复数对象的赋值private:private:doublereal,image;doublereal,image;/ /定义实部、虚部定义实部、虚部定义实部、虚部定义实部、虚部;2024/8/128第6章运算符重载与友元完成复数与复数相加完成复数与复数相加ComplexComplex:add(ComplexComplex:add(ComplexComplex&c)&c) Complextemp;Complextemp;temp.real=real+c.real;temp.real=real+c.real;temp.image=image+c

9、.image;temp.image=image+c.image;returntemp;returntemp; 成员函数定义成员函数定义2024/8/129第6章运算符重载与友元完成复数与实数相加完成复数与实数相加完成复数与实数相加完成复数与实数相加 ComplexComplex:add(ComplexComplex:add(doubledoubled)d) Complextemp;Complextemp; temp.real=real+d;temp.real=real+d; temp.image=image;temp.image=image; returntemp;returntemp; 完成

10、复数与复数相减完成复数与复数相减完成复数与复数相减完成复数与复数相减 ComplexComplex:sub(ComplexComplex:sub(ComplexComplex&c)&c) Complextemp;Complextemp; temp.real=real-c.real;temp.real=real-c.real; temp.image=image-c.image;temp.image=image-c.image; returntemp;returntemp; 2024/8/1210第6章运算符重载与友元完成复数与实数相减完成复数与实数相减完成复数与实数相减完成复数与实数相减 Com

11、plexComplex:sub(ComplexComplex:sub(doubledoubled)d) Complextemp;Complextemp; temp.real=real-d;temp.real=real-d; temp.image=image;temp.image=image; returntemp;returntemp; 完成复数间的赋值运算完成复数间的赋值运算完成复数间的赋值运算完成复数间的赋值运算 voidComplex:set_value(voidComplex:set_value(ComplexComplex&c)&c) real=real=c.realc.real;

12、; image=image=c.imagec.image; ; 2024/8/1211第6章运算符重载与友元intint main()main() Complexc1(2,2.5);Complexc1(2,2.5);Complexc2(3,1.4);Complexc2(3,1.4);Complexc3,c4;Complexc3,c4;c3.set_value(c1.add(c2);c3.set_value(c1.add(c2);c4.set_value(c1.sub(c2);c4.set_value(c1.sub(c2); coutcoutc3=c3.Real()c3=c3.Real()+ic

13、3.Imag()+ic3.Imag()endlendl; ; coutcoutc4=c4.Real()c4=c4.Real()+ic4.Imag()+ic4.Imag()endlendl; ; return0;return0; 不如不如c3=c1+c2直观直观!2024/8/1212第6章运算符重载与友元用函数的方式将复数的加减运算表示出来用函数的方式将复数的加减运算表示出来远不如用运算符远不如用运算符“+”“+”、“-”“-”直观直观 如果复数的运算能够用已有的运算符表示如果复数的运算能够用已有的运算符表示出来,则程序的易读性会大大增强,同时出来,则程序的易读性会大大增强,同时更符合人的思维

14、习惯更符合人的思维习惯 C+C+提供了提供了运算符重载机制运算符重载机制,使得系统预定,使得系统预定义的运算符能够完成用户自定义数据类型义的运算符能够完成用户自定义数据类型的运算的运算 说明说明2024/8/1213第6章运算符重载与友元运算符重载的定义运算符重载的定义赋赋予系予系予系予系统预统预定定定定义义的运算符多重含的运算符多重含的运算符多重含的运算符多重含义义,使同一个运,使同一个运,使同一个运,使同一个运算符既可以作用于算符既可以作用于算符既可以作用于算符既可以作用于预预定定定定义义的数据的数据的数据的数据类类型,也可以作型,也可以作型,也可以作型,也可以作用于用用于用用于用用于用户

15、户自定自定自定自定义义的数据的数据的数据的数据类类型型型型 重载运算符为类的成员函数,其具体语法格式为:重载运算符为类的成员函数,其具体语法格式为:重载运算符为类的成员函数,其具体语法格式为:重载运算符为类的成员函数,其具体语法格式为: :operatoroperator() ; 2024/8/1214第6章运算符重载与友元在复数类中重载运算符在复数类中重载运算符classComplexclassComplex/ /复数类复数类复数类复数类 public:public:Complex(doubler=0.0,doublei=0.0)real=r;image=i;Complex(doubler=

16、0.0,doublei=0.0)real=r;image=i;constdoubleReal()returnreal;constdoubleReal()returnreal;constdoubleImag()returnimage;constdoubleImag()returnimage;Complexoperator+(Complex&c);Complexoperator+(Complex&c);Complexoperator+(doubled);/Complexoperator+(doubled);/重载运算符重载运算符重载运算符重载运算符“+”“+”Complexoperator-(Co

17、mplex&c);/Complexoperator-(Complex&c);/重载运算符重载运算符重载运算符重载运算符“-”“-”Complexoperator-(doubled);/Complexoperator-(doubled);/重载运算符重载运算符重载运算符重载运算符-voidoperator=(Complex&c);/voidoperator=(Complex&c);/重载运算符重载运算符重载运算符重载运算符“=”“=”private:private:doublereal,image;doublereal,image; ;2024/8/1215第6章运算符重载与友元operator

18、operator是进行运算符重载的关键字是进行运算符重载的关键字是进行运算符重载的关键字是进行运算符重载的关键字 是该运算符涉及的操作数是该运算符涉及的操作数是该运算符涉及的操作数是该运算符涉及的操作数运算符重载为成员函数运算符重载为成员函数运算符重载为成员函数运算符重载为成员函数最多有一个形参最多有一个形参最多有一个形参最多有一个形参 运算符重载的运算符重载的运算符重载的运算符重载的实质就是函数重载实质就是函数重载实质就是函数重载实质就是函数重载,只不过函数名,只不过函数名,只不过函数名,只不过函数名换成了关键字换成了关键字换成了关键字换成了关键字operatoroperator和具体要重载

19、的运算符了和具体要重载的运算符了和具体要重载的运算符了和具体要重载的运算符了但但但但是是是是运运运运算算算算符符符符重重重重载载载载也也也也有有有有别别别别于于于于函函函函数数数数重重重重载载载载,运运运运算算算算符符符符重重重重载载载载的的的的函函函函数数数数参参参参数数数数就就就就是是是是该该该该运运运运算算算算符符符符涉涉涉涉及及及及的的的的操操操操作作作作数数数数,因因因因此此此此运运运运算算算算符符符符重重重重载载载载在在在在参参参参数数数数个个个个数数数数上上上上是是是是有有有有限限限限制制制制的的的的,这这这这是是是是它它它它不不不不同同同同于函数重载之处。于函数重载之处。于函数

20、重载之处。于函数重载之处。说明说明2024/8/1216第6章运算符重载与友元例例6-2# #includeinclude usingnamespacestd;usingnamespacestd;classclassMyStringMyString public:public:MyString(constMyString(constchar*=0);/char*=0);/定义构造函数定义构造函数定义构造函数定义构造函数MyString(constMyString(const MyStringMyString&);/&);/定义复制构造函数定义复制构造函数定义复制构造函数定义复制构造函数MySt

21、ringMyString();/();/释放字符元素所占空间释放字符元素所占空间释放字符元素所占空间释放字符元素所占空间unsignedunsignedintintlength();/length();/求字符串长度求字符串长度求字符串长度求字符串长度char*char*c_strc_str();/();/取得该字符串取得该字符串取得该字符串取得该字符串MyStringMyString&operator=(const&operator=(constMyStringMyString&);/&);/重载运算符重载运算符重载运算符重载运算符= =MyStringMyString&operator=(

22、constchar*);&operator=(constchar*);char&operator(unsignedchar&operator(unsignedintint);/);/重载运算符重载运算符重载运算符重载运算符 boolbooloperator=(constoperator=(constMyStringMyString&);/&);/重载运算符重载运算符重载运算符重载运算符=boolbooloperator=(constchar*);operator=(constchar*);private:private:unsignedunsignedintint lenlen;/;/字符串所

23、占空间大小字符串所占空间大小字符串所占空间大小字符串所占空间大小char*char*elemselems;/;/字符串中的字符元素集合字符串中的字符元素集合字符串中的字符元素集合字符串中的字符元素集合; ; 2024/8/1217第6章运算符重载与友元MyString:MyString(constMyString:MyString(const MyStringMyString&strstr) ) if(this!=&if(this!=&strstr)/)/避免向自身赋值避免向自身赋值避免向自身赋值避免向自身赋值unsignedunsignedintintsize=str.len+1;size=

24、str.len+1;elemselems=newcharsize;=newcharsize;strcpystrcpy( (elemselems, ,str.elemsstr.elems););lenlen=size-1;=size-1; 赋值构造函数赋值构造函数2024/8/1218第6章运算符重载与友元重载重载operator=MyStringMyString&MyString:MyString:operatoroperator= =( (constconstMyStringMyString&objobj) ) if(if(this!=&this!=&objobj)/)/避免向自身赋值避免向

25、自身赋值避免向自身赋值避免向自身赋值lenlen=objobj. .lenlen; ;deletedeleteelemselems; ;elemselems=newcharlen+1;=newcharlen+1;strcpystrcpy( (elemselems, ,obj.elemsobj.elems); );return*this;return*this; 2024/8/1219第6章运算符重载与友元重载重载operator=MyStringMyString&MyString:operatorMyString:operator=(=(constchar*constchar*pstrpstr

26、) ) if(if(! !pstrpstr)/)/pstrpstr是个空指针是个空指针是个空指针是个空指针lenlen=0;=0;deletedeleteelemselems; ;elemselems=0;=0;elseelselenlen=strlen(pstrstrlen(pstr); );deletedeleteelemselems; ;elemselems=newcharlen+1;=newcharlen+1;strcpystrcpy( (elems,pstrelems,pstr); );return*this;return*this; 2024/8/1220第6章运算符重载与友元重载

27、重载operator/ /返回第返回第返回第返回第i i个位置的字符个位置的字符个位置的字符个位置的字符char&char& MyString:MyString:operatoroperator(unsigned(unsigned intinti)i) if(iif(ilenlen)/)/判断下标是否出界判断下标是否出界判断下标是否出界判断下标是否出界coutcoutIndexoutofboundaryIndexoutofboundaryendlendl; ;exit(1);exit(1);returnreturnelemsielemsi; ; 2024/8/1221第6章运算符重载与友元重载

28、重载operator=boolbool MyString:MyString:operatoroperator=( (constconstMyStringMyString&pstrpstr) ) /如果相等,返回如果相等,返回如果相等,返回如果相等,返回truetrue,否则否则否则否则falsefalseif(lenif(len!=!=pstr.lenpstr.len)returnfalse;)returnfalse;returnreturnstrcmp(elems,pstr.elemsstrcmp(elems,pstr.elems)?false:true;)?false:true; bool

29、bool MyString:MyString:operatoroperator=( (constchar*constchar*pstrpstr) ) if(lenif(len!=!=strlen(pstrstrlen(pstr)returnfalse;)returnfalse;returnreturnstrcmp(elems,pstrstrcmp(elems,pstr)?false:true;)?false:true; 2024/8/1222第6章运算符重载与友元intintmain()main() MyStringMyStrings(Howareyou?),s1=s;s(Howareyou?

30、),s1=s;coutcout字字字字 符符符符 串串串串 HowHow areare you?you?第第第第 6 6个个个个 位位位位 置置置置 的的的的 字字字字 符符符符 是是是是 :s5s5endlendl; ;if(if(s=Hows=How) )coutcout两字符串比较结果:两字符串比较结果:两字符串比较结果:两字符串比较结果:equalequalendlendl; ;elseelsecoutcout两字符串比较结果:两字符串比较结果:两字符串比较结果:两字符串比较结果:unequalunequalendlendl;s1=Fine;s1=Fine;return0;return

31、0; if(if(HowHow =s=s) )是否可以?是否可以?是否可以?是否可以?2024/8/1223第6章运算符重载与友元说明说明在重载赋值运算符时,在重载赋值运算符时,要注意进行自赋值检要注意进行自赋值检测测。所谓自赋值是指将对象赋值给它本身。所谓自赋值是指将对象赋值给它本身。运算符重载使系统预定义的运算符可以作用运算符重载使系统预定义的运算符可以作用于用户自定义类型,但绝不能改变运算符原于用户自定义类型,但绝不能改变运算符原有的优先级、结合性以及语法结构。有的优先级、结合性以及语法结构。运算符重载为成员函数时,运算符重载为成员函数时,左操作数必须是左操作数必须是对象本身对象本身20

32、24/8/1224第6章运算符重载与友元运算符重载的规则运算符重载的规则重载的功能应当与原有功能类似,不能改重载的功能应当与原有功能类似,不能改变原运算符的操作数个数,同时至少要有变原运算符的操作数个数,同时至少要有一个操作数的类型是自定义类型。一个操作数的类型是自定义类型。重载之后运算符的优先级和结合性都不会重载之后运算符的优先级和结合性都不会改变,并且要保持原运算符的语法结构。改变,并且要保持原运算符的语法结构。参数和函数值类型都可以重新说明。参数和函数值类型都可以重新说明。 2024/8/1225第6章运算符重载与友元不能重载的运算符不能重载的运算符不能重载的运算符不能重载的运算符不能重

33、载的运算符不能重载的运算符 说明说明说明说明 : :作用域运算符作用域运算符作用域运算符作用域运算符. .成员访问运算符成员访问运算符成员访问运算符成员访问运算符.* .*指向成员的指针指向成员的指针指向成员的指针指向成员的指针?:?:条件运算符条件运算符条件运算符条件运算符条件运算符条件运算符条件运算符条件运算符求求求求表表表表达达达达式式式式或或或或数数数数据据据据类类类类型型型型所所所所占占占占存存存存储储储储空间字节数空间字节数空间字节数空间字节数sizeofsizeof用用用用于于于于运运运运行行行行时时时时类类类类型型型型信信信信息息息息(RTTIRTTI)的的的的识识识识别别别别

34、,指指指指出出出出指指指指针针针针或或或或引引引引用用用用指指指指向向向向的对象的实际派生类型的对象的实际派生类型的对象的实际派生类型的对象的实际派生类型2024/8/1226第6章运算符重载与友元思考思考能否在例能否在例6-3中实现中实现 if(if(HowHow=s=s) )?是否可以将是否可以将operator=实现为如下形式?实现为如下形式? boolbool operator=operator= ( (constconst charchar * *pstrpstr, , constconst MyStringMyString &str1)str1) if(if(strlen(pstr

35、strlen(pstr)!=)!=str1.str1.length()length() returnfalse;returnfalse; returnreturnstrcmpstrcmp(pstrpstr,str1.c_str()?false:true;,str1.c_str()?false:true; 其其其其中中中中,第第第第一一一一个个个个参参参参数数数数pstrpstr代代代代表表表表运运运运算算算算符符符符=的的的的左左左左操操操操作作作作数数数数,第第第第二二二二个参数个参数个参数个参数str1str1代表右操作数代表右操作数代表右操作数代表右操作数2024/8/1227第6章运算

36、符重载与友元根据类的封装性,一般将数据成员声明为根据类的封装性,一般将数据成员声明为私有成员,外部不能直接访问,只能通过私有成员,外部不能直接访问,只能通过类的公有成员函数对私有成员进行访问。类的公有成员函数对私有成员进行访问。有时,需要频繁地调用成员函数来访问私有时,需要频繁地调用成员函数来访问私有成员,这就存在一定的系统开销。有成员,这就存在一定的系统开销。C+C+从高效的角度出发从高效的角度出发,提供友元机制,使,提供友元机制,使被声明为友元的全局函数或者其他类可以被声明为友元的全局函数或者其他类可以直接访问当前类中的私有成员,又不改变直接访问当前类中的私有成员,又不改变其私有成员的访问

37、权限。其私有成员的访问权限。 友元友元2024/8/1228第6章运算符重载与友元友元可以是一个全局函数,也可以是一个类的成友元可以是一个全局函数,也可以是一个类的成友元可以是一个全局函数,也可以是一个类的成友元可以是一个全局函数,也可以是一个类的成员函数,还可以是一个类。如果友元是函数,则员函数,还可以是一个类。如果友元是函数,则员函数,还可以是一个类。如果友元是函数,则员函数,还可以是一个类。如果友元是函数,则称为友元函数。如果友元是一个类,则称为友元称为友元函数。如果友元是一个类,则称为友元称为友元函数。如果友元是一个类,则称为友元称为友元函数。如果友元是一个类,则称为友元类。友元类的所

38、有成员函数都是友元函数,可以类。友元类的所有成员函数都是友元函数,可以类。友元类的所有成员函数都是友元函数,可以类。友元类的所有成员函数都是友元函数,可以访问被访问类的任何成员。访问被访问类的任何成员。访问被访问类的任何成员。访问被访问类的任何成员。友元声明以关键字友元声明以关键字友元声明以关键字友元声明以关键字friendfriend开始开始开始开始,只能出现在被访问只能出现在被访问只能出现在被访问只能出现在被访问类的定义中类的定义中类的定义中类的定义中。具体格式如下。具体格式如下。具体格式如下。具体格式如下 friendfriend();); friendclassfriendclass;

39、友元的定义友元的定义2024/8/1229第6章运算符重载与友元例例6-3classclassMyStringMyString; ;boolbooloperator=(constoperator=(constMyStringMyString&,const&,constMyStringMyString&);&);boolbooloperator=(constchar*,constoperator=(constchar*,constMyStringMyString&);&);boolbooloperator=(constoperator=(constMyStringMyString&,constc

40、har*);&,constchar*); classclassMyStringMyString public:public:MyString(constMyString(constchar*=0);/char*=0);/定义构造函数定义构造函数定义构造函数定义构造函数MyString(constMyString(const MyStringMyString&);/&);/定义复制构造函数定义复制构造函数定义复制构造函数定义复制构造函数MyStringMyString();/();/释放字符元素所占空间释放字符元素所占空间释放字符元素所占空间释放字符元素所占空间unsignedunsignedi

41、ntintlength();/length();/求字符串长度求字符串长度求字符串长度求字符串长度char*char*c_strc_str();/();/取得该字符串取得该字符串取得该字符串取得该字符串 friendfriendboolbooloperator=(constoperator=(constMyStringMyString&,const&,constMyStringMyString&);&);friendfriendboolbooloperator=(constchar*,constoperator=(constchar*,constMyStringMyString&);&);fr

42、iendfriendboolbooloperator=(constoperator=(constMyStringMyString&,constchar*);&,constchar*);private:private:unsignedunsignedintint lenlen;/;/字符串所占空间大小字符串所占空间大小字符串所占空间大小字符串所占空间大小char*char*elemselems;/;/字符串中的字符元素集合字符串中的字符元素集合字符串中的字符元素集合字符串中的字符元素集合;2024/8/1230第6章运算符重载与友元boolbool operator=operator=(cons

43、t(constMyStringMyString&str1,const&str1,constMyStringMyString&str2)&str2) if(str1.len!=str2.len)if(str1.len!=str2.len)returnfalse;returnfalse;returnstr1.lenstr2.len?false:true;returnstr1.lenstr2.len?false:true; boolbool operator=operator=(constchar*str1,const(constchar*str1,constMyStringMyString&str

44、2)&str2) if(strlen(str1)!=str2.len)if(strlen(str1)!=str2.len)returnfalse;returnfalse;returnstrlen(str1)str2.returnstrlen(str1)str2.lenlen?false:true;?false:true; boolbool operator=operator=(const(constMyStringMyString&str1,constchar*str2)&str1,constchar*str2) if(str1.len!=strlen(str2)if(str1.len!=st

45、rlen(str2)returnfalse;returnfalse;returnstr1.lenstrlen(str2)?false:true;returnstr1.lenstrlen(str2)?false:true;2024/8/1231第6章运算符重载与友元intintmain()main() MyStringMyStrings(Howareyou?);s(Howareyou?);if(if(How=sHow=s) )coutcout两字符串比较结果:两字符串比较结果:两字符串比较结果:两字符串比较结果:equalequalendlendl; ;elseelsecoutcout两字符串比

46、较结果:两字符串比较结果:两字符串比较结果:两字符串比较结果:unequalunequalendlendl; ;return0;return0; 2024/8/1232第6章运算符重载与友元说明说明 友元函数友元函数友元函数友元函数operator=operator=是一个全局函数,但作为是一个全局函数,但作为是一个全局函数,但作为是一个全局函数,但作为MyStringMyString类类类类的友元,它只能在的友元,它只能在的友元,它只能在的友元,它只能在MyStringMyString类中声明。而友元函数的实现类中声明。而友元函数的实现类中声明。而友元函数的实现类中声明。而友元函数的实现既可

47、以在既可以在既可以在既可以在MyStringMyString类外实现也可以在类中实现。无论在哪类外实现也可以在类中实现。无论在哪类外实现也可以在类中实现。无论在哪类外实现也可以在类中实现。无论在哪里实现,友元函数都须通过对象名访问类中的私有成员。里实现,友元函数都须通过对象名访问类中的私有成员。里实现,友元函数都须通过对象名访问类中的私有成员。里实现,友元函数都须通过对象名访问类中的私有成员。 在例在例在例在例6-46-4中,对中,对中,对中,对MyStringMyString类和友元函数类和友元函数类和友元函数类和友元函数operator=operator=进行了前进行了前进行了前进行了前向

48、声明,向声明,向声明,向声明,从语法上讲,这个前向声明应该是不必要的从语法上讲,这个前向声明应该是不必要的从语法上讲,这个前向声明应该是不必要的从语法上讲,这个前向声明应该是不必要的。但。但。但。但是在是在是在是在VC6.0VC6.0的标准名字空间中,这个前向声明是必须的。的标准名字空间中,这个前向声明是必须的。的标准名字空间中,这个前向声明是必须的。的标准名字空间中,这个前向声明是必须的。这是这是这是这是VC6.0VC6.0本身的缺陷所导致,本身的缺陷所导致,本身的缺陷所导致,本身的缺陷所导致,可以通过下载相关补丁程可以通过下载相关补丁程可以通过下载相关补丁程可以通过下载相关补丁程序弥补该缺

49、陷序弥补该缺陷序弥补该缺陷序弥补该缺陷,在,在,在,在VC+VC+的后续版本中不存在这个缺陷。的后续版本中不存在这个缺陷。的后续版本中不存在这个缺陷。的后续版本中不存在这个缺陷。2024/8/1233第6章运算符重载与友元例例6-4 友元类友元类#include#include #include#includeusingnamespacestd;usingnamespacestd;classdate;/classdate;/类的前向声明类的前向声明类的前向声明类的前向声明classstudentclassstudent public:public:student(char*student(ch

50、ar*pidpid,char*,char*pnamepname,char*,char*pdeptpdept) )id=id=pidpid; ;name=name=pnamepname; ;dept=dept=pdeptpdept; ;voiddisplay(date&,date&);voiddisplay(date&,date&);private:private:stringid;stringid;stringname;stringname;stringdept;stringdept; ; 2024/8/1234第6章运算符重载与友元classdateclassdate friendclass

51、student;friendclassstudent;/友元类声明友元类声明友元类声明友元类声明public:public:date(intdate(inty=2000,intm=1,intd=1)y=2000,intm=1,intd=1):year(y),month(m),day(d):year(y),month(m),day(d)private:private:intintyear;year;intintmonth;month;intintday;day;2024/8/1235第6章运算符重载与友元voidstudent:display(date&d1,date&d2)voidstuden

52、t:display(date&d1,date&d2) coutcoutid:idid:idendlendl; ;coutcoutname:namename:nameendlendl; ;coutcoutdept:deptdept:deptendlendl; ;coutcoutBirthDateBirthDate:d1.year-d1.month:d1.year-d1.month-d1.day-d1.dayendlendl; ; coutcoutEnterDateEnterDate:d2.year-d2.month:d2.year-d2.month-d2.day-d2.dayendlendl;

53、; intintmain()main() dated1(1988,5,23),d2(2007,9,1);dated1(1988,5,23),d2(2007,9,1);students(01105,John,Computer);students(01105,John,Computer);s.display(d1,d2);s.display(d1,d2);return0;return0; 2024/8/1236第6章运算符重载与友元 友友友友元元元元的的的的出出出出现现现现主主主主要要要要是是是是为为为为了了了了解解解解决决决决一一一一些些些些实实实实际际际际问问问问题题题题,友友友友元元元元本本

54、本本身身身身不不不不是是是是面面面面向向向向对象的内容。对象的内容。对象的内容。对象的内容。 通通通通过过过过友友友友元元元元机机机机制制制制,一一一一个个个个类类类类或或或或函函函函数数数数可可可可以以以以直直直直接接接接访访访访问问问问另另另另一一一一类类类类中中中中的的的的非非非非公公公公有有有有成员。成员。成员。成员。 可以将全局函数、类、类的成员函数声明为友元。可以将全局函数、类、类的成员函数声明为友元。可以将全局函数、类、类的成员函数声明为友元。可以将全局函数、类、类的成员函数声明为友元。 友友友友元元元元关关关关系系系系是是是是不不不不能能能能传传传传递递递递的的的的。B B B

55、 B类类类类是是是是A A A A类类类类的的的的友友友友元元元元,C C C C类类类类是是是是B B B B类类类类的的的的友友友友元元元元,C C C C类类类类和和和和A A A A类类类类之之之之间间间间,如如如如果果果果没没没没有有有有声声声声明明明明,就就就就没没没没有有有有任任任任何何何何友友友友元元元元关关关关系系系系,不不不不能能能能进进进进行数据共享。行数据共享。行数据共享。行数据共享。 友友友友元元元元关关关关系系系系是是是是单单单单向向向向的的的的,如如如如果果果果声声声声明明明明B B B B类类类类是是是是A A A A类类类类的的的的友友友友元元元元,B B B

56、 B类类类类的的的的成成成成员员员员函函函函数数数数就就就就可可可可以以以以访访访访问问问问A A A A类类类类的的的的私私私私有有有有成成成成员员员员和和和和保保保保护护护护成成成成员员员员。但但但但A A A A类类类类的的的的成成成成员员员员不不不不能能能能访访访访问问问问B B B B类的私有成员和保护成员,除非声明类的私有成员和保护成员,除非声明类的私有成员和保护成员,除非声明类的私有成员和保护成员,除非声明A A A A类是类是类是类是B B B B类的友元。类的友元。类的友元。类的友元。 友元关系是不能继承的。友元关系是不能继承的。友元关系是不能继承的。友元关系是不能继承的。B

57、 B B B类是类是类是类是A A A A类的友元,类的友元,类的友元,类的友元,C C C C类是类是类是类是B B B B类的派生类,类的派生类,类的派生类,类的派生类,则则则则C C C C类和类和类和类和A A A A类之间没有任何友元关系,除非类之间没有任何友元关系,除非类之间没有任何友元关系,除非类之间没有任何友元关系,除非C C C C类声明类声明类声明类声明A A A A类是友元。类是友元。类是友元。类是友元。 友元知识小结友元知识小结2024/8/1237第6章运算符重载与友元运算符重载为类的友元函数运算符重载为类的友元函数语法形式语法形式语法形式语法形式 friendfri

58、end operatoroperator() ; 运算符重载为类的友元函数运算符重载为类的友元函数运算符重载为类的友元函数运算符重载为类的友元函数最多只能有两个参数最多只能有两个参数最多只能有两个参数最多只能有两个参数如果重载双目运算符,则如果重载双目运算符,则如果重载双目运算符,则如果重载双目运算符,则第一个参数代表左操作第一个参数代表左操作第一个参数代表左操作第一个参数代表左操作数,第二个参数代表右操作数数,第二个参数代表右操作数数,第二个参数代表右操作数数,第二个参数代表右操作数2024/8/1238第6章运算符重载与友元例例6-9classTriangleclassTriangle p

59、ublic:public:Triangle(intTriangle(int i,inti,int j,intj,intk)k) doubles;doubles;x=i;y=j;z=k;x=i;y=j;z=k;s=(x+y+z)/2.0;s=(x+y+z)/2.0;area=area=sqrt(ssqrt(s*(s-x)*(s-y)*(s-z);*(s-x)*(s-y)*(s-z); voidvoiddispareadisparea()()coutcoutArea=areaArea=areaendlendl;/ /运算符重载为友元函数运算符重载为友元函数运算符重载为友元函数运算符重载为友元函数f

60、riendconstdoubleoperator+friendconstdoubleoperator+(Triangle&t1,Triangle&t2)(Triangle&t1,Triangle&t2) returnt1.area+t2.area;returnt1.area+t2.area;private:private:intx,y,z;intx,y,z;doublearea;doublearea;2024/8/1239第6章运算符重载与友元intintmain()main() Trianglet1(3,4,5),t2(4,5,6);Trianglet1(3,4,5),t2(4,5,6);d

61、oubles;doubles;coutcoutt1:;t1:;t1.disparea();t1.disparea();coutcoutt2:;t2:;t2.disparea();t2.disparea();s=t1+t2;s=t1+t2;coutcout总面积总面积总面积总面积=ss-、-*-*必须为成员函数必须为成员函数必须为成员函数必须为成员函数+=+=、= =、/=/=、*=*=、=、&=&=、|=|=、%=%=、=、=成员函数成员函数成员函数成员函数所有其他二元运算符所有其他二元运算符所有其他二元运算符所有其他二元运算符友元函数友元函数友元函数友元函数2024/8/1241第6章运算符

62、重载与友元“+”重载为成员函数形式重载为成员函数形式 # #includeinclude usingnamespacestd;usingnamespacestd;classClock/classClock/时钟类时钟类时钟类时钟类public:public:Clock(intClock(int NewHNewH=0,int=0,intNewMNewM=0,int=0,intNewSNewS=0);=0);voidShowTime();voidShowTime();voidoperator+();voidoperator+(); / /前缀运算符重载函数的声明前缀运算符重载函数的声明前缀运算符重

63、载函数的声明前缀运算符重载函数的声明/后缀运算符重载函数,加后缀运算符重载函数,加后缀运算符重载函数,加后缀运算符重载函数,加intint参数以示区分参数以示区分参数以示区分参数以示区分voidvoidoperator+(intoperator+(int););private:private:intintHour,Minute,Second;Hour,Minute,Second;2024/8/1242第6章运算符重载与友元voidClock:voidClock:operator+operator+()/()/前缀单目运算符重载函数的实现前缀单目运算符重载函数的实现前缀单目运算符重载函数的实现前

64、缀单目运算符重载函数的实现 Second+;Second+;if(Second=60)if(Second=60) Second=Second-60;Second=Second-60;Minute+;Minute+;if(Minute=60)if(Minute=60)Minute=Minute-60;Minute=Minute-60;Hour+;Hour+;Hour=Hour%24;Hour=Hour%24; coutcout+Clock:;=60)if(Second=60) Second=Second-60;Second=Second-60;Minute+;Minute+;if(Minute=

65、60)if(Minute=60)Minute=Minute-60;Minute=Minute-60;Hour+;Hour+;Hour=Hour%24;Hour=Hour%24;coutcoutClock+:;Clock+:; 2024/8/1244第6章运算符重载与友元说明说明运算符重载为类的成员函数时,函数的参数个数比运算符重载为类的成员函数时,函数的参数个数比运算符重载为类的成员函数时,函数的参数个数比运算符重载为类的成员函数时,函数的参数个数比原来操作数少一个(后缀原来操作数少一个(后缀原来操作数少一个(后缀原来操作数少一个(后缀“+”“+”“+”“+”和后缀和后缀和后缀和后缀“-”“-

66、”“-”“-”除外)除外)除外)除外)。 运算符重载为成员函数后,它可以自由地访问类的运算符重载为成员函数后,它可以自由地访问类的运算符重载为成员函数后,它可以自由地访问类的运算符重载为成员函数后,它可以自由地访问类的所有成员。实际使用时,总是通过该类的某个对象所有成员。实际使用时,总是通过该类的某个对象所有成员。实际使用时,总是通过该类的某个对象所有成员。实际使用时,总是通过该类的某个对象来访问重载的运算符。来访问重载的运算符。来访问重载的运算符。来访问重载的运算符。 如果是双目运算符,左操作数一定是对象本身,由如果是双目运算符,左操作数一定是对象本身,由如果是双目运算符,左操作数一定是对象

67、本身,由如果是双目运算符,左操作数一定是对象本身,由thisthisthisthis指针给出,另一个操作数需要由运算符重载的指针给出,另一个操作数需要由运算符重载的指针给出,另一个操作数需要由运算符重载的指针给出,另一个操作数需要由运算符重载的参数表来传递。参数表来传递。参数表来传递。参数表来传递。 如果是单目运算符,操作数由对象的如果是单目运算符,操作数由对象的如果是单目运算符,操作数由对象的如果是单目运算符,操作数由对象的thisthisthisthis指针给出,指针给出,指针给出,指针给出,就不再需要任何参数。但重载就不再需要任何参数。但重载就不再需要任何参数。但重载就不再需要任何参数。

68、但重载“+”“+”“+”“+”和和和和“-”“-”“-”“-”运算运算运算运算符时,符时,符时,符时,C+C+C+C+约定,如果在参数表中放一个整形参数,约定,如果在参数表中放一个整形参数,约定,如果在参数表中放一个整形参数,约定,如果在参数表中放一个整形参数,则表示重载的运算符为后缀运算符。则表示重载的运算符为后缀运算符。则表示重载的运算符为后缀运算符。则表示重载的运算符为后缀运算符。 2024/8/1245第6章运算符重载与友元解决问题解决问题classComplexclassComplex/ /复数类复数类复数类复数类 public:public:Complex(doubler=0.0,

69、doublei=0.0)real=r;image=i;Complex(doubler=0.0,doublei=0.0)real=r;image=i;constdoubleReal()returnreal;constdoubleReal()returnreal;constdoubleconstdoubleImag()returnImag()returnimage;image;/重载运算符重载运算符重载运算符重载运算符+,复数加复数,复数加复数,复数加复数,复数加复数friendconstComplexoperator+(constComplex&c1,constComplex&c2);frien

70、dconstComplexoperator+(constComplex&c1,constComplex&c2);/重载运算符重载运算符重载运算符重载运算符+,复数加实数,复数加实数,复数加实数,复数加实数friendconstComplexoperator+(constdoubled,constComplex&c);friendconstComplexoperator+(constdoubled,constComplex&c);/ /重载运算符重载运算符重载运算符重载运算符-,复数减复数,复数减复数,复数减复数,复数减复数friendconstComplexoperator-(constCom

71、plex&c1,constComplex&c2);friendconstComplexoperator-(constComplex&c1,constComplex&c2);/重载运算符重载运算符重载运算符重载运算符=,为复数赋值,为复数赋值,为复数赋值,为复数赋值Complex&operator=(Complex&c);Complex&operator=(Complex&c);private:private:doublereal,image;doublereal,image;2024/8/1246第6章运算符重载与友元constComplexoperator+(constComplex&c1,

72、constComplex&c2)constComplexoperator+(constComplex&c1,constComplex&c2) Complextemp;Complextemp;temp.real=c1.real+c2.real;temp.real=c1.real+c2.real; / /实部相加实部相加实部相加实部相加temp.image=c1.image+c2.image;temp.image=c1.image+c2.image;/ /虚部相加虚部相加虚部相加虚部相加returntemp;returntemp; constComplexoperator+(constdouble

73、d,constComplex&c)constComplexoperator+(constdoubled,constComplex&c) Complextemp;Complextemp;temp.real=d+c.real;temp.real=d+c.real;temp.image=c.image;temp.image=c.image;returntemp;returntemp; 2024/8/1247第6章运算符重载与友元constComplexoperator-(constComplex&c1,constComplex&c2)constComplexoperator-(constComple

74、x&c1,constComplex&c2) Complextemp;Complextemp;temp.real=c1.real-c2.real;temp.real=c1.real-c2.real;/ /实部相减实部相减实部相减实部相减temp.image=c1.image-c2.image;temp.image=c1.image-c2.image; / /虚部相减虚部相减虚部相减虚部相减returntemp;returntemp; Complex&Complex:operator=(Complex&c)Complex&Complex:operator=(Complex&c) if(this!=

75、&c)/if(this!=&c)/自赋值检测自赋值检测自赋值检测自赋值检测real=c.real;real=c.real;image=c.image;image=c.image;return*this;return*this;/*this/*this表示当前对象表示当前对象表示当前对象表示当前对象 2024/8/1248第6章运算符重载与友元intintmain()main() Complexc1(3,4),c2(5,6),c3,c4;Complexc1(3,4),c2(5,6),c3,c4;/ /定义复数类的对象定义复数类的对象定义复数类的对象定义复数类的对象coutcoutc1=c1.Re

76、al()+ic1.Imag()c1=c1.Real()+ic1.Imag()endlendl; ;coutcoutc2=c2.Real()+ic2.Imag()c2=c2.Real()+ic2.Imag()endlendl; ;c3=c1+c2;c3=c1+c2;/ /重载运算符重载运算符重载运算符重载运算符+、=,完成复数加复数,完成复数加复数,完成复数加复数,完成复数加复数coutcoutc3=c1+c2=c3.Real()+ic3.Imag()c3=c1+c2=c3.Real()+ic3.Imag()endlendl; ;c3=c3+6.5;c3=c3+6.5;/ /重载运算符重载运算符

77、重载运算符重载运算符+、=,完成复数加实数,完成复数加实数,完成复数加实数,完成复数加实数coutcoutc3+6.5=c3.Real()+ic3.Imag()c3+6.5=c3.Real()+ic3.Imag()endlendl; ;c4=c2-c1;c4=c2-c1; / /重载运算符重载运算符重载运算符重载运算符-、=,完成复数减复数,完成复数减复数,完成复数减复数,完成复数减复数coutcoutc4=c2-c1=c4.Real()+ic4.Imag()c4=c2-c1=c4.Real()+ic4.Imag()endlendl; ;return0;return0; 2024/8/1249

78、第6章运算符重载与友元 在在在在C+C+标准库中,已经为用户提供了与复数有关的库函数,标准库中,已经为用户提供了与复数有关的库函数,标准库中,已经为用户提供了与复数有关的库函数,标准库中,已经为用户提供了与复数有关的库函数,它们包含在它们包含在它们包含在它们包含在 complex头文件中。在实际应用中,用户只头文件中。在实际应用中,用户只头文件中。在实际应用中,用户只头文件中。在实际应用中,用户只需要将此头文件包含到源程序文件中即可。需要将此头文件包含到源程序文件中即可。需要将此头文件包含到源程序文件中即可。需要将此头文件包含到源程序文件中即可。 对于任何形参,如果仅需要从函数中读而不改变它,

79、默认对于任何形参,如果仅需要从函数中读而不改变它,默认对于任何形参,如果仅需要从函数中读而不改变它,默认对于任何形参,如果仅需要从函数中读而不改变它,默认地应该作为地应该作为地应该作为地应该作为constconst引用来传递它。引用来传递它。引用来传递它。引用来传递它。 所有赋值运算均改变左值(左值是可以被赋值的表达式,所有赋值运算均改变左值(左值是可以被赋值的表达式,所有赋值运算均改变左值(左值是可以被赋值的表达式,所有赋值运算均改变左值(左值是可以被赋值的表达式,位于赋值语句的左侧),因此,所以赋值运算的返回值对位于赋值语句的左侧),因此,所以赋值运算的返回值对位于赋值语句的左侧),因此,

80、所以赋值运算的返回值对位于赋值语句的左侧),因此,所以赋值运算的返回值对于左值应该是非常量引用。于左值应该是非常量引用。于左值应该是非常量引用。于左值应该是非常量引用。 说明说明2024/8/1250第6章运算符重载与友元举一反三举一反三 #include#include usingnamespacestd;usingnamespacestd;classRMB/classRMB/定义人民币类定义人民币类定义人民币类定义人民币类RMBRMB public:public:RMB(doublevalue=0.0)/RMB(doublevalue=0.0)/构造函数构造函数构造函数构造函数yuanyu

81、an=(=(int)valueint)value; ;jiaojiao=(=(int)(value-yuanint)(value-yuan)*10);)*10);fen=(fen=(int)(valueint)(value*100-yuan*100-jiao*10);*100-yuan*100-jiao*10);voidprint()voidprint()coutcoutyuanyuan元元元元jiaojiao角角角角fenfen分分分分endlendl; ; operatordouble()/operatordouble()/重载类型转换运算符重载类型转换运算符重载类型转换运算符重载类型转换

82、运算符doubledouble,没有函数值类型没有函数值类型没有函数值类型没有函数值类型returnreturnyuanyuan+jiaojiao*0.1+fen*0.01;*0.1+fen*0.01;private:private:intint yuan,jiao,fenyuan,jiao,fen; ; ;2024/8/1251第6章运算符重载与友元intintmain()main() RMBa(3.45),b(2.11);/RMBa(3.45),b(2.11);/定义定义定义定义2 2个个个个RMBRMB类的对象类的对象类的对象类的对象a a、b b/将两个对象将两个对象将两个对象将两个对

83、象a a、b b强制转换为实数,再相加,结果用于初始化对象强制转换为实数,再相加,结果用于初始化对象强制转换为实数,再相加,结果用于初始化对象强制转换为实数,再相加,结果用于初始化对象c cRMBc=RMB(double)a+(double)b);RMBc=RMB(double)a+(double)b);a.print();a.print();b.print();b.print();c.print();c.print();return0;return0; 2024/8/1252第6章运算符重载与友元本章小结本章小结运算符重载是赋予系统预定义的运算符多运算符重载是赋予系统预定义的运算符多重含义,

84、使得预定义运算符能够对类对象重含义,使得预定义运算符能够对类对象进行运算。运算符重载实质上就是函数重进行运算。运算符重载实质上就是函数重载,但不同的是,运算符重载函数对参数载,但不同的是,运算符重载函数对参数个数有限制,并保持优先级、结合性以及个数有限制,并保持优先级、结合性以及语法结构不变等特性。语法结构不变等特性。 2024/8/1253第6章运算符重载与友元本章小结本章小结运算符重载不是每个程序必须具有的功能,它的运算符重载不是每个程序必须具有的功能,它的运算符重载不是每个程序必须具有的功能,它的运算符重载不是每个程序必须具有的功能,它的出现只是为了增加程序的易读性。出现只是为了增加程序

85、的易读性。出现只是为了增加程序的易读性。出现只是为了增加程序的易读性。 运算符重载不是新的机制,其实质是函数重载。运算符重载不是新的机制,其实质是函数重载。运算符重载不是新的机制,其实质是函数重载。运算符重载不是新的机制,其实质是函数重载。与函数重载不同的是,运算符重载在参数上有限与函数重载不同的是,运算符重载在参数上有限与函数重载不同的是,运算符重载在参数上有限与函数重载不同的是,运算符重载在参数上有限制制制制。运算符重载有两种形式:重载为类的成员函数、运算符重载有两种形式:重载为类的成员函数、运算符重载有两种形式:重载为类的成员函数、运算符重载有两种形式:重载为类的成员函数、重载为类的友元

86、函数。当运算符重载为成员函数重载为类的友元函数。当运算符重载为成员函数重载为类的友元函数。当运算符重载为成员函数重载为类的友元函数。当运算符重载为成员函数时,左操作数一定是当前对象本身,而重载为友时,左操作数一定是当前对象本身,而重载为友时,左操作数一定是当前对象本身,而重载为友时,左操作数一定是当前对象本身,而重载为友元函数时,该运算符所涉及的所有操作数都必须元函数时,该运算符所涉及的所有操作数都必须元函数时,该运算符所涉及的所有操作数都必须元函数时,该运算符所涉及的所有操作数都必须出现在函数的参数列表当中。操作数出现的顺序出现在函数的参数列表当中。操作数出现的顺序出现在函数的参数列表当中。

87、操作数出现的顺序出现在函数的参数列表当中。操作数出现的顺序按照参数从左到右出现的顺序决定。按照参数从左到右出现的顺序决定。按照参数从左到右出现的顺序决定。按照参数从左到右出现的顺序决定。 2024/8/1254第6章运算符重载与友元类的友元可以访问类的所有成员。友元可类的友元可以访问类的所有成员。友元可以是普通函数,其他类的成员函数,也可以是普通函数,其他类的成员函数,也可以是其他类。友元关系既不能传递、也不以是其他类。友元关系既不能传递、也不能继承、也不可逆。友元不是纯面向对象能继承、也不可逆。友元不是纯面向对象的产物,它在类之间、类与普通函数之间的产物,它在类之间、类与普通函数之间共享了内部封装的数据,破坏了类的封装共享了内部封装的数据,破坏了类的封装性,设计它的目的是为了实用。因此,在性,设计它的目的是为了实用。因此,在实际编程过程中,应尽量避免使用友元。实际编程过程中,应尽量避免使用友元。 2024/8/1255第6章运算符重载与友元常见错误常见错误臆造新的符号作运算符臆造新的符号作运算符 运算符重载为成员函数和友元函数时参数运算符重载为成员函数和友元函数时参数个数问题个数问题 前缀与后缀运算符重载的区分问题前缀与后缀运算符重载的区分问题 2024/8/1256第6章运算符重载与友元

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号