C++面向?qū)ο蟪绦蛟O(shè)計(jì)雙語教程(第3版)課件 class 7-classes objects-4、class 8-operator overloading_第1頁
C++面向?qū)ο蟪绦蛟O(shè)計(jì)雙語教程(第3版)課件 class 7-classes objects-4、class 8-operator overloading_第2頁
C++面向?qū)ο蟪绦蛟O(shè)計(jì)雙語教程(第3版)課件 class 7-classes objects-4、class 8-operator overloading_第3頁
C++面向?qū)ο蟪绦蛟O(shè)計(jì)雙語教程(第3版)課件 class 7-classes objects-4、class 8-operator overloading_第4頁
C++面向?qū)ο蟪绦蛟O(shè)計(jì)雙語教程(第3版)課件 class 7-classes objects-4、class 8-operator overloading_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

ObjectivesToabletodefineobjectsofotherclassesasclassmembersToknowhowtouseshallowcopyanddeepcopyTo

abletodefineanduseobjectarraysTounderstandthepurposeoffriendfunctionsandfriendclasses01ObjectMembers03CopyMembers02ArraysofObjects04Friends01ObjectMembersObjectMembersCaseStudy1Defineastudentclassthatname,dateofbirth,age.Thestudentobjectsdisplaythedataofastudent.attributesbehaviorClassTemplateformakingobjectsstudentblueprintname,DOB,ageprintWhatisDOB?Date:year,month,dayname,year,month,day,ageDateobjectObjectmemberObjectMembersAclasscanhaveobjectsofanotherclassasdata

members.Usingobjectmembersistomakesoftwarereusability.Acommonformofsoftwarereusabilityiscompositionoraggregation,inwhichaclasshasobjectsofanotherclass.DeclarationofObjectMembersclass

Date{public:Date(int,int,int);~Date();private:intyear,month,day;};Studentname:stringDOB:Dateage:int+student()+~student()+print():voidclass

Student{public:Student();~Student();voidprint();private:intage;DateDOB;//objectmemberstringname;};InitializationofObjectMembersclass

Date{public:Date(int,int,int);~Date();private:intyear,month,day;};class

Student{public:Student(string,int,int,int,int);~Student();private:

intage;

DateDOB;//objectmember

stringname;};Studentname:stringDOB:Dateage:int+student(string,int,int,int,int)+~student()+print():voidStudent::Student(string

name,int

d,int

m,int

y,int

age):DOB(d,m,y){this->name=

name;this->age=age;cout<<

"Studentobjectiscreated\n";}memberinitializerintmain(){Studentstd("Helen",2000,9,30,18);return0;}AccessingDataMembersofClassObjectsvoid

Student::print(){cout<<name<<age<<endl;cout<<DOB<<endl;}void

Student::print(){cout<<name<<age<<endl;DOB.print();}class

Date{public:Date(int,int,int);~Date();voidprint();private:intyear,month,day;};intmain(){Studentstd("Helen",2000,9,30,18);std.print();return0;}Studentname:stringDOB:Dateage:int+student()+~student()+print():voidDateyear:intmonth:intday:int+Date(int,int,int)+~Date()+print():voidaggregationclass

Date{public:Date(int,int,int);~Date();private:intyear,month,day;};cout<<DOB.year;voidDate::print(){cout<<year<<month<<day;}ObjectMembers-CompositionCaseStudy1-1Defineastudentclassthathasname,dateofbirth,andstatusofhealth.Thestudentobjectsdisplaythedataofastudent.behaviorattributesname,DOB,age,

healthprintHealth:height,weightStudentname:stringDOB:Datehealth:Health+student(string,int,int,int,int,int,int)+~student()+print():voidHealthheight:intweight:int+Health(int,int)+~Health()+print():voidDateyear:intmonth:intday:int+Date(int,int,int)+~Date()+print():voidcompositionaggregationObjectMembersclass

Health{public:Health(int,int);~Health();voidprint()const;private:intheight,weight;};class

Student{public:Student(string,int,int,int,int,int,int);~Student();voidprint();private:intage;Healthhealth;//objectmemberDateDOB;//objectmemberstringname;};Student::Student(string

name,int

d,int

m,int

y,int

age,int

h,int

w):DOB(d,m,y),health(h,w){this->name=

name;this->age=age;cout<<

"Studentobjectiscreated\n";}void

Student::print(){cout<<name<<age;DOB.print();health.print();}ExecutionofObjectMembersclass

Date{public:Date(){cout<<"CallingDateconstructor\n";}~Date(){cout<<"CallingDatedestructor\n";}};class

Health{public:Health(){cout<<"CallingHealthconstructor\n";}~Health(){cout<<"CallingHealthdestructor\n";}};class

Student{public:Student():health(),DOB(){cout<<"CallingStudentconstructor\n";}~Student(){cout<<"CallingStudentdestructor\n";}private:Date

DOB;Healthhealth;};intmain(){Studentst;return0;}Result:CallingDateconstructorCallingHealthconstructorCallingStudentconstructorCallingStudentdestructorCallingHealthdestructorCallingDatedestructorExecutionofObjectMembers1.ConstructingsequenceThemembers’constructorsareinvokedbeforethebodyofthecontainingclass’sownconstructorinexecuted.Theconstructorsarecalledintheorderinwhichthemembersaredeclaredintheclassratherthantheorderinwhichthemembersappearintheinitializerlist.2.Destroyingsequence

Whenaclassobjectcontainingclassobjectsisdestroyed,thebodyofthatobject’sowndestructorisexecutedfirstandthenthemembers’destructorsareexecutedinreverseorderofdeclaration.

InitializationofDataMembersUsingInitializerThethreedatamembersmustbeinitializedbyusinginitializer.memberobjectsofclasseswithoutdefaultconstructorconstmembersreferencemembersclass

A{public:A(int

n,int

d,int

m,int

y,int&a):i(n),d(dd,mm,yy),pc(a){}private:const

inti;Dated;int&pc;};intmain(){intn=5;Aa(n,20,10,2000,n);return0;}02ArraysofObjectsArraysofObjectsinta[5];intb[]={1,2,3,4};DatearrDay[4];DatearrNow[]={Date(2011,3,24),

Date(2013,5,10),

Date(2016,6,12)};theclassmustprovideadefaultconstructor.theclassmustprovideaconstructorwithparameters.Anarrayofaclasstypeisalsoknownasanarrayofobjects.

Youcancreateanarrayofobjectsofthesameclasslikeanarrayofbuilt-intypes.ObjectArraysclass

Date{public:Date(int,int,int);Date();~Date();voidprint()const;private:intday,month,year;static

intcount;};Date::Date(int

d,int

m,int

y):day(d),month(m),year(y){count++;

cout<<"The"<<count<<"thobjectcallstheconstructor\n";}Date::Date():day(1),month(10),year(2019){count++;cout<<"The"<<count<<"thobjectcallsdefaultconstructor\n";}void

Date::print()const{cout<<year<<"/"<<month<<"/"<<day<<endl;}Date::~Date(){cout<<"The"<<count<<"thobjectisdestroyed\n";print();count--;}int

Date::count=0;intmain(){DatearrDay[2];DatearrNow[]={Date(2011,3,24),Date(2013,5,10),Date(2016,6,12)};Date*pDay=new

Date[2];delete[]pDay;cout<<"--------\n";return0;}The1thobjectcallsdefaultconstructorThe2thobjectcallsdefaultconstructorThe3thobjectcallstheconstructorThe4thobjectcallstheconstructorThe5thobjectcallstheconstructorThe6thobjectcallsdefaultconstructorThe7thobjectcallsdefaultconstructorThe7thobjectisdestroyed2019/10/1The6thobjectisdestroyed2019/10/1--------The5thobjectisdestroyed12/6/2016The4thobjectisdestroyed10/5/2013The3thobjectisdestroyed24/3/2011The2thobjectisdestroyed2019/10/1The1thobjectisdestroyed2019/10/103CopyMembersCopyingMembersinti=3;intj=i;Dateday1(7,8,2010);Dateday2=day1;Classobjectscanbecopiedwhenobjectsarecreated.Aclassobjectcanbedeclaredwithacopyofanotherobjectofthesameclass.Thecopyofaclassobjectisacopyofeachmember,i.e.defaultmember-wise

initialization.Theinitializationofcopyinga

class

object

isexecutedbyaspecialconstructor,calledcopyconstructor.DefinitionofCopyConstructorclass

Date{public:Date(int=1,int=1,int=2000);~Date();voidprint()const;private:intday,month,year;};Date::Date(const

Date&date){day=date.day;month=date.month;year=date.year;}Date(const

Date&);Copy

constructorDateday1(7,8,2010);Dateday2=day1;Member-wisecopyingCopyconstructorisaspecialconstructorfordeclaringanewobjectasacopyofanexistingobject.WhenCallaCopyConstructor?Datef(Date

d){d.print();return

d;}class

Date{public:Date(int,int,int);~Date();voidprint()const;private:intday,month,year;};intmain(){Dateday1(7,8,2010);Dateday2=day1;Dateday3(day1);day3=f(day2);return0;}Date(const

Date&);Thecopyconstructorisinvokedinthethreecases:DeclareanewobjectPassavalueofanobjectwhencallingafunctionReturnanobjectinafunctionShallowCopyMembersintmain(){Dateday1(7,8,2010);Dateday2=day1;Dateday3(day1);day3=f(day2);return0;}class

Date{public:Date(int,int,int);~Date();voidprint()const;private:intday,month,year;};Datef(Date

d){d.print();return

d;}Date(const

Date&);Shallowcopymeansthateachmemberoftheclassareindividuallycopiesbyusingassignmentoperator(=).Whenacopyconstructorisnotdefinedintheclass,adefaultcopyconstructorisprovided.ShallowCopyMembersday1day2class

Date{public:Date(int,int,int,constchar*);~Date();private:intday,month,year;char*name;};Date::Date(int

d,int

m,int

y,const

char*nstr):day(d),month(m),year(y){name=new

char[strlen(nstr)+1];strcpy_s(name,strlen(nstr)+1,nstr);}Date::~Date(){cout<<name<<"destroyinganobject...\n";deletename;}intmain(){Dateday1(7,8,2010,"day1");Dateday2=day1;return0;}Runerror!nameinfreestoreyearmonthdayyearmonthdayDeepCopyMembersclass

Date{public:Date(int,int,int,constchar*);Date(const

Date&);~Date();voidprint()const;private:intday,month,year;char*name;};Date::Date(int

d,int

m,int

y,constchar*nstr):day(d),month(m),year(y){name=new

char[strlen(nstr)+1];strcpy_s(name,strlen(nstr)+1,nstr);cout<<name<<"constructinganobject...\n";}Date::~Date(){cout<<name<<"destroyinganobject...\n";deletename;}DeepCopyMembersDate::Date(const

Date&date){day=date.day;month=date.month;year=date.year;if(date.name!=nullptr){name=new

char[strlen(date.name)+1];strcpy_s(name,strlen(date.name)+1,date.name);}else name=nullptr;cout<<"constructingacopyobject...\n";}intmain(){Dateday1(7,8,2010,"day1");Dateday2=day1;}day1day2nameinfreestoreyearmonthdayyearmonthdaynameinfreestore04FriendsFriends(友元)Anordinarymemberfunction

declarationspecifiesthreelogicallydistinctthings:thefunctioncanaccesstheprivatepartoftheclassdeclarationthefunctionisinthescopeoftheclassthefunctionmustbeinvokedontheanobject(hasathispointer)FriendsAfriendoftheclassisafunctionoraclass.Itisnotamemberofthisclass.

Itcanbegrantedthesameaccesstotheclassasthememberoftheclass,i.e.itcanaccessallmembersofthisclass.FriendFunctionsclass

Date{public:Date(intd,intm,inty);voidprint()const;private:intday,month,year;};voidadd_year(Date&d,int

n){d.year+=n;//privatemember}Date::Date(int

d,int

m,int

y):day(d),month(m),year(y){}void

Date::print()const{cout<<day<<month<<year<<endl;}intmain(){Datetoday(10,2,2016);today.print();add_year(today,5);today.print();return0;}friend

voidadd_year(Date&,int);Afrienddeclarationcanbeplacedineithertheprivateorthepublicpartofaclassdeclaration.Date-year:int-month:int-day:

int+Date(int,int,int)+print():void<<C++Global>>+add_year(Date&,int):void<<C++friend>>FriendClassesclass

A{public:A():x(1),y(2){}private:intx,y;

};class

B{public:voidprint(A&a);};void

B::print(A&a){cout<<"xis"<<a.x<<endl;cout<<"yis"<<a.y<<endl;}intmain(){AaObj;BbObj;bObj.print(aObj);return0;}friend

class

B;A-x:int-y:int+A()B+print(A&):void<<C++friend>>SummaryObjectmembersObjectArrays-constructorCopymembersShallowcopyDeepcopyFriendsObjectivesToknowwhyneedsoperatoroverloadingToknowwhatoperatorfunctionsareTo

be

abletodefinebinaryoperatorfunctionTobeabletodefineunaryoperatorfunction01Introduction03BinaryOperatorOverloading02OperatorFunctions04UnaryOperatorOverloading05CaseStudy01IntroductiontoOperatorOverloadingIntroductiontoOperatorOverloadingForexample,built-inoperators,+,-,=,<=,[],>>,<<2+3,3.4+5.4,‘a(chǎn)’+’b’Usingthesamenameforoperationsondifferenttypesisknownasoverloading.Operatoroverloading:Redefinemostofthebuilt-inoperatorsavailableforoperationson

user-definedtypes(abstractdatatypes).class

MyInteger{public:MyInteger(int=0);intget()const;MyIntegeraddition(const

MyInteger&);MyIntegermultiplication(const

MyInteger&);private:intvalue;};WhyNeedsOperatorOverloading?MyIntegervalue:int+MyInteger(int=0)+~MyInteger()+addition(constMyInteger&):MyInteger+multiplication(constMyInteger&):MyInteger+get():intconstCaseStudy1DefineaMyIntegerclasswithavalueattribute.Youneeddothefollowingtask:addtwoMyIntegerobjectsmultiplytwoMyIntegerobjectsWhyNeedsOperatorOverloading?intmain(){MyIntegeri1(10),i2(25);cout<<i1.get()<<

","

<<i2.get()<<endl;MyIntegeri3;i3=i1.addition(i2);cout<<i3.get()<<endl;i3=i1.multiplication(i2);cout<<i3.get()<<endl;return0;}i3=i1+i2;i3=i1*i2;MyInteger

MyInteger::addition(const

MyInteger&myint){return

MyInteger(this->value+myint.value);}MyInteger

MyInteger::multiplication(const

MyInteger&myint){return

MyInteger(this->value*myint.value);}MyInteger::MyInteger(int

v):value(v){}int

MyInteger::get()const{returnvalue;}MyInteger::~MyInteger(){}MyIntegervalue:int+MyInteger(int=0)+~MyInteger()+addition(constMyInteger&):MyInteger+multiplication(constMyInteger&):MyInteger+get():intconstWhyNeedsOperatorOverloading?Definingoperatorsforuser-definedtypeallowsaprogrammertoprovideamoreconventionalandconvenient

notationformanipulatingobjects.MyIntegeri3;i3=i1+i2;i3=i1*i2;intn;cin>>n;cout<<n;class

MyInteger{public:MyInteger(int=0);intget()const;MyInteger

operator+(const

MyInteger&);MyInteger

operator*(const

MyInteger&);private:intvalue;};OperatoroverloadingFunctionMyInteger

MyInteger::operator+(const

MyInteger&myint){return

MyInteger(this->value+myint.value);}MyInteger

MyInteger::operator*(const

MyInteger&myint){return

MyInteger(this->value*myint.value);}intmain(){MyIntegeri1(10),i2(25);cout<<i1.get()<<

","

<<i2.get()<<endl;MyIntegeri3;i3=i1+i2;//i3=i1.addition(i2);cout<<i3.get()<<endl;i3=i1*i2;//i3=i1.multiplication(i2);cout<<i3.get()<<endl;return0;}WhyNeedsOperatorOverloading?MyIntegervalue:int+MyInteger(int=0)+~MyInteger()+operator+(constMyInteger&):MyInteger+operator*(constMyInteger&):MyInteger+get():intconst02OperatorFunctionsOperatorFunctionsMyIntegeroperator+(constMyInteger&myint);returningtypeoperatorfunctionnameparameterlistForexample,Tooverloadanoperator,youmustdefineafunction,calledoperatoroverloadingfunction(operatorfunction).returning-typeoperatorSymbol(parameter

list)SyntaxtodefineanoperatorfunctionoperatorfunctionnameOperatorFunctionsThefollowingoperatorscanbeoverloaded.Thefollowingoperatorscannotbeoverloaded.::---scoperesolution,e.g.Date::print();?:---ternaryconditional(if-then-else),e.g.x>y?x:y;.---memberselection,e.g.day.print();.*---memberselectionthroughpointertomember,e.g.student.*nameOperatorFunctionsYoucannotoverloadalloperators.Youcannotcreateanewoperator.Onlyexistingoperatorcanbeoverloaded.Youtrytokeepthemeaningofhowtheoperatorworkswithbuilt-intypes.Operatorfunctionscanbememberfunctionsofclassesornon-member

functions.

03BinaryOperatorOverloadingBinaryOperatorsForexample,+,-,==,!=,&&Abinaryoperatorisanoperatorthatoperatesontwooperandsandmanipulatesthemtoreturnaresult.HowtoOverloadBinaryOperatorsForanybinaryoperator@,

aa@bb

MyInteger

MyInteger::operator+(MyInteger&i);MyInteger

operator+(MyInteger&i1,MyInteger&i2);Object’snames,user-definedtypeintmain{MyIntegeri1(10),i2(25),i3;i3=i1+i2;i3=i1*i2;}SyntaxtodefineabinaryoperatorfunctionIfanoperatorfunctionisdefinedasamemberfunction,

ittakesoneparameter.TherearetwowaystodefineanoperatorfunctionIfanoperatorfunctionisdefinedasanon-memberfunction,

ittakestwoparameters.aa.operator+(bb)operator+(aa,bb)HowtoOverloadBinaryOperatorsclass

MyInteger{public:MyInteger(int

v):value(v){}MyIntegeroperator+(MyInteger&);friend

MyIntegeroperator-(MyInteger&,MyInteger&);intget()const{returnvalue;}private:intvalue;};memberfunctionnon-memberfunctionintmain(){MyIntegera(13);MyIntegerb(12);MyIntegerc=b;//copyconstructora=b+c;b=b+c-a;cout<<a.get()<<b.get();return0;}MyInteger

MyInteger::operator+(MyInteger&i){MyIntegertemp(0);temp.value=this->value+i.value;returntemp;}MyIntegeroperator-(MyInteger&i1,MyInteger&i2){MyIntegertemp(0);temp.value=i1.value-i2.value;returntemp;}a=b.operator+(c)b=operator-(b.operator+(c),a)04UnaryOperatorOverloadingUnaryOperatorsForexample,++a,--a,a--,a++,a?(?b),~a,!aAnunaryoperatorisanoperatorthatactsuponasingleoperandtoproduceanewvalue.HowtoOverloadUnaryOperatorsForanyprefixunaryoperator@@aaDefinitionofprefix

increment/decrementoperatorsObject’sname,user-definedtypeintmain{MyIntegeri1(10),i2(25);++i1;--i2;cout<<(++i1).get()<<endl;}MyInteger&MyInteger::operator++();MyInteger

operator--(MyInteger&);SyntaxtodefineanunaryoperatorfunctionIfanoperatorfunctionisdefinedasamemberfunction,

itdoesnottakeanyparameter.TherearetwowaystodefineanoperatorfunctionIfanoperatorfunctionisdefinedasanon-memberfunction,

ittakesoneparameter.aa.operator++()operator--(aa)PrefixUnaryOperatorsclass

MyInteger{public:MyInteger(int);intget()const;MyInteger&operator++();//memberfunctionfriend

MyInteger

operator--(MyInteger&);//non-memberfunctionprivate:intvalue;};intmain(){MyIntegeri1(10),i2(25);cout<<i1.get()<<

","

<<i2.get()<<endl;cout<<(++i1).get()<<endl;cout<<(--i2).get()<<endl;return0;}MyInteger&MyInteger::operator++(){

this->value++;

return*this;}(i1.operator++()).get()(operator--(i2)).get()MyInteger

operator--(MyInteger&myint){

myint.value--;return

myint;}PrefixunaryoperatorsWhytoreturnthethispointer?PostfixUnaryOperatorsForanypostfixunaryoperator@aa@Definitionofpostfixincrement/decrementoperatorsObject’sname,user-definedtypeintmain(){MyIntegeri1(10),i2(25);i1++;i2++;cout<<(i1++).get()<<endl;}SyntaxtodefineanunaryoperatorfunctionIfanoperatorfunctionisdefinedasamemberfunction,

itdoesnottakeanyparameter,butidentifierint.TherearetwowaystodefineanoperatorfunctionIfanoperatorfunctionisdefinedasanon-memberfunction,

ittakesoneparameterandidentifierint.MyInteger

MyInteger::operator++(int);MyInteger

operator--(MyInteger&,int);Note:intisadummyparameteraa.operator++(int)operator--(aa,int)PostfixUnaryOperatorsintmain(){MyIntegeri1(10),i2(25);cout<<i1.get()<<

","

<<i2.get()<<endl;cout<<(i1++).get()<<endl;cout<<i1.get()<<endl;cout<<(i2--).get()<<endl;cout<<i2.get()<<endl;return0;}class

MyInteger{public:MyInteger(int);intget()const;MyInteger

operator++(int);//memberfunctionfriend

MyInteger

operator--(MyInteger&,int);private:intvalue;};(i1.operator++(int)).get()(operator--(i2,int)).get()postfixunaryoperatorsMyInteger

MyInteger::operator++(int){MyIntegertemp(0)=*this;this->value++;returntemp;}MyInteger

operator--(MyInteger&myint,int){MyIntegertemp(0)=myint;myint.value--;returntemp;}05CaseStudyCaseStudyGivenatestprogramasfollows.DefineaComplexclassaccordingtothetestprogram.a+biComplexreal:doubleimag:double+Complex(double=0,double=0)+~Complex()+Complex(constComplex&)+operator+(constComplex&):Complex+operator=(constComplex&):Complex&+operator++():Complex&+operator++(int):Complex+print():voidconstintmain(){Complexc1(2.1,4.5),c2(3.4,5.6);c1.print();c2.print();Complexc3=c1+c2;c3.print();c1=c3;c1.print();(++c3).print();(c3++).print();c3.print();return0;}DefinitionoftheComplexclassWhendoyouneedtopassavalueorareferencetoanoperatorfunction?Whendoyouneedtoreturnavalueorareferencefromanoperatorfunction?class

Complex{public:Complex(double

r=0

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論