C++计算机语言教学课件c++-lect06operatoroverloading_第1页
C++计算机语言教学课件c++-lect06operatoroverloading_第2页
C++计算机语言教学课件c++-lect06operatoroverloading_第3页
C++计算机语言教学课件c++-lect06operatoroverloading_第4页
C++计算机语言教学课件c++-lect06operatoroverloading_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论