版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
C++語言程序設(shè)計第十一組C++語言程序設(shè)計第九章類的特殊成員C++語言程序設(shè)計1目錄C++語言程序設(shè)計2“類的靜態(tài)成員常對象和常成員類的組合友元運算符重載基本知識包含內(nèi)嵌對象的派生類構(gòu)造包含內(nèi)嵌對象的派生類析構(gòu)編程技能賦值運算符重載刨根問底C++語言程序設(shè)計3基本知識a9.1類的靜態(tài)成員類的靜態(tài)成員用來解決同一個類的不同對象之間數(shù)據(jù)和函數(shù)的共享問題包括:類的靜態(tài)數(shù)據(jù)成員類的靜態(tài)成員函數(shù)C++語言程序設(shè)計49.1類的靜態(tài)成員靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員是類的數(shù)據(jù)成員的一種特例類的數(shù)據(jù)成員在類的每一個對象中分別存儲不同的數(shù)值,但是靜態(tài)數(shù)據(jù)成員在每個類只有一個副本由該類的所有對象共同維護和使用,從而實現(xiàn)了同一類的不同對象之間的數(shù)據(jù)共享具有靜態(tài)生存期C++語言程序設(shè)計59.1類的靜態(tài)成員靜態(tài)數(shù)據(jù)成員的聲明及初始化采用static關(guān)鍵字來聲明靜態(tài)數(shù)據(jù)成員是屬于類的,可以通過類名對它進行訪問語法格式:類名::標識符靜態(tài)數(shù)據(jù)成員的初始化需要在類的外部進行類的聲明是抽象的,只能聲明靜態(tài)數(shù)據(jù)成員的存在C++語言程序設(shè)計6例:定義學(xué)生類,定義一個靜態(tài)數(shù)據(jù)成員count,用來統(tǒng)計學(xué)生的人數(shù)count初始值設(shè)置為0每定義一個學(xué)生對象調(diào)用構(gòu)造函數(shù)一次,在構(gòu)造函數(shù)中為count加1每析構(gòu)一個學(xué)生對象,在析構(gòu)函數(shù)中完成count減19.1類的靜態(tài)成員C++語言程序設(shè)計79.1類的靜態(tài)成員C++語言程序設(shè)計8//靜態(tài)數(shù)據(jù)成員的定義和使用#include<iostream>#include<string>usingnamespacestd;classStudent{public:Student(char*pName="noname");~Student();voidPrintC(){cout<<"Thenumberofstudentsis"<<count<<endl;}private:
staticintcount;//若寫成count=0則非法stringname;};9.1類的靜態(tài)成員C++語言程序設(shè)計9Student::Student(char*pName)//="noname"){cout<<"createonestudent\n";name=pName;count++;//靜態(tài)成員:每創(chuàng)建一個對象,學(xué)生人數(shù)增1}Student::~Student(){cout<<"destructonestudent\n";count--;//每析構(gòu)一個對象,學(xué)生人數(shù)減1cout<<"Thenumberofstudentsis"<<count<<endl;}9.1類的靜態(tài)成員C++語言程序設(shè)計10intStudent::count=0;//靜態(tài)數(shù)據(jù)成員在類外分配空間和初始化,static不用寫voidmain(){Students1;s1.PrintC();Students2;s2.PrintC();}9.1類的靜態(tài)成員靜態(tài)成員函數(shù)使用static關(guān)鍵字聲明的函數(shù)成員靜態(tài)成員函數(shù)屬于整個類可以通過“類名::靜態(tài)成員函數(shù)名”來調(diào)這樣,在創(chuàng)建任何對象前,這類函數(shù)也可以被調(diào)用由類的所有對象共享,也可以通過對象來調(diào)用C++語言程序設(shè)計119.1類的靜態(tài)成員前例:PrintC()函數(shù)定義為靜態(tài)成員函數(shù):main()函數(shù)中,在創(chuàng)建任何對象前,訪問靜態(tài)數(shù)據(jù)成員count:C++語言程序設(shè)計12intStudent::count=0;voidmain(){Student::PrintC(); //通過類名定義靜態(tài)成員函數(shù)Students1;s1.PrintC();Students2;s2.PrintC();}staticvoidPrintC(){cout<<"Thenumberofstudentsis"<<count<<endl;}9.2常對象和常成員常對象定義對象時用const進行修飾,稱為常對象它的數(shù)據(jù)成員值在對象的整個生存期間內(nèi)不能被改變常對象在定義時必須進行初始化常對象不能被更新聲明的語法格式:類名const對象名C++語法規(guī)定:常對象只能調(diào)用常成員函數(shù),以保證常對象的數(shù)據(jù)成員不被修改C++語言程序設(shè)計13例如:classPoint{public:Point(inti,intj){x=i;y=j;}//…private:intx,y;};//a是常對象,不能被更新Pointconsta(3,4);9.2常對象和常成員常成員函數(shù)類成員函數(shù)使用const關(guān)鍵字修飾,稱為常成員函數(shù)語法格式:返回值類型說明符
函數(shù)名(參數(shù)表)const;常成員函數(shù)具有以下特點。const是函數(shù)類型的一個組成部分,在函數(shù)實現(xiàn)時也要帶const關(guān)鍵字常成員函數(shù)不能更新對象的數(shù)據(jù)成員,也不能調(diào)用該類中的非常成員函數(shù)常對象只能調(diào)用常成員函數(shù),但是常成員函數(shù)可以被普通對象調(diào)用const關(guān)鍵字可被用于參與對重載函數(shù)的區(qū)分例如:在類中這樣聲明是對print函數(shù)的有效重載 voidprint(); voidprint()const;C++語言程序設(shè)計14例:常成員函數(shù)和常對象示例9.2常對象和常成員C++語言程序設(shè)計15//常成員函數(shù)和常對象示例#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}運行結(jié)果:5;420;529.2常對象和常成員常數(shù)據(jù)成員使用const說明的數(shù)據(jù)成員稱為常數(shù)據(jù)成員常數(shù)據(jù)成員一經(jīng)初始化就不能再被改變構(gòu)造函數(shù)對常數(shù)據(jù)成員進行初始化,只能通過初始化列表初始化列表是在構(gòu)造函數(shù)的函數(shù)頭后面,用“:”連接的一組參數(shù)表形式為:類名::類名(參數(shù)表):初始化列表 { //函數(shù)體
}初始化列表的形式為:成員名1(初始值),成員名2(初始值),…C++語言程序設(shè)計16提示:通常把常數(shù)據(jù)成員定義為靜態(tài)成員,使其成為類的一個常量例:常數(shù)據(jù)成員使用示例9.2常對象和常成員C++語言程序設(shè)計17//常數(shù)據(jù)成員示例#include<iostream>usingnamespacestd;classCircle{public:Circle(intr,inti);voidprint();private:intradius;constinta;
//靜態(tài)常數(shù)據(jù)成員staticconstfloatPI;
};//靜態(tài)常數(shù)據(jù)成員在類外說明和初始化constfloatCircle::PI=3.14159;
//常數(shù)據(jù)成員只能通過初始化列表來獲得初值Circle::Circle(intr,inti):a(i),radius(r)
{/*因為a是常數(shù)據(jù)成員,不能把語句a=i;寫在構(gòu)造函數(shù)體內(nèi)*/}//普通成員也可以在初始化列表中賦值例:常數(shù)據(jù)成員使用示例9.2常對象和常成員C++語言程序設(shè)計18voidCircle::print(){cout<<"radius="<<radius<<",area="<<radius*radius*PI<<endl;}voidmain()/*建立對象x,并以100和0作為初值調(diào)用構(gòu)造函數(shù),通過構(gòu)造函數(shù)的初始化列表給對象的常數(shù)據(jù)成員賦初值*/{Circlex(100,0);x.print();}運行結(jié)果:Radius=100,area=31415.99.3類的組合在面向?qū)ο蟪绦蛟O(shè)計中,可以對復(fù)雜對象進行分解、抽象,把一個復(fù)雜對象分解為簡單對象的組合類的組合(類的聚集),描述的是一個類內(nèi)嵌其他類的對象作為數(shù)據(jù)成員的情況C++語言程序設(shè)計199.3類的組合例如:Rectangle類的兩個數(shù)據(jù)成員是Point類的對象它們之間的關(guān)系是一種包含與被包含的關(guān)系帶空心菱形的線表示兩個類之間是包含關(guān)系帶箭頭的線表示發(fā)送消息采用部件組裝的方法,利用已定義的類來構(gòu)成新的類C++語言程序設(shè)計209.3類的組合當創(chuàng)建組合類的對象時,各個內(nèi)嵌對象也將被自動創(chuàng)建要對本類的基本數(shù)據(jù)成員進行初始化要對內(nèi)嵌對象成員進行初始化組合類構(gòu)造函數(shù)定義的一般形式為:類名::類名(形參表):內(nèi)嵌對象1(形參表),內(nèi)嵌對象2(形參表),…{ //類的初始化 }初始化列表用來完成內(nèi)嵌對象的初始化調(diào)用內(nèi)嵌對象的構(gòu)造函數(shù)以及為構(gòu)造函數(shù)傳遞的參數(shù)C++語言程序設(shè)計219.3類的組合當定義一個組合類的對象時,構(gòu)造函數(shù)的調(diào)用順序如下按照內(nèi)嵌對象在組合類的聲明中出現(xiàn)的次序,依次調(diào)用其內(nèi)嵌對象的構(gòu)造函數(shù)執(zhí)行本類的構(gòu)造函數(shù)的函數(shù)體如果聲明組合類的對象時沒有指定對象的初始值,則自動調(diào)用無參構(gòu)造函數(shù),相應(yīng)地,也調(diào)用內(nèi)嵌對象的無參構(gòu)造函數(shù)。析構(gòu)函數(shù)的調(diào)用、執(zhí)行順序與構(gòu)造函數(shù)剛好相反C++語言程序設(shè)計229.3類的組合例:類的組合應(yīng)用定義類point表示點,它有X坐標和Y坐標定義矩形類,它的數(shù)據(jù)成員有point類對象p1和p2,表示矩形的左上角和右下角color表示矩形的顏色在主函數(shù)中定義一個矩形,觀看其構(gòu)造過程和析構(gòu)過程C++語言程序設(shè)計239.3類的組合C++語言程序設(shè)計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++語言程序設(shè)計25//類的組合classRectangle //Rectangle類的定義{public: //外部接口
Rectangle(intx1,inty1,intx2,inty2,intc);~Rectangle();intGetColor(){returncolor;}intGetWidth(){returnabs(p1.GetX()-p2.GetX());} //求絕對值函數(shù)abs()intGetHeight(){returnabs(p1.GetY()-p2.GetY());}private: //私有數(shù)據(jù)成員
Pointp1,p2;
//Point類的對象p1,p2intcolor; };9.3類的組合C++語言程序設(shè)計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對象"<<endl;}9.3類的組合C++語言程序設(shè)計27//主函數(shù)voidmain(){
//定義Rectangle類的對象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友元友元是可以訪問類的私有成員和保護成員的外部成員在一個類中,可以利用關(guān)鍵字friend將外部成員(一般函數(shù)、其他類的成員函數(shù)或其他類)聲明為本類的友元類中本來隱藏的信息(私有和保護成員)可以被友元訪問友元提供了不同類或?qū)ο蟮某蓡T函數(shù)之間、類的成員函數(shù)與一般函數(shù)之間進行數(shù)據(jù)共享的機制C++語言程序設(shè)計289.4友元友元函數(shù)是在類聲明中由關(guān)鍵字friend修飾的非成員函數(shù)一般函數(shù)另一個類的成員函數(shù)它不是本類的成員函數(shù),但是在它的函數(shù)體中可以通過對象名訪問本類的私有和保護成員友元類在類的聲明中可以聲明另一個類為本類的友元,這時稱為友元類若A類是B類的友元類,則A類的所有成員函數(shù)都是B類的友元函數(shù),都可以訪問B類的私有和保護成員C++語言程序設(shè)計29例:使用友元函數(shù)計算兩點距離9.4友元C++語言程序設(shè)計30//使用友元函數(shù)計算兩點距離#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ù)計算兩點距離9.4友元C++語言程序設(shè)計31floatfDist(Point&p1,Point&p2) //友元函數(shù)實現(xiàn){doublex=double(p1.X-p2.X); //通過對象訪問私有數(shù)據(jù)成員
doubley=double(p1.Y-p2.Y);returnfloat(sqrt(x*x+y*y));}voidmain() //主函數(shù){Pointmyp1(1,1),myp2(4,5); //定義Point類的對象
cout<<"Thedistanceis:";cout<<fDist(myp1,myp2)<<endl; //計算兩點間的距離}運行結(jié)果:Thedistanceis:5例:友元類的使用9.4友元C++語言程序設(shè)計32//友元類的使用#include<iostream>#include<cstring>usingnamespacestd;classStudent;
//前向引用聲明,只聲明類名,類定義在后面classTeacher{public:Teacher(inti,char*c);voidshow();voidassignGrades(Student&s);//使用未定義的類,需要前向引用聲明private:char*name;intid;};例:友元類的使用9.4友元C++語言程序設(shè)計33classStudent{public:Student(inti,char*c,floats,Teacher*t);voidprintstu();friendclassTeacher;private:Teacher*pT;intsid;char*name;floatgrade;};例:友元類的使用9.4友元C++語言程序設(shè)計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é)號:"<<sid<<"姓名:"<<name;cout<<"成績:"<<grade<<endl;}9.4友元C++語言程序設(shè)計35Teacher::Teacher(inti,char*c){id=i;name=newchar[strlen(c)+1];if(name!=0)strcpy(name,c);}voidTeacher::show(){cout<<"工作證號:"<<id<<"姓名:"<<name<<endl;}voidTeacher::assignGrades(Student&s){if(s.pT->id==id)s.grade=4.0;
//修改學(xué)生成績,直接操作另一個類私有的成員}例:友元類的使用9.4友元C++語言程序設(shè)計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)于友元的幾點說明友元關(guān)系是不能傳遞的B類是A類的友元,C類是B類的友元,C類和A類之間,如果沒有聲明,就沒有任何友元關(guān)系,不能進行數(shù)據(jù)共享。友元關(guān)系是單向的如果聲明B類是A類的友元,B類的成員函數(shù)就可以訪問A類的私有和保護數(shù)據(jù),但A類的成員函數(shù)卻不能訪問B類的私有和保護數(shù)據(jù)C++語言程序設(shè)計379.5運算符重載運算符重載是C++的一個特性,使得程序員可以把C++的運算符擴展到用戶自定義的類類型中C++中預(yù)定義的運算符,如+、?、=、>>等,其操作對象只能是基本數(shù)據(jù)類型對于很多用戶自定義類型,也需要類似的運算操作,它使C++的代碼更直觀、易讀,使用更方便運算符重載的實質(zhì)就是函數(shù)重載對已有的運算符賦予多重含義,使同一運算符作用于不同類型的數(shù)據(jù)時發(fā)生不同的行為C++語言程序設(shè)計389.5運算符重載例:使用重載運算符復(fù)制和連接字符串C++語言程序設(shè)計39//使用重載運算符復(fù)制和連接字符串#include<string>#include<iostream>usingnamespacestd;voidmain(){strings1="Hello";
strings2="world";
strings3;
s3=s1; //字符串復(fù)制
cout<<s3<<endl;
s3=s1+s2; //字符串連接
cout<<s3<<endl;}運行結(jié)果:HelloHelloworld9.5運算符重載運算符重載的規(guī)則重載運算符時,運算符的運算順序和優(yōu)先級不變,操作數(shù)個數(shù)不變不能創(chuàng)造新的運算符,只能重載C++中已有的運算符,并且規(guī)定有6個運算符不能重載一般來講,重載后的運算符的功能應(yīng)當與運算符的實際意義相符C++語言程序設(shè)計40運算符含義.類屬關(guān)系運算符.*成員指針運算符::作用域運算符?:條件運算符#編譯預(yù)處理符號sizeof取數(shù)據(jù)類型的長度9.5運算符重載運算符重載有以下兩種形式:重載為類的成員函數(shù)形式為:函數(shù)類型operator運算符(形參表) {
函數(shù)體; }重載為類的友元函數(shù)形式為:函數(shù)類型operator運算符(形參表) {
函數(shù)體; }C++語言程序設(shè)計419.5運算符重載關(guān)于運算符重載的幾點說明函數(shù)類型指明了重載運算符的返回值類型,也就是運算結(jié)果類型operator是定義運算符重載的關(guān)鍵字“運算符”即要重載的運算符名稱注意:重載為成員函數(shù)對象本身就是其中的一個操作數(shù)形參表內(nèi)參數(shù)的數(shù)目比操作數(shù)的數(shù)目少一個重載為友元函數(shù)形參表內(nèi)參數(shù)的數(shù)目等同于操作數(shù)的數(shù)目必須要加上friend關(guān)鍵字C++語言程序設(shè)計42例:創(chuàng)建一個復(fù)數(shù)類,將+、?、+=運算符重載為成員函數(shù)9.5運算符重載C++語言程序設(shè)計43//創(chuàng)建一個復(fù)數(shù)類,將+、?、+=運算符重載為成員函數(shù)#include<iostream>#include<iomanip>usingnamespacestd;classcomplex{public:complex(doublereal=0,doubleimag=0):r(real),i(imag){}
complexoperator+(complex&);
//重載運算符的函數(shù)原型
complexoperator-(complex&);complex&operator+=(complex&);voidprint(){cout<<setiosflags(ios::showpos)<<r<<""<<i<<'i'<<endl;}private:doubler,i; };例:創(chuàng)建一個復(fù)數(shù)類,將+、?、+=運算符重載為成員函數(shù)9.5運算符重載C++語言程序設(shè)計44complexcomplex::operator+(complex&c) //重載“+”運算符{returncomplex(r+c.r,i+c.i);}complexcomplex::operator-(complex&c) //重載“-”運算符{returncomplex(r-c.r,i-c.i);}Complex&complex::operator+=(complex&c) //重載“+=”運算符{r+=c.r;i+=c.i;return*this;}例:創(chuàng)建一個復(fù)數(shù)類,將+、?、+=運算符重載為成員函數(shù)9.5運算符重載C++語言程序設(shè)計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)建一個復(fù)數(shù)類,將+、?、+=運算符重載為友元函數(shù)9.5運算符重載C++語言程序設(shè)計46//創(chuàng)建一個復(fù)數(shù)類,將+、?、+=運算符重載為成員函數(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)建一個復(fù)數(shù)類,將+、?、+=運算符重載為友元函數(shù)9.5運算符重載C++語言程序設(shè)計47complexoperator+(complex&c1,complex&c2) //重載“+”運算符{returncomplex(c1.r+c2.r,c1.i+c2.i);}complexoperator-(complex&c1,complex&c2) //重載“-”運算符{returncomplex(c1.r-c2.r,c1.i-c2.i);}complex&operator+=(complex&c1,complex&c2) //重載“+=”運算符{c1.r+=c2.r;c1.i+=c2.i;returnc1;}例:創(chuàng)建一個復(fù)數(shù)類,將+、?、+=運算符重載為友元函數(shù)9.5運算符重載C++語言程序設(shè)計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++語言程序設(shè)計49編程技能a(一)包含內(nèi)嵌對象的派生類構(gòu)造含內(nèi)嵌對象的派生類構(gòu)造函數(shù)的形式如下:派生類名::派生類名(基類所需的形參,本類成員所需的形參):基類1(基類參數(shù)表1),基類2(基類參數(shù)表2),…,基類n(基類參數(shù)表n),對象成員1(對象參數(shù)表1),對象成員2(對象參數(shù)表2),…,對象成員m(對
象參數(shù)表m){本類基本類型數(shù)據(jù)成員初始化;}C++語言程序設(shè)計50初始化列表(一)包含內(nèi)嵌對象的派生類構(gòu)造派生類構(gòu)造函數(shù)的形式參數(shù)表應(yīng)該提供3部分參數(shù)基類構(gòu)造函數(shù)形參表所需要的參數(shù)初始化派生類的內(nèi)嵌對象數(shù)據(jù)成員所需要的參數(shù)初始化派生類基本數(shù)據(jù)類型數(shù)據(jù)成員的參數(shù)C++語言程序設(shè)計51(一)包含內(nèi)嵌對象的派生類構(gòu)造例:派生類的構(gòu)造函數(shù)在復(fù)雜應(yīng)用中,既有類的派生,又有類的組合C++語言程序設(shè)計52(一)包含內(nèi)嵌對象的派生類構(gòu)造例:派生類的構(gòu)造函數(shù)數(shù)據(jù)類型名字反映出該數(shù)據(jù)類型的特征或者功能使用typedef關(guān)鍵字為某種數(shù)據(jù)類型重新起一個名字C++語言程序設(shè)計53//GlobalType910.h#pragmaonce //預(yù)處理指令,避免重復(fù)包含本頭文件typedefunsignedintuint;typedefunsignedcharuchar;(一)包含內(nèi)嵌對象的派生類構(gòu)造例:派生類的構(gòu)造函數(shù)類TColor普通構(gòu)造函數(shù)提供無參構(gòu)造函數(shù)賦值構(gòu)造函數(shù)重載的賦值運算符C++語言程序設(shè)計54(一)包含內(nèi)嵌對象的派生類構(gòu)造C++語言程序設(shè)計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); //重載賦值運算符
voidsetColor(ucharR,ucharG,ucharB);uchargetComponent(EColorComponentcomponent)const;};(一)包含內(nèi)嵌對象的派生類構(gòu)造C++語言程序設(shè)計56//TColor910.cpp#include"TColor910.h"TColor::TColor(ucharR/*=0x00*/, //普通構(gòu)造函數(shù)
ucharG/*=0x00*/,//類定義中函數(shù)原型是帶默認值的
ucharB/*=0x00*/){//這里不需要重復(fù)寫默認值
_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)嵌對象的派生類構(gòu)造C++語言程序設(shè)計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)嵌對象的派生類構(gòu)造C++語言程序設(shè)計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)嵌對象的派生類構(gòu)造例:派生類的構(gòu)造函數(shù)類TShape包含TColor類的對象有兩個重載的構(gòu)造函數(shù)兩個構(gòu)造函數(shù)都調(diào)用了TColor類的無參構(gòu)造函數(shù)第一個TShape構(gòu)造函數(shù)有2個參數(shù),用于給本類的基本數(shù)據(jù)類型成員賦值第二個TShape構(gòu)造函數(shù)有3個參數(shù),前兩個參數(shù)用于給本類的基本數(shù)據(jù)類型成員賦值,最后一個參數(shù)color用于給內(nèi)嵌的TColor類對象賦值C++語言程序設(shè)計59(一)包含內(nèi)嵌對象的派生類構(gòu)造C++語言程序設(shè)計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)嵌對象的派生類構(gòu)造C++語言程序設(shè)計61//TShape910.cpp#include"TShape910.h"#include"TColor910.h"#include<iostream>usingnamespacestd;TShape::TShape(uintx,uinty):_color(){//在初始化列表表初始化內(nèi)嵌對象
_x=x;_y=y;}TShape::TShape(uintx,uinty,TColorcolor){_x=x;_y=y;_color=color;//調(diào)用TColor類的賦值運算符重載函數(shù)}TShape::~TShape(){cout<<"TShapedestructed"<<endl;}(一)包含內(nèi)嵌對象的派生類構(gòu)造C++語言程序設(shè)計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)嵌對象的派生類構(gòu)造C++語言程序設(shè)計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)嵌對象的派生類構(gòu)造例:派生類的構(gòu)造函數(shù)TEllipse類由TShape類派生有兩個重載的構(gòu)造函數(shù)第一個TShape構(gòu)造函數(shù)有4個參數(shù),其中l(wèi)ongR和shortR兩個參數(shù)用于給本類的基本數(shù)據(jù)類型成員賦值,另外兩個形式參數(shù)用于初始化基類TShape的構(gòu)造函數(shù)第二個TShape構(gòu)造函數(shù)有5個參數(shù),其中l(wèi)ongR和shortR兩個參數(shù)用于給本類的基本數(shù)據(jù)類型成員賦值,另外兩個形式參數(shù)用于初始化基類TShape的構(gòu)造函數(shù),最后一個參數(shù)color用于給基類的保護數(shù)據(jù)成員_color賦值C++語言程序設(shè)計64(一)包含內(nèi)嵌對象的派生類構(gòu)造C++語言程序設(shè)計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)嵌對象的派生類構(gòu)造C++語言程序設(shè)計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ù)中訪問基類保護成員
_color=color;}TEllipse::TEllipse(uintlongR,uintshortR,uintx,uinty):TShape(x,y){_longR=longR;_shortR=shortR;}(一)包含內(nèi)嵌對象的派生類構(gòu)造C++語言程序設(shè)計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)嵌對象的派生類構(gòu)造C++語言程序設(shè)計68//TEllipse910.cppvoidTEllipse::Draw(){uintx,y;getXY(x,y);//調(diào)用基類公有函數(shù)訪問基類私有成員
uintR,G,B;//以下3行代碼直接訪問基類保護成員_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(";//下行代碼錯誤!在派生類中不能訪問基類私有成員
//cout<<_x<<","<<_y<<")";cout<<x<<","<<y<<")";cout<<",longR:"<<_longR<<"andshortR:"<<_shortR<<endl;}(一)包含內(nèi)嵌對象的派生類構(gòu)造C++語言程序設(shè)計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)嵌對象的派生類構(gòu)造C++語言程序設(shè)計7013.TEllipseelps02(10u,5u,20u,30u,TColor(0x00,0xFF,0x00));14.//通過派生類對象調(diào)用基類的同名函數(shù)15.cout<<__FILE__<<":"<<__LINE__<<"";elps02.TShape::Draw();16.cout<<__FILE__<<":"<<__LINE__<<"";elps02.Draw();17.//調(diào)用基類函數(shù)訪問基類保護成員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)嵌對象的派生類構(gòu)造編譯并運行后,其輸出結(jié)果如下C++語言程序設(shè)計71(一)包含內(nèi)嵌對象的派生類構(gòu)造派生類構(gòu)造函數(shù)總結(jié)職責(zé):初始化基類初始化內(nèi)嵌對象成員初始化基本數(shù)據(jù)類型的成員方式:構(gòu)造函數(shù)初始化列表:基類構(gòu)造函數(shù),內(nèi)嵌對象成員構(gòu)造函數(shù)構(gòu)造函數(shù)函數(shù)體:基本數(shù)據(jù)類型的成員特殊情況:const成員和reference成員只能通過初始化列表獲得初值若不需要做上述初始化工作,則可不定義構(gòu)造函數(shù),而使用系統(tǒng)提供的默認構(gòu)造函數(shù)C++語言程序設(shè)計72(一)包含內(nèi)嵌對象的派生類構(gòu)造派生類構(gòu)造函數(shù)總結(jié)派生類構(gòu)造函數(shù)的執(zhí)行次序:初始化列表
構(gòu)造函數(shù)函數(shù)體基類的構(gòu)造函數(shù)。內(nèi)嵌對象的構(gòu)造函數(shù)。派生類的構(gòu)造函數(shù)(即函數(shù)體中的代碼)若派生類構(gòu)造函數(shù)沒有顯式初始化基類或內(nèi)嵌對象成員,則編譯器會在初始化列表中自動插入基類默認構(gòu)造函數(shù)或內(nèi)嵌對象的默認構(gòu)造函數(shù)C++語言程序設(shè)計73多繼承時,基類構(gòu)造函數(shù)的調(diào)用順序:按照定義派生類時這些基類被繼承的順序與他們在初始化列表的次序無關(guān)派生類的多個對象成員的構(gòu)造函數(shù)的調(diào)用順序按照派生類定義這些成員的順序進行與他們在初始化列表中的先后次序無關(guān)(二)包含內(nèi)嵌對象的派生類析構(gòu)派生類不能繼承基類的析構(gòu)函數(shù),需要自己定義析構(gòu)函數(shù)職責(zé)
執(zhí)行對象的清理工作,例如清理位于堆區(qū)的成員、向其他對象發(fā)送消息等隱式調(diào)用派生類內(nèi)嵌對象的析構(gòu)函數(shù)(析構(gòu)內(nèi)嵌對象成員)
隱式調(diào)用基類析構(gòu)函數(shù)若無須執(zhí)行派生類對象的清理工作,則可不定義析構(gòu)函數(shù),而使用系統(tǒng)提供的默認析構(gòu)函數(shù)派生類析構(gòu)函數(shù)的執(zhí)行次序與構(gòu)造函數(shù)的執(zhí)行次序恰好相反C++語言程序設(shè)計74①派生類的析構(gòu)函數(shù)(即函數(shù)體中的代碼)②派生類內(nèi)嵌對象的析構(gòu)函數(shù)③基類的析構(gòu)函數(shù)例:包含內(nèi)嵌對象指針的派生類析構(gòu)函數(shù)(二)包含內(nèi)嵌對象的派生類析構(gòu)C++語言程序設(shè)計75//包含內(nèi)嵌對象指針的派生類析構(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)嵌對象指針的派生類析構(gòu)函數(shù)(二)包含內(nèi)嵌對象的派生類析構(gòu)C++語言程序設(shè)計76classTColor{private:string_color;public:TColor(stringcolor="BLACK"){cout<<"TColor構(gòu)造函數(shù)"<<endl;_color=color;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度貴陽商業(yè)地產(chǎn)買賣合同標的及交易條件6篇
- 礦井排水設(shè)施建設(shè)協(xié)議
- 二零二五年度住宅小區(qū)物業(yè)智能化改造及服務(wù)合同3篇
- 2025年度貨物供應(yīng)合同標的及詳細描述3篇
- 二零二五年度酒店與廣告公司合作宣傳合同2篇
- 二零二五年度紅酒進口清關(guān)代理服務(wù)協(xié)議2篇
- 虛擬現(xiàn)實在績效培訓(xùn)中的應(yīng)用-洞察分析
- 新聞采編一體化人才培養(yǎng)模式研究-洞察分析
- 2025年綠色環(huán)保別墅建造項目勞務(wù)分包合同43篇
- 飯店衛(wèi)生規(guī)范要求
- 檔案館查資料委托書
- 江門市廣雅中學(xué)2023-2024學(xué)年七年級下學(xué)期月考數(shù)學(xué)試題 (B卷)
- (正式版)JTT 1218.5-2024 城市軌道交通運營設(shè)備維修與更新技術(shù)規(guī)范 第5部分:通信
- 基于物聯(lián)網(wǎng)的智能衣柜
- 河北省唐山市路北區(qū)2024屆數(shù)學(xué)七年級上冊期末考試試題附答案
- 內(nèi)科學(xué)糖尿病腎病教案
- 外研版六年級英語下冊全冊單元測試卷含答案解析
- AI輔助傳染病早期預(yù)警系統(tǒng)
- 蘇教版三年級上冊解決問題的策略應(yīng)用題100題及答案
- 2024年湖南生物機電職業(yè)技術(shù)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- 鳥類監(jiān)測分析評估報告取費
評論
0/150
提交評論