版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Chapter5-C++OperatorOverloadingOutline5.1 Introduction5.2 FundamentalsofOperatorOverloading5.3 RestrictionsonOperatorOverloading5.4 OperatorFunctionsasClassMembersvs.asfriendFunctions5.5 OverloadingStream-InsertionandStream-ExtractionOperators5.6 OverloadingUnaryOperators 5.7 OverloadingBinaryOperators5.8 CaseStudy:AnArrayClass5.9 ConvertingbetweenTypes5.10 Overloading++and--
ObjectivesInthischapter,youwilllearn:Tounderstandhowtoredefine(overload)operatorstoworkwithnewtypes.Tounderstandhowtoconvertobjectsfromoneclasstoanotherclass.Tolearnwhento,andwhennotto,overloadoperators.Tostudyseveralinterestingclassesthatuseoverloadedoperators.TocreateanArrayclass.
4.1Introduction(1)运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时,产生不同类型的行为。C++允许同一运算符具有多种不同运算功能的机制。(2)为什么需要运算符重载:C++中预定义了许多运算符,能够满足用户的一般应用要求,但是其运算的对象应是基本数据类型,而不适用于用户自定义数据类型(如类),这可以使用运算符重载。(3)明智地使用操作符重载可以使类类型的使用像内置类型一样直观(4)操作符的实质是函数重载。4.1IntroductionOperatoroverloading
Usetraditionaloperatorswithuser-definedobjectsStraightforwardandnaturalwaytoextendC++Requiresgreatcare
Whenoverloadingismisused,programsbecomedifficulttounderstand
classpoint {public: point(intxx=0,intyy=0){x=xx;y=yy;}
intget_x();
intget_y(); //...private:
intx;
inty;};pointp1(1,1),p2(3,3),实现“p1+p2”则需要编写程序来说明“+”如何作用于point对象(p1,p2),即p1的私有成员x,y与p2的私有成员x,y分别相加这一功能。4.2FundamentalsofOperatorOverloadingUseoperatoroverloadingtoimprovereadabilityAvoidexcessiveorinconsistentusageFormatWritefunctiondefinitionasnormal(重载函数跟普通函数一样,具有返回类型和形参表)Functionnameiskeywordoperatorfollowedbythesymbolfortheoperatorbeingoverloaded.
operator+wouldbeusedtooverloadtheadditionoperator(+).4.2FundamentalsofOperatorOverloadingAssignmentoperator(=)maybeusedwitheveryclasswithoutexplicitoverloadingmemberwiseassignment(不需专门定义,默认存在,逐一复制数据成员)class
MyClass{
public:...
MyClass&operator=(const
MyClass&rhs);...}
MyClass&MyClass::operator=(const
MyClass&rhs){...return*this;}
MyClassa,b,c;...a=b=c;//Sameasb.operator=(a);4.3RestrictionsonOperatorOverloading
MostofC++’soperatorscanbeoverloaded有四个符号(+,-,*和&)既可作一元操作符又可作二元操作符,可以同时定义一元和二元操作符重载操作符不能改变原操作符的优先级、结合性或操作数目重载操作符必须具有至少一个自定义类类型类型的操作数,也就是说重载操作符不能重新定义用于内置类型对象的操作符的含义,比如不能重载”+”号操作符用于两个整数相加。ExampleAnoverloadingfortheoperator“+”forthisclass
classpoint {public: point(int
xx=0,int
yy=0){x=xx;y=yy;}
int
get_x();
int
get_y();pointoperator+(constpoint&rpt);//...private:
intx;
int
y;};pointpoint::operator+(constpoint&rpt){
int
tempx=x+rpt.get_x();
int
tempy=y+rpt.get_y();pointtemp(tempx,tempy);returntemp;}ExampleAnoverloadingfortheoperator“+”forthisclass
//**include“point.h”;include<iostream>main(){pointa(15,20),b(5,13);pointtestpoint;
testpoint=a+b;
}ClasspracticeWriteanoverloadingfortheoperator“*=”forthisclass
classpoint {public: point(intxx=0,intyy=0){x=xx;y=yy;}
intget_x();
intget_y(); //...private:
intx;
inty;};pointp1(1,1),p2(3,3),实现“p1*=p2”,即p1的私有成员x,y与p2的私有成员x,y分别相乘,并将结果分别赋于p1的私有成员。ClasspracticeWriteanoverloadingfortheoperator“*=”
classpoint {public: point(int
xx=0,int
yy=0){x=xx;y=yy;}
int
get_x();
int
get_y();point&operator*=(constpoint&rpt);//...private:
intx;
int
y;};point&point::operator*=(constpoint&rpt){x=x*rpt.get_x();y=y*rpt.get_y();return*this;}4.4OperatorFunctionsasClassMembersvs.asfriendFunctionsOperatorfunctionsCanbememberornon-memberfunctionsOverloadingtheassignmentoperatorsi.e:(),[],->,=Operatormustbeamemberfunction
4.4OperatorFunctionsasClassMembersvs.asfriendFunctionsOperatorfunctionsasmemberfunctionsLeftmostoperandmustbeanobject(orreferencetoanobject)oftheclassIfleftoperandofadifferenttype(与定义的class不一致),operatorfunctionmustbeanon-memberfunctionAnon-memberoperatorfunctionmustbeafriendifprivateorprotectedmembersofthatclassareaccesseddirectly如果需要访问类的私有或者保护对象4.4OperatorFunctionsasClassMembersvs.asfriendFunctionsNon-memberoverloadedoperatorfunctionsEnabletheoperatortobecommutative(可交换的),becausetheleftmostoperandcanbeanothertype.
HugeIntegerbigInteger1;longintnumber;bigInteger1=number+bigInteger1; orbigInteger1=biginteger1+number;4.4OperatorFunctionsasClassMembersvs.asfriendFunctionsFriendfunctionMemberFunctiona+boperator+(a,b)a.operator+(b)a++operator++(a,0)a.operator++(0)-aoperator-(a)a.operator-()类成员的操作符函数与其等价的友元函数:4.4OperatorFunctionsasClassMembersvs.asfriendFunctions友元运算符函数无this指针,因而在函数体内必须通过对象名来使用private成员数据;一般将一元运算符函数重载为成员运算符函数。强调:与赋值相关的运算符必须重载成成员函数。一般将二元运算符重载为友元运算符函数,以免出现使用错误。因为时常需要操作数可交换“=”、“()”、“[]”和“->”不能重载为友元。4.5OverloadingStream-InsertionandStream-ExtractionOperators
Overloaded<<
and
>>operatorsMusthaveleftoperandoftypesostream&,istream&respectivelyItmustbe
anon-memberfunction(leftoperandnotanobjectoftheclass)Itmustbeafriendfunctionifitaccessesprivatedatamembers注意:在本课程学习的OperatorOverloading中,通过non-memberfunction来定义operator,就是指用friendfunction来实现fig18_03.cpp(1of3)语法:friend<函数类型>operator<运算符>(形参表){函数体;}fig18_03.cpp(2of3)fig18_03.cpp(3of3)Enterphonenumberintheform(123)456-7890:(800)555-1212Thephonenumberenteredwas:(800)555-12124.6OverloadingUnaryOperatorsOverloadingunaryoperatorsAvoid
friendfunctionsandfriendclassesunlessabsolutelynecessary.Useoffriendsviolatestheencapsulationofaclass.Asamemberfunction:classString{
public:
booloperator!()const;
...
};<函数类型>operator<运算符>(形参表){函数体;}4.7OverloadingBinaryOperatorsOverloadedbinaryoperatorsNon-staticmemberfunction,oneargumentNon-memberfunction(friend),twoarguments
classString{
public:
constString&operator+=(constString&);
...
};//endclassString
y+=z;
equivalenttoy.operator+=(
z
);4.7OverloadingBinaryOperatorsExampleclassString{friend
constString&operator+=(String&,constString&);...};//endclassString
y+=z;equivalent
to
operator+=(
y,
z
);语法:friend<函数类型>operator<运算符>(形参表){函数体;}4.8CaseStudy:AnArrayclassImplementanArrayclasswith
RangecheckingArrayassignmentArraysthatknowtheirsizeOutputting/inputtingentirearrayswith<<and>>Arraycomparisonswith==and!=array1.h(1of2)array1.h(2of2)array1.cpp(1of6)array1.cpp(2of6)array1.cpp(3of6)array1.cpp(3of6)array1.cpp(4of6)array1.cpp(5of6)array1.cpp(6of6)fig18_04.cpp(1of4)fig18_04.cpp(2of4)fig18_04.cpp(3of4)fig18_04.cpp(4of4)Arrayoutput(1of1)#ofarraysinstantiated=0#ofarraysinstantiated=2
Sizeofarrayintegers1is7Arrayafterinitialization:0000000
Sizeofarrayintegers2is10Arrayafterinitialization:0000000000Input17integers:1234567891011121314151617Afterinput,thearrayscontain:integers1:1234567integers2:891011121314151617
Evaluating:integers1!=integers2Theyarenotequal
Sizeofarrayintegers3is7Arrayafterinitialization:1234567Arrayoutput(2of2)Assigningintegers2tointegers1:integers1:891011121314151617integers2:891011121314151617Evaluating:integers1==integers2Theyareequal
integers1[5]is13Assigning1000tointegers1[5]integers1:89101112100014151617
Attempttoassign1000tointegers1[15]Assertionfailed:0<=subscript&&subscript<size,fileArray1.cpp,line95abnormalprogramtermination4.9ConvertingbetweenTypesCastoperatorConvertobjectsintobuilt-intypesorotherobjectsConversionoperatormustbeanon-static
memberfunction.Cannotbeafriendfunction形参表必须为空不能指定返回类型,但是必须显式返回一个指定类型的值转换函数采用如下通用形式:operatortype();type表
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 几何与艺术融合
- 音乐与认知能力的关系-洞察分析
- 医疗非织造布进展-洞察分析
- 网络舆情引导伦理规范-洞察分析
- 疫情家具消费心理-洞察分析
- 网络内容审核标准-洞察分析
- 睡眠障碍在更年期综合征中的作用研究-洞察分析
- 渔业政策与法规研究的报告-洞察分析
- 稀有金属产业链协同创新-洞察分析
- 艺术与地域文化关联-洞察分析
- 2024年7月国家开放大学法律事务专科《企业法务》期末纸质考试试题及答案
- 《教师法》培训课件
- 常用护理评估表及注意事项
- 河北省唐山地区2023-2024学年上学期期末八年级历史试卷
- 专题06直线与圆的位置关系、圆与圆的位置关系(课时训练)原卷版
- 军用装备信息化融合与互联
- 人才培养与团队建设计划三篇
- 2024年急性胰腺炎急诊诊治专家共识解读课件
- 六年级地方课程教案
- 【寒假预习】部编版二年级语文下册生字练字帖(带拼音、笔顺)
- 信息技术-计算机第三方支付行业深度报告:监管加速第三方支付合规及出清提费利润弹性巨大
评论
0/150
提交评论