《C++語(yǔ)言程序設(shè)計(jì)》課件第9章_第1頁(yè)
《C++語(yǔ)言程序設(shè)計(jì)》課件第9章_第2頁(yè)
《C++語(yǔ)言程序設(shè)計(jì)》課件第9章_第3頁(yè)
《C++語(yǔ)言程序設(shè)計(jì)》課件第9章_第4頁(yè)
《C++語(yǔ)言程序設(shè)計(jì)》課件第9章_第5頁(yè)
已閱讀5頁(yè),還剩78頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C++語(yǔ)言程序設(shè)計(jì)第十一組C++語(yǔ)言程序設(shè)計(jì)第九章類的特殊成員C++語(yǔ)言程序設(shè)計(jì)1目錄C++語(yǔ)言程序設(shè)計(jì)2“類的靜態(tài)成員常對(duì)象和常成員類的組合友元運(yùn)算符重載基本知識(shí)包含內(nèi)嵌對(duì)象的派生類構(gòu)造包含內(nèi)嵌對(duì)象的派生類析構(gòu)編程技能賦值運(yùn)算符重載刨根問(wèn)底C++語(yǔ)言程序設(shè)計(jì)3基本知識(shí)a9.1類的靜態(tài)成員類的靜態(tài)成員用來(lái)解決同一個(gè)類的不同對(duì)象之間數(shù)據(jù)和函數(shù)的共享問(wèn)題包括:類的靜態(tài)數(shù)據(jù)成員類的靜態(tài)成員函數(shù)C++語(yǔ)言程序設(shè)計(jì)49.1類的靜態(tài)成員靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員是類的數(shù)據(jù)成員的一種特例類的數(shù)據(jù)成員在類的每一個(gè)對(duì)象中分別存儲(chǔ)不同的數(shù)值,但是靜態(tài)數(shù)據(jù)成員在每個(gè)類只有一個(gè)副本由該類的所有對(duì)象共同維護(hù)和使用,從而實(shí)現(xiàn)了同一類的不同對(duì)象之間的數(shù)據(jù)共享具有靜態(tài)生存期C++語(yǔ)言程序設(shè)計(jì)59.1類的靜態(tài)成員靜態(tài)數(shù)據(jù)成員的聲明及初始化采用static關(guān)鍵字來(lái)聲明靜態(tài)數(shù)據(jù)成員是屬于類的,可以通過(guò)類名對(duì)它進(jìn)行訪問(wèn)語(yǔ)法格式:類名::標(biāo)識(shí)符靜態(tài)數(shù)據(jù)成員的初始化需要在類的外部進(jìn)行類的聲明是抽象的,只能聲明靜態(tài)數(shù)據(jù)成員的存在C++語(yǔ)言程序設(shè)計(jì)6例:定義學(xué)生類,定義一個(gè)靜態(tài)數(shù)據(jù)成員count,用來(lái)統(tǒng)計(jì)學(xué)生的人數(shù)count初始值設(shè)置為0每定義一個(gè)學(xué)生對(duì)象調(diào)用構(gòu)造函數(shù)一次,在構(gòu)造函數(shù)中為count加1每析構(gòu)一個(gè)學(xué)生對(duì)象,在析構(gòu)函數(shù)中完成count減19.1類的靜態(tài)成員C++語(yǔ)言程序設(shè)計(jì)79.1類的靜態(tài)成員C++語(yǔ)言程序設(shè)計(jì)8//靜態(tài)數(shù)據(jù)成員的定義和使用#include<iostream>#include<string>usingnamespacestd;classStudent{public:Student(char*pName="noname");~Student();voidPrintC(){cout<<"Thenumberofstudentsis"<<count<<endl;}private:

staticintcount;//若寫(xiě)成count=0則非法stringname;};9.1類的靜態(tài)成員C++語(yǔ)言程序設(shè)計(jì)9Student::Student(char*pName)//="noname"){cout<<"createonestudent\n";name=pName;count++;//靜態(tài)成員:每創(chuàng)建一個(gè)對(duì)象,學(xué)生人數(shù)增1}Student::~Student(){cout<<"destructonestudent\n";count--;//每析構(gòu)一個(gè)對(duì)象,學(xué)生人數(shù)減1cout<<"Thenumberofstudentsis"<<count<<endl;}9.1類的靜態(tài)成員C++語(yǔ)言程序設(shè)計(jì)10intStudent::count=0;//靜態(tài)數(shù)據(jù)成員在類外分配空間和初始化,static不用寫(xiě)voidmain(){Students1;s1.PrintC();Students2;s2.PrintC();}9.1類的靜態(tài)成員靜態(tài)成員函數(shù)使用static關(guān)鍵字聲明的函數(shù)成員靜態(tài)成員函數(shù)屬于整個(gè)類可以通過(guò)“類名::靜態(tài)成員函數(shù)名”來(lái)調(diào)這樣,在創(chuàng)建任何對(duì)象前,這類函數(shù)也可以被調(diào)用由類的所有對(duì)象共享,也可以通過(guò)對(duì)象來(lái)調(diào)用C++語(yǔ)言程序設(shè)計(jì)119.1類的靜態(tài)成員前例:PrintC()函數(shù)定義為靜態(tài)成員函數(shù):main()函數(shù)中,在創(chuàng)建任何對(duì)象前,訪問(wèn)靜態(tài)數(shù)據(jù)成員count:C++語(yǔ)言程序設(shè)計(jì)12intStudent::count=0;voidmain(){Student::PrintC(); //通過(guò)類名定義靜態(tài)成員函數(shù)Students1;s1.PrintC();Students2;s2.PrintC();}staticvoidPrintC(){cout<<"Thenumberofstudentsis"<<count<<endl;}9.2常對(duì)象和常成員常對(duì)象定義對(duì)象時(shí)用const進(jìn)行修飾,稱為常對(duì)象它的數(shù)據(jù)成員值在對(duì)象的整個(gè)生存期間內(nèi)不能被改變常對(duì)象在定義時(shí)必須進(jìn)行初始化常對(duì)象不能被更新聲明的語(yǔ)法格式:類名const對(duì)象名C++語(yǔ)法規(guī)定:常對(duì)象只能調(diào)用常成員函數(shù),以保證常對(duì)象的數(shù)據(jù)成員不被修改C++語(yǔ)言程序設(shè)計(jì)13例如:classPoint{public:Point(inti,intj){x=i;y=j;}//…private:intx,y;};//a是常對(duì)象,不能被更新Pointconsta(3,4);9.2常對(duì)象和常成員常成員函數(shù)類成員函數(shù)使用const關(guān)鍵字修飾,稱為常成員函數(shù)語(yǔ)法格式:返回值類型說(shuō)明符

函數(shù)名(參數(shù)表)const;常成員函數(shù)具有以下特點(diǎn)。const是函數(shù)類型的一個(gè)組成部分,在函數(shù)實(shí)現(xiàn)時(shí)也要帶const關(guān)鍵字常成員函數(shù)不能更新對(duì)象的數(shù)據(jù)成員,也不能調(diào)用該類中的非常成員函數(shù)常對(duì)象只能調(diào)用常成員函數(shù),但是常成員函數(shù)可以被普通對(duì)象調(diào)用const關(guān)鍵字可被用于參與對(duì)重載函數(shù)的區(qū)分例如:在類中這樣聲明是對(duì)print函數(shù)的有效重載 voidprint(); voidprint()const;C++語(yǔ)言程序設(shè)計(jì)14例:常成員函數(shù)和常對(duì)象示例9.2常對(duì)象和常成員C++語(yǔ)言程序設(shè)計(jì)15//常成員函數(shù)和常對(duì)象示例#include<iostream>usingnamespacestd;classR{public:R(intr1,intr2){R1=r1;R2=r2;}voidchange(int,int);

voidprint()const;private:intR1,R2;};voidR::change(inta,intb){R1=a;R2=b;}voidR::print()const{cout<<R1<<";"<<R2<<endl;}voidmain(){Ra(5,4);a.print();//也調(diào)用voidprint()const

constRb(20,52);b.print();//調(diào)用voidprint()const}運(yùn)行結(jié)果:5;420;529.2常對(duì)象和常成員常數(shù)據(jù)成員使用const說(shuō)明的數(shù)據(jù)成員稱為常數(shù)據(jù)成員常數(shù)據(jù)成員一經(jīng)初始化就不能再被改變構(gòu)造函數(shù)對(duì)常數(shù)據(jù)成員進(jìn)行初始化,只能通過(guò)初始化列表初始化列表是在構(gòu)造函數(shù)的函數(shù)頭后面,用“:”連接的一組參數(shù)表形式為:類名::類名(參數(shù)表):初始化列表 { //函數(shù)體

}初始化列表的形式為:成員名1(初始值),成員名2(初始值),…C++語(yǔ)言程序設(shè)計(jì)16提示:通常把常數(shù)據(jù)成員定義為靜態(tài)成員,使其成為類的一個(gè)常量例:常數(shù)據(jù)成員使用示例9.2常對(duì)象和常成員C++語(yǔ)言程序設(shè)計(jì)17//常數(shù)據(jù)成員示例#include<iostream>usingnamespacestd;classCircle{public:Circle(intr,inti);voidprint();private:intradius;constinta;

//靜態(tài)常數(shù)據(jù)成員staticconstfloatPI;

};//靜態(tài)常數(shù)據(jù)成員在類外說(shuō)明和初始化constfloatCircle::PI=3.14159;

//常數(shù)據(jù)成員只能通過(guò)初始化列表來(lái)獲得初值Circle::Circle(intr,inti):a(i),radius(r)

{/*因?yàn)閍是常數(shù)據(jù)成員,不能把語(yǔ)句a=i;寫(xiě)在構(gòu)造函數(shù)體內(nèi)*/}//普通成員也可以在初始化列表中賦值例:常數(shù)據(jù)成員使用示例9.2常對(duì)象和常成員C++語(yǔ)言程序設(shè)計(jì)18voidCircle::print(){cout<<"radius="<<radius<<",area="<<radius*radius*PI<<endl;}voidmain()/*建立對(duì)象x,并以100和0作為初值調(diào)用構(gòu)造函數(shù),通過(guò)構(gòu)造函數(shù)的初始化列表給對(duì)象的常數(shù)據(jù)成員賦初值*/{Circlex(100,0);x.print();}運(yùn)行結(jié)果:Radius=100,area=31415.99.3類的組合在面向?qū)ο蟪绦蛟O(shè)計(jì)中,可以對(duì)復(fù)雜對(duì)象進(jìn)行分解、抽象,把一個(gè)復(fù)雜對(duì)象分解為簡(jiǎn)單對(duì)象的組合類的組合(類的聚集),描述的是一個(gè)類內(nèi)嵌其他類的對(duì)象作為數(shù)據(jù)成員的情況C++語(yǔ)言程序設(shè)計(jì)199.3類的組合例如:Rectangle類的兩個(gè)數(shù)據(jù)成員是Point類的對(duì)象它們之間的關(guān)系是一種包含與被包含的關(guān)系帶空心菱形的線表示兩個(gè)類之間是包含關(guān)系帶箭頭的線表示發(fā)送消息采用部件組裝的方法,利用已定義的類來(lái)構(gòu)成新的類C++語(yǔ)言程序設(shè)計(jì)209.3類的組合當(dāng)創(chuàng)建組合類的對(duì)象時(shí),各個(gè)內(nèi)嵌對(duì)象也將被自動(dòng)創(chuàng)建要對(duì)本類的基本數(shù)據(jù)成員進(jìn)行初始化要對(duì)內(nèi)嵌對(duì)象成員進(jìn)行初始化組合類構(gòu)造函數(shù)定義的一般形式為:類名::類名(形參表):內(nèi)嵌對(duì)象1(形參表),內(nèi)嵌對(duì)象2(形參表),…{ //類的初始化 }初始化列表用來(lái)完成內(nèi)嵌對(duì)象的初始化調(diào)用內(nèi)嵌對(duì)象的構(gòu)造函數(shù)以及為構(gòu)造函數(shù)傳遞的參數(shù)C++語(yǔ)言程序設(shè)計(jì)219.3類的組合當(dāng)定義一個(gè)組合類的對(duì)象時(shí),構(gòu)造函數(shù)的調(diào)用順序如下按照內(nèi)嵌對(duì)象在組合類的聲明中出現(xiàn)的次序,依次調(diào)用其內(nèi)嵌對(duì)象的構(gòu)造函數(shù)執(zhí)行本類的構(gòu)造函數(shù)的函數(shù)體如果聲明組合類的對(duì)象時(shí)沒(méi)有指定對(duì)象的初始值,則自動(dòng)調(diào)用無(wú)參構(gòu)造函數(shù),相應(yīng)地,也調(diào)用內(nèi)嵌對(duì)象的無(wú)參構(gòu)造函數(shù)。析構(gòu)函數(shù)的調(diào)用、執(zhí)行順序與構(gòu)造函數(shù)剛好相反C++語(yǔ)言程序設(shè)計(jì)229.3類的組合例:類的組合應(yīng)用定義類point表示點(diǎn),它有X坐標(biāo)和Y坐標(biāo)定義矩形類,它的數(shù)據(jù)成員有point類對(duì)象p1和p2,表示矩形的左上角和右下角color表示矩形的顏色在主函數(shù)中定義一個(gè)矩形,觀看其構(gòu)造過(guò)程和析構(gòu)過(guò)程C++語(yǔ)言程序設(shè)計(jì)239.3類的組合C++語(yǔ)言程序設(shè)計(jì)24//類的組合應(yīng)用#include<iostream>#include<cmath>usingnamespacestd;classPoint//Point類定義{public:Point(intxx=0,intyy=0){X=xx;Y=yy;cout<<"Pointconstructor"<<endl;}~Point(){cout<<"Pointdestructor"<<endl;}intGetX(){returnX;}intGetY(){returnY;}private:intX,Y;};9.3類的組合C++語(yǔ)言程序設(shè)計(jì)25//類的組合classRectangle //Rectangle類的定義{public: //外部接口

Rectangle(intx1,inty1,intx2,inty2,intc);~Rectangle();intGetColor(){returncolor;}intGetWidth(){returnabs(p1.GetX()-p2.GetX());} //求絕對(duì)值函數(shù)abs()intGetHeight(){returnabs(p1.GetY()-p2.GetY());}private: //私有數(shù)據(jù)成員

Pointp1,p2;

//Point類的對(duì)象p1,p2intcolor; };9.3類的組合C++語(yǔ)言程序設(shè)計(jì)26//組合類的構(gòu)造函數(shù)、析構(gòu)函數(shù)Rectangle::Rectangle(intx1,inty1,intx2,inty2,intc):p1(x1,y1),p2(x2,y2){cout<<"Rectangle構(gòu)造函數(shù)被調(diào)用"<<endl;color=c;}Rectangle::~Rectangle(){

cout<<"析構(gòu)Rectangle對(duì)象"<<endl;}9.3類的組合C++語(yǔ)言程序設(shè)計(jì)27//主函數(shù)voidmain(){

//定義Rectangle類的對(duì)象Rectanglemyr(1,1,4,5,255);

cout<<"TheRectangle'scoloris:";cout<<myr.GetColor()<<endl;cout<<"TheRectangle'swidthis:";cout<<myr.GetWidth()<<endl;cout<<"TheRectangle'sheightis:";cout<<myr.GetHeight()<<endl;}9.4友元友元是可以訪問(wèn)類的私有成員和保護(hù)成員的外部成員在一個(gè)類中,可以利用關(guān)鍵字friend將外部成員(一般函數(shù)、其他類的成員函數(shù)或其他類)聲明為本類的友元類中本來(lái)隱藏的信息(私有和保護(hù)成員)可以被友元訪問(wèn)友元提供了不同類或?qū)ο蟮某蓡T函數(shù)之間、類的成員函數(shù)與一般函數(shù)之間進(jìn)行數(shù)據(jù)共享的機(jī)制C++語(yǔ)言程序設(shè)計(jì)289.4友元友元函數(shù)是在類聲明中由關(guān)鍵字friend修飾的非成員函數(shù)一般函數(shù)另一個(gè)類的成員函數(shù)它不是本類的成員函數(shù),但是在它的函數(shù)體中可以通過(guò)對(duì)象名訪問(wèn)本類的私有和保護(hù)成員友元類在類的聲明中可以聲明另一個(gè)類為本類的友元,這時(shí)稱為友元類若A類是B類的友元類,則A類的所有成員函數(shù)都是B類的友元函數(shù),都可以訪問(wèn)B類的私有和保護(hù)成員C++語(yǔ)言程序設(shè)計(jì)29例:使用友元函數(shù)計(jì)算兩點(diǎn)距離9.4友元C++語(yǔ)言程序設(shè)計(jì)30//使用友元函數(shù)計(jì)算兩點(diǎn)距離#include<iostream>#include<cmath>usingnamespacestd;classPoint //Point類定義{public: //外部接口

Point(intxx=0,intyy=0){X=xx;Y=yy;}intGetX(){returnX;}intGetY(){returnY;}

friendfloatfDist(Point&a,Point&b);

//友元函數(shù)聲明private: //私有數(shù)據(jù)成員

intX,Y;};例:使用友元函數(shù)計(jì)算兩點(diǎn)距離9.4友元C++語(yǔ)言程序設(shè)計(jì)31floatfDist(Point&p1,Point&p2) //友元函數(shù)實(shí)現(xiàn){doublex=double(p1.X-p2.X); //通過(guò)對(duì)象訪問(wèn)私有數(shù)據(jù)成員

doubley=double(p1.Y-p2.Y);returnfloat(sqrt(x*x+y*y));}voidmain() //主函數(shù){Pointmyp1(1,1),myp2(4,5); //定義Point類的對(duì)象

cout<<"Thedistanceis:";cout<<fDist(myp1,myp2)<<endl; //計(jì)算兩點(diǎn)間的距離}運(yùn)行結(jié)果:Thedistanceis:5例:友元類的使用9.4友元C++語(yǔ)言程序設(shè)計(jì)32//友元類的使用#include<iostream>#include<cstring>usingnamespacestd;classStudent;

//前向引用聲明,只聲明類名,類定義在后面classTeacher{public:Teacher(inti,char*c);voidshow();voidassignGrades(Student&s);//使用未定義的類,需要前向引用聲明private:char*name;intid;};例:友元類的使用9.4友元C++語(yǔ)言程序設(shè)計(jì)33classStudent{public:Student(inti,char*c,floats,Teacher*t);voidprintstu();friendclassTeacher;private:Teacher*pT;intsid;char*name;floatgrade;};例:友元類的使用9.4友元C++語(yǔ)言程序設(shè)計(jì)34Student::Student(inti,char*c,floats,Teacher*t){sid=i;name=newchar[strlen(c)+1];if(name!=0)strcpy(name,c);grade=s;pT=t;}voidStudent::printstu(){cout<<"學(xué)號(hào):"<<sid<<"姓名:"<<name;cout<<"成績(jī):"<<grade<<endl;}9.4友元C++語(yǔ)言程序設(shè)計(jì)35Teacher::Teacher(inti,char*c){id=i;name=newchar[strlen(c)+1];if(name!=0)strcpy(name,c);}voidTeacher::show(){cout<<"工作證號(hào):"<<id<<"姓名:"<<name<<endl;}voidTeacher::assignGrades(Student&s){if(s.pT->id==id)s.grade=4.0;

//修改學(xué)生成績(jī),直接操作另一個(gè)類私有的成員}例:友元類的使用9.4友元C++語(yǔ)言程序設(shè)計(jì)36voidmain(){Teacherwang(62,"wangyi");wang.show();Students1(10,"zhangsan",87.6,&wang);s1.printstu();wang.assignGrades(s1);s1.printstu();Students2(12,"lisi",80,&wang);s2.printstu();wang.assignGrades(s2);s2.printstu();}9.4友元關(guān)于友元的幾點(diǎn)說(shuō)明友元關(guān)系是不能傳遞的B類是A類的友元,C類是B類的友元,C類和A類之間,如果沒(méi)有聲明,就沒(méi)有任何友元關(guān)系,不能進(jìn)行數(shù)據(jù)共享。友元關(guān)系是單向的如果聲明B類是A類的友元,B類的成員函數(shù)就可以訪問(wèn)A類的私有和保護(hù)數(shù)據(jù),但A類的成員函數(shù)卻不能訪問(wèn)B類的私有和保護(hù)數(shù)據(jù)C++語(yǔ)言程序設(shè)計(jì)379.5運(yùn)算符重載運(yùn)算符重載是C++的一個(gè)特性,使得程序員可以把C++的運(yùn)算符擴(kuò)展到用戶自定義的類類型中C++中預(yù)定義的運(yùn)算符,如+、?、=、>>等,其操作對(duì)象只能是基本數(shù)據(jù)類型對(duì)于很多用戶自定義類型,也需要類似的運(yùn)算操作,它使C++的代碼更直觀、易讀,使用更方便運(yùn)算符重載的實(shí)質(zhì)就是函數(shù)重載對(duì)已有的運(yùn)算符賦予多重含義,使同一運(yùn)算符作用于不同類型的數(shù)據(jù)時(shí)發(fā)生不同的行為C++語(yǔ)言程序設(shè)計(jì)389.5運(yùn)算符重載例:使用重載運(yùn)算符復(fù)制和連接字符串C++語(yǔ)言程序設(shè)計(jì)39//使用重載運(yùn)算符復(fù)制和連接字符串#include<string>#include<iostream>usingnamespacestd;voidmain(){strings1="Hello";

strings2="world";

strings3;

s3=s1; //字符串復(fù)制

cout<<s3<<endl;

s3=s1+s2; //字符串連接

cout<<s3<<endl;}運(yùn)行結(jié)果:HelloHelloworld9.5運(yùn)算符重載運(yùn)算符重載的規(guī)則重載運(yùn)算符時(shí),運(yùn)算符的運(yùn)算順序和優(yōu)先級(jí)不變,操作數(shù)個(gè)數(shù)不變不能創(chuàng)造新的運(yùn)算符,只能重載C++中已有的運(yùn)算符,并且規(guī)定有6個(gè)運(yùn)算符不能重載一般來(lái)講,重載后的運(yùn)算符的功能應(yīng)當(dāng)與運(yùn)算符的實(shí)際意義相符C++語(yǔ)言程序設(shè)計(jì)40運(yùn)算符含義.類屬關(guān)系運(yùn)算符.*成員指針運(yùn)算符::作用域運(yùn)算符?:條件運(yùn)算符#編譯預(yù)處理符號(hào)sizeof取數(shù)據(jù)類型的長(zhǎng)度9.5運(yùn)算符重載運(yùn)算符重載有以下兩種形式:重載為類的成員函數(shù)形式為:函數(shù)類型operator運(yùn)算符(形參表) {

函數(shù)體; }重載為類的友元函數(shù)形式為:函數(shù)類型operator運(yùn)算符(形參表) {

函數(shù)體; }C++語(yǔ)言程序設(shè)計(jì)419.5運(yùn)算符重載關(guān)于運(yùn)算符重載的幾點(diǎn)說(shuō)明函數(shù)類型指明了重載運(yùn)算符的返回值類型,也就是運(yùn)算結(jié)果類型operator是定義運(yùn)算符重載的關(guān)鍵字“運(yùn)算符”即要重載的運(yùn)算符名稱注意:重載為成員函數(shù)對(duì)象本身就是其中的一個(gè)操作數(shù)形參表內(nèi)參數(shù)的數(shù)目比操作數(shù)的數(shù)目少一個(gè)重載為友元函數(shù)形參表內(nèi)參數(shù)的數(shù)目等同于操作數(shù)的數(shù)目必須要加上friend關(guān)鍵字C++語(yǔ)言程序設(shè)計(jì)42例:創(chuàng)建一個(gè)復(fù)數(shù)類,將+、?、+=運(yùn)算符重載為成員函數(shù)9.5運(yùn)算符重載C++語(yǔ)言程序設(shè)計(jì)43//創(chuàng)建一個(gè)復(fù)數(shù)類,將+、?、+=運(yùn)算符重載為成員函數(shù)#include<iostream>#include<iomanip>usingnamespacestd;classcomplex{public:complex(doublereal=0,doubleimag=0):r(real),i(imag){}

complexoperator+(complex&);

//重載運(yùn)算符的函數(shù)原型

complexoperator-(complex&);complex&operator+=(complex&);voidprint(){cout<<setiosflags(ios::showpos)<<r<<""<<i<<'i'<<endl;}private:doubler,i; };例:創(chuàng)建一個(gè)復(fù)數(shù)類,將+、?、+=運(yùn)算符重載為成員函數(shù)9.5運(yùn)算符重載C++語(yǔ)言程序設(shè)計(jì)44complexcomplex::operator+(complex&c) //重載“+”運(yùn)算符{returncomplex(r+c.r,i+c.i);}complexcomplex::operator-(complex&c) //重載“-”運(yùn)算符{returncomplex(r-c.r,i-c.i);}Complex&complex::operator+=(complex&c) //重載“+=”運(yùn)算符{r+=c.r;i+=c.i;return*this;}例:創(chuàng)建一個(gè)復(fù)數(shù)類,將+、?、+=運(yùn)算符重載為成員函數(shù)9.5運(yùn)算符重載C++語(yǔ)言程序設(shè)計(jì)45voidmain(){complexc1(1,1),c2(3,3),c3;c3=c1+c2; //復(fù)數(shù)相加

c3.print();c3=c1-c2; //復(fù)數(shù)相減

c3.print();c3+=c2+=c1; //復(fù)數(shù)相加后賦值

c3.print();}例:創(chuàng)建一個(gè)復(fù)數(shù)類,將+、?、+=運(yùn)算符重載為友元函數(shù)9.5運(yùn)算符重載C++語(yǔ)言程序設(shè)計(jì)46//創(chuàng)建一個(gè)復(fù)數(shù)類,將+、?、+=運(yùn)算符重載為成員函數(shù)#include<iostream>#include<iomanip>usingnamespacestd;classcomplex{public:complex(doublereal=0,doubleimag=0):r(real),i(imag){}

friendcomplexoperator+(complex&,complex&);friendcomplexoperator-(complex&,complex&);friendcomplex&operator+=(complex&,complex&);voidprint(){cout<<setiosflags(ios::showpos)<<r<<""<<i<<'i'<<endl;}private:doubler,i; };例:創(chuàng)建一個(gè)復(fù)數(shù)類,將+、?、+=運(yùn)算符重載為友元函數(shù)9.5運(yùn)算符重載C++語(yǔ)言程序設(shè)計(jì)47complexoperator+(complex&c1,complex&c2) //重載“+”運(yùn)算符{returncomplex(c1.r+c2.r,c1.i+c2.i);}complexoperator-(complex&c1,complex&c2) //重載“-”運(yùn)算符{returncomplex(c1.r-c2.r,c1.i-c2.i);}complex&operator+=(complex&c1,complex&c2) //重載“+=”運(yùn)算符{c1.r+=c2.r;c1.i+=c2.i;returnc1;}例:創(chuàng)建一個(gè)復(fù)數(shù)類,將+、?、+=運(yùn)算符重載為友元函數(shù)9.5運(yùn)算符重載C++語(yǔ)言程序設(shè)計(jì)48voidmain(){complexc1(1,1),c2(3,3),c3;c3=c1+c2; //復(fù)數(shù)相加

c3.print();c3=c1-c2; //復(fù)數(shù)相減

c3.print();c3+=c2+=c1; //復(fù)數(shù)相加后賦值

c3.print();}C++語(yǔ)言程序設(shè)計(jì)49編程技能a(一)包含內(nèi)嵌對(duì)象的派生類構(gòu)造含內(nèi)嵌對(duì)象的派生類構(gòu)造函數(shù)的形式如下:派生類名::派生類名(基類所需的形參,本類成員所需的形參):基類1(基類參數(shù)表1),基類2(基類參數(shù)表2),…,基類n(基類參數(shù)表n),對(duì)象成員1(對(duì)象參數(shù)表1),對(duì)象成員2(對(duì)象參數(shù)表2),…,對(duì)象成員m(對(duì)

象參數(shù)表m){本類基本類型數(shù)據(jù)成員初始化;}C++語(yǔ)言程序設(shè)計(jì)50初始化列表(一)包含內(nèi)嵌對(duì)象的派生類構(gòu)造派生類構(gòu)造函數(shù)的形式參數(shù)表應(yīng)該提供3部分參數(shù)基類構(gòu)造函數(shù)形參表所需要的參數(shù)初始化派生類的內(nèi)嵌對(duì)象數(shù)據(jù)成員所需要的參數(shù)初始化派生類基本數(shù)據(jù)類型數(shù)據(jù)成員的參數(shù)C++語(yǔ)言程序設(shè)計(jì)51(一)包含內(nèi)嵌對(duì)象的派生類構(gòu)造例:派生類的構(gòu)造函數(shù)在復(fù)雜應(yīng)用中,既有類的派生,又有類的組合C++語(yǔ)言程序設(shè)計(jì)52(一)包含內(nèi)嵌對(duì)象的派生類構(gòu)造例:派生類的構(gòu)造函數(shù)數(shù)據(jù)類型名字反映出該數(shù)據(jù)類型的特征或者功能使用typedef關(guān)鍵字為某種數(shù)據(jù)類型重新起一個(gè)名字C++語(yǔ)言程序設(shè)計(jì)53//GlobalType910.h#pragmaonce //預(yù)處理指令,避免重復(fù)包含本頭文件typedefunsignedintuint;typedefunsignedcharuchar;(一)包含內(nèi)嵌對(duì)象的派生類構(gòu)造例:派生類的構(gòu)造函數(shù)類TColor普通構(gòu)造函數(shù)提供無(wú)參構(gòu)造函數(shù)賦值構(gòu)造函數(shù)重載的賦值運(yùn)算符C++語(yǔ)言程序設(shè)計(jì)54(一)包含內(nèi)嵌對(duì)象的派生類構(gòu)造C++語(yǔ)言程序設(shè)計(jì)55//TColor910.h#pragmaonce#include"GlobalType910.h"enumEColorComponent{RED,GREEN,BLUE};classTColor{private:uchar_RED,_GREEN,_BLUE;public:

TColor(constucharR=0x00,constucharG=0x00,constucharB=0x00); //普通構(gòu)造函數(shù)

TColor(constTColor&color); //復(fù)制構(gòu)造函數(shù)

TColor&operator=(constTColor&color); //重載賦值運(yùn)算符

voidsetColor(ucharR,ucharG,ucharB);uchargetComponent(EColorComponentcomponent)const;};(一)包含內(nèi)嵌對(duì)象的派生類構(gòu)造C++語(yǔ)言程序設(shè)計(jì)56//TColor910.cpp#include"TColor910.h"TColor::TColor(ucharR/*=0x00*/, //普通構(gòu)造函數(shù)

ucharG/*=0x00*/,//類定義中函數(shù)原型是帶默認(rèn)值的

ucharB/*=0x00*/){//這里不需要重復(fù)寫(xiě)默認(rèn)值

_RED=R;_GREEN=G;_BLUE=B;}TColor::TColor(constTColor&color){ //復(fù)制構(gòu)造函數(shù),即拷貝構(gòu)造函數(shù)

_RED=color._RED;_GREEN=color._GREEN; _BLUE=color._BLUE;}(一)包含內(nèi)嵌對(duì)象的派生類構(gòu)造C++語(yǔ)言程序設(shè)計(jì)57//TColor910.cppTColor&TColor::operator=(constTColor&color){_RED=color._RED;_GREEN=color._GREEN;_BLUE=color._BLUE;return*this;}voidTColor::setColor(ucharR,ucharG,ucharB){_RED=R;_GREEN=G;_BLUE=B;}(一)包含內(nèi)嵌對(duì)象的派生類構(gòu)造C++語(yǔ)言程序設(shè)計(jì)58//TColor910.cppucharTColor::getComponent(EColorComponentcomponent)const{ucharcolor;switch(component){caseRED:color=_RED; break;caseGREEN:color=_GREEN; break;caseBLUE:color=_BLUE; break;default:color=0x00; break;};returncolor;}(一)包含內(nèi)嵌對(duì)象的派生類構(gòu)造例:派生類的構(gòu)造函數(shù)類TShape包含TColor類的對(duì)象有兩個(gè)重載的構(gòu)造函數(shù)兩個(gè)構(gòu)造函數(shù)都調(diào)用了TColor類的無(wú)參構(gòu)造函數(shù)第一個(gè)TShape構(gòu)造函數(shù)有2個(gè)參數(shù),用于給本類的基本數(shù)據(jù)類型成員賦值第二個(gè)TShape構(gòu)造函數(shù)有3個(gè)參數(shù),前兩個(gè)參數(shù)用于給本類的基本數(shù)據(jù)類型成員賦值,最后一個(gè)參數(shù)color用于給內(nèi)嵌的TColor類對(duì)象賦值C++語(yǔ)言程序設(shè)計(jì)59(一)包含內(nèi)嵌對(duì)象的派生類構(gòu)造C++語(yǔ)言程序設(shè)計(jì)60//TShape910.h#pragmaonce#include"GlobalType910.h"#include"TColor910.h"classTShape{private:uint_x,_y;//幾何形狀的位置protected:

TColor_color;//顏色public:TShape(uintx,uinty);

TShape(uintx,uinty,TColorcolor);~TShape();voidDraw();voidgetXY(uint&x,uint&y)const;voidsetXY(uintx,uinty);TColorgetColor()const;voidsetColor(TColorcolor);};(一)包含內(nèi)嵌對(duì)象的派生類構(gòu)造C++語(yǔ)言程序設(shè)計(jì)61//TShape910.cpp#include"TShape910.h"#include"TColor910.h"#include<iostream>usingnamespacestd;TShape::TShape(uintx,uinty):_color(){//在初始化列表表初始化內(nèi)嵌對(duì)象

_x=x;_y=y;}TShape::TShape(uintx,uinty,TColorcolor){_x=x;_y=y;_color=color;//調(diào)用TColor類的賦值運(yùn)算符重載函數(shù)}TShape::~TShape(){cout<<"TShapedestructed"<<endl;}(一)包含內(nèi)嵌對(duì)象的派生類構(gòu)造C++語(yǔ)言程序設(shè)計(jì)62//TShape910.cppvoidTShape::Draw(){uintR,G,B;

//程序?qū)⒁@示RGB分量的數(shù)值,若直接使用cout操作RGB分量,

//則顯示的是RGB分量的ASCII碼。因此需首先將RGB分量轉(zhuǎn)換為整型

R=static_cast<uint>(_color.getComponent(RED));G=static_cast<uint>(_color.getComponent(GREEN));B=static_cast<uint>(_color.getComponent(BLUE));cout<<"Drawashapewithcolor("<<R<<","<<G<<","<<B;cout<<")atpoint("<<_x<<","<<_y<<")"<<endl;}(一)包含內(nèi)嵌對(duì)象的派生類構(gòu)造C++語(yǔ)言程序設(shè)計(jì)63//TShape910.cppvoidTShape::getXY(uint&x,uint&y)const{x=_x;y=_y;}voidTShape::setXY(uintx,uinty){_x=x;_y=y;}TColorTShape::getColor()const{return_color;}voidTShape::setColor(TColorc){_color=c;}(一)包含內(nèi)嵌對(duì)象的派生類構(gòu)造例:派生類的構(gòu)造函數(shù)TEllipse類由TShape類派生有兩個(gè)重載的構(gòu)造函數(shù)第一個(gè)TShape構(gòu)造函數(shù)有4個(gè)參數(shù),其中l(wèi)ongR和shortR兩個(gè)參數(shù)用于給本類的基本數(shù)據(jù)類型成員賦值,另外兩個(gè)形式參數(shù)用于初始化基類TShape的構(gòu)造函數(shù)第二個(gè)TShape構(gòu)造函數(shù)有5個(gè)參數(shù),其中l(wèi)ongR和shortR兩個(gè)參數(shù)用于給本類的基本數(shù)據(jù)類型成員賦值,另外兩個(gè)形式參數(shù)用于初始化基類TShape的構(gòu)造函數(shù),最后一個(gè)參數(shù)color用于給基類的保護(hù)數(shù)據(jù)成員_color賦值C++語(yǔ)言程序設(shè)計(jì)64(一)包含內(nèi)嵌對(duì)象的派生類構(gòu)造C++語(yǔ)言程序設(shè)計(jì)65//TEllipse910.h#pragmaonce#include"TShape910.h"#include"GlobalType910.h"classTEllipse:publicTShape{protected:uint_longR,_shortR;public:

TEllipse(uintlongR,uintshortR,uintx,uinty,TColorcolor);TEllipse(uintlongR,uintshortR,uintx,uinty);~TEllipse();voidDraw();voidgetR(uint&longR,uint&shortR)const;voidsetR(uintlongR,uintshortR);};(一)包含內(nèi)嵌對(duì)象的派生類構(gòu)造C++語(yǔ)言程序設(shè)計(jì)66//TEllipse910.cpp#include"TEllipse910.h"#include<iostream>usingnamespacestd;TEllipse::TEllipse(uintlongR,uintshortR,uintx,uinty,TColorcolor):TShape(x,y){_longR=longR;_shortR=shortR;//在派生類構(gòu)造函數(shù)中訪問(wèn)基類保護(hù)成員

_color=color;}TEllipse::TEllipse(uintlongR,uintshortR,uintx,uinty):TShape(x,y){_longR=longR;_shortR=shortR;}(一)包含內(nèi)嵌對(duì)象的派生類構(gòu)造C++語(yǔ)言程序設(shè)計(jì)67//TEllipse910.cppTEllipse::~TEllipse(){cout<<"TEllipsedestructed"<<endl;}voidTEllipse::getR(uint&longR,uint&shortR)const{longR=_longR;shortR=_shortR;}voidTEllipse::setR(uintlongR,uintshortR){_longR=longR;_shortR=shortR;}(一)包含內(nèi)嵌對(duì)象的派生類構(gòu)造C++語(yǔ)言程序設(shè)計(jì)68//TEllipse910.cppvoidTEllipse::Draw(){uintx,y;getXY(x,y);//調(diào)用基類公有函數(shù)訪問(wèn)基類私有成員

uintR,G,B;//以下3行代碼直接訪問(wèn)基類保護(hù)成員_colorR=static_cast<uint>(_color.getComponent(RED));G=static_cast<uint>(_color.getComponent(GREEN));B=static_cast<uint>(_color.getComponent(BLUE));cout<<"Drawanellipsewithcolor(";cout<<R<<“,”<<G<<“,”<<B<<“)\natpoint(";//下行代碼錯(cuò)誤!在派生類中不能訪問(wèn)基類私有成員

//cout<<_x<<","<<_y<<")";cout<<x<<","<<y<<")";cout<<",longR:"<<_longR<<"andshortR:"<<_shortR<<endl;}(一)包含內(nèi)嵌對(duì)象的派生類構(gòu)造C++語(yǔ)言程序設(shè)計(jì)691.//Main910.cpp2.#include"TEllipse910.h"3.#include<iostream>4.usingnamespacestd;5.intmain(){6.TShapeshp(0u,0u);7.shp.setColor(TColor(0xFF,0x00,0x00));8.cout<<__FILE__<<":"<<__LINE__<<"";shp.Draw();9.10.TEllipseelps01(10u,5u,0u,0u);11.cout<<__FILE__<<":"<<__LINE__<<"";elps01.Draw();12.(一)包含內(nèi)嵌對(duì)象的派生類構(gòu)造C++語(yǔ)言程序設(shè)計(jì)7013.TEllipseelps02(10u,5u,20u,30u,TColor(0x00,0xFF,0x00));14.//通過(guò)派生類對(duì)象調(diào)用基類的同名函數(shù)15.cout<<__FILE__<<":"<<__LINE__<<"";elps02.TShape::Draw();16.cout<<__FILE__<<":"<<__LINE__<<"";elps02.Draw();17.//調(diào)用基類函數(shù)訪問(wèn)基類保護(hù)成員18.elps02.setColor(shp.getColor());19.cout<<__FILE__<<":"<<__LINE__<<"";elps02.Draw();20.elps02.setColor(TColor(shp.getColor()));21.cout<<__FILE__<<":"<<__LINE__<<"";elps02.Draw();22.return0;23.}(一)包含內(nèi)嵌對(duì)象的派生類構(gòu)造編譯并運(yùn)行后,其輸出結(jié)果如下C++語(yǔ)言程序設(shè)計(jì)71(一)包含內(nèi)嵌對(duì)象的派生類構(gòu)造派生類構(gòu)造函數(shù)總結(jié)職責(zé):初始化基類初始化內(nèi)嵌對(duì)象成員初始化基本數(shù)據(jù)類型的成員方式:構(gòu)造函數(shù)初始化列表:基類構(gòu)造函數(shù),內(nèi)嵌對(duì)象成員構(gòu)造函數(shù)構(gòu)造函數(shù)函數(shù)體:基本數(shù)據(jù)類型的成員特殊情況:const成員和reference成員只能通過(guò)初始化列表獲得初值若不需要做上述初始化工作,則可不定義構(gòu)造函數(shù),而使用系統(tǒng)提供的默認(rèn)構(gòu)造函數(shù)C++語(yǔ)言程序設(shè)計(jì)72(一)包含內(nèi)嵌對(duì)象的派生類構(gòu)造派生類構(gòu)造函數(shù)總結(jié)派生類構(gòu)造函數(shù)的執(zhí)行次序:初始化列表

構(gòu)造函數(shù)函數(shù)體基類的構(gòu)造函數(shù)。內(nèi)嵌對(duì)象的構(gòu)造函數(shù)。派生類的構(gòu)造函數(shù)(即函數(shù)體中的代碼)若派生類構(gòu)造函數(shù)沒(méi)有顯式初始化基類或內(nèi)嵌對(duì)象成員,則編譯器會(huì)在初始化列表中自動(dòng)插入基類默認(rèn)構(gòu)造函數(shù)或內(nèi)嵌對(duì)象的默認(rèn)構(gòu)造函數(shù)C++語(yǔ)言程序設(shè)計(jì)73多繼承時(shí),基類構(gòu)造函數(shù)的調(diào)用順序:按照定義派生類時(shí)這些基類被繼承的順序與他們?cè)诔跏蓟斜淼拇涡驘o(wú)關(guān)派生類的多個(gè)對(duì)象成員的構(gòu)造函數(shù)的調(diào)用順序按照派生類定義這些成員的順序進(jìn)行與他們?cè)诔跏蓟斜碇械南群蟠涡驘o(wú)關(guān)(二)包含內(nèi)嵌對(duì)象的派生類析構(gòu)派生類不能繼承基類的析構(gòu)函數(shù),需要自己定義析構(gòu)函數(shù)職責(zé)

執(zhí)行對(duì)象的清理工作,例如清理位于堆區(qū)的成員、向其他對(duì)象發(fā)送消息等隱式調(diào)用派生類內(nèi)嵌對(duì)象的析構(gòu)函數(shù)(析構(gòu)內(nèi)嵌對(duì)象成員)

隱式調(diào)用基類析構(gòu)函數(shù)若無(wú)須執(zhí)行派生類對(duì)象的清理工作,則可不定義析構(gòu)函數(shù),而使用系統(tǒng)提供的默認(rèn)析構(gòu)函數(shù)派生類析構(gòu)函數(shù)的執(zhí)行次序與構(gòu)造函數(shù)的執(zhí)行次序恰好相反C++語(yǔ)言程序設(shè)計(jì)74①派生類的析構(gòu)函數(shù)(即函數(shù)體中的代碼)②派生類內(nèi)嵌對(duì)象的析構(gòu)函數(shù)③基類的析構(gòu)函數(shù)例:包含內(nèi)嵌對(duì)象指針的派生類析構(gòu)函數(shù)(二)包含內(nèi)嵌對(duì)象的派生類析構(gòu)C++語(yǔ)言程序設(shè)計(jì)75//包含內(nèi)嵌對(duì)象指針的派生類析構(gòu)函數(shù)#include<iostream>#include<string>usingnamespacestd;classTPoint{protected:int_x,_y;public:TPoint(intx=0,inty=0){cout<<"TPoint構(gòu)造函數(shù)"<<"("<<x<<","<<y<<")"<<endl;_x=x;_y=y;}~TPoint(){cout<<"TPoint析構(gòu)函數(shù)"<<"("<<_x<<","<<_y<<")"<<endl;}};例:包含內(nèi)嵌對(duì)象指針的派生類析構(gòu)函數(shù)(二)包含內(nèi)嵌對(duì)象的派生類析構(gòu)C++語(yǔ)言程序設(shè)計(jì)76classTColor{private:string_color;public:TColor(stringcolor="BLACK"){cout<<"TColor構(gòu)造函數(shù)"<<endl;_color=color;

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論