計算機軟件及應(yīng)用c++課件_第1頁
計算機軟件及應(yīng)用c++課件_第2頁
計算機軟件及應(yīng)用c++課件_第3頁
計算機軟件及應(yīng)用c++課件_第4頁
計算機軟件及應(yīng)用c++課件_第5頁
已閱讀5頁,還剩187頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第四章類與對象C++語言程序設(shè)計清華大學(xué)鄭莉第四章類與對象C++語言程序設(shè)計清華大學(xué)鄭莉2本章主要內(nèi)容面向?qū)ο蟮乃枷隣OP的基本特點類概念和聲明對象構(gòu)造函數(shù)析構(gòu)函數(shù)內(nèi)聯(lián)成員函數(shù)拷貝構(gòu)造函數(shù)類的組合結(jié)構(gòu)體與聯(lián)合體深度探索2本章主要內(nèi)容面向?qū)ο蟮乃枷雰?nèi)聯(lián)成員函數(shù)3回顧:面向過程的設(shè)計方法重點:如何實現(xiàn)的細節(jié)和過程,將數(shù)據(jù)與函數(shù)分開。形式:主模塊+若干個子模塊(main()+子函數(shù))。特點:自頂向下,逐步求精——功能分解。缺點:效率低,程序的可重用性差。面向?qū)ο蟮乃枷?回顧:面向過程的設(shè)計方法重點:面向?qū)ο蟮乃枷?面向?qū)ο蟮姆椒康模簩崿F(xiàn)軟件設(shè)計的產(chǎn)業(yè)化。觀點:自然界是由實體(對象)所組成。程序設(shè)計方法:使用面向?qū)ο蟮挠^點來描述模仿并處理現(xiàn)實問題。要求:高度概括、分類、和抽象。面向?qū)ο蟮乃枷?面向?qū)ο蟮姆椒康模好嫦驅(qū)ο蟮乃枷?抽象抽象是對具體對象(問題)進行概括,抽出這一類對象的公共性質(zhì)并加以描述的過程。先注意問題的本質(zhì)及描述,其次是實現(xiàn)過程或細節(jié)。數(shù)據(jù)抽象:描述某類對象的屬性或狀態(tài)(對象相互區(qū)別的物理量)。代碼抽象:描述某類對象的共有的行為特征或具有的功能。抽象的實現(xiàn):通過類的聲明。OOP的基本特點5抽象抽象是對具體對象(問題)進行概括,抽出這一類對象的公共6抽象實例——鐘表數(shù)據(jù)抽象:inthour,intminute,intsecond代碼抽象:setTime(),showTime()OOP的基本特點6抽象實例——鐘表數(shù)據(jù)抽象:OOP的基本特點7抽象實例——鐘表類classClock{

public:voidsetTime(intnewH,intnewM,intnewS);

voidshowTime();

private:inthour,minute,second;};OOP的基本特點7抽象實例——鐘表類classClock{OOP的基本8抽象實例——人數(shù)據(jù)抽象:stringname,stringgender,intage,intid代碼抽象:生物屬性角度:

getCloth(),eat(),step(),…社會屬性角度:

work(),promote(),…OOP的基本特點8抽象實例——人數(shù)據(jù)抽象:OOP的基本特點9封裝將抽象出的數(shù)據(jù)成員、代碼成員相結(jié)合,將它們視為一個整體。目的是曾強安全性和簡化編程,使用者不必了解具體的實現(xiàn)細節(jié),而只需要通過外部接口,以特定的訪問權(quán)限,來使用類的成員。實現(xiàn)封裝:類聲明中的{}OOP的基本特點9封裝將抽象出的數(shù)據(jù)成員、代碼成員相結(jié)合,將它們視為一個整體10封裝實例:classClock{

public:voidsetTime(intnewH,intnewM,intnewS);

voidshowTime();

private:inthour,minute,second;};邊界特定的訪問權(quán)限OOP的基本特點外部接口10封裝實例:邊界特定的訪問權(quán)限OOP的基本特點外部接口11繼承與派生是C++中支持層次分類的一種機制,允許程序員在保持原有類特性的基礎(chǔ)上,進行更具體的說明。實現(xiàn):聲明派生類——見第7章OOP的基本特點11繼承與派生是C++中支持層次分類的一種機制,允許程序員在12多態(tài)性多態(tài):同一名稱,不同的功能實現(xiàn)方式。目的:達到行為標識統(tǒng)一,減少程序中標識符的個數(shù)。實現(xiàn):重載函數(shù)和虛函數(shù)——見第8章OOP的基本特點12多態(tài)性多態(tài):同一名稱,不同的功能實現(xiàn)方式。OOP的基本特13c++中的類類是具有相同屬性和行為的一組對象的集合,它為屬于該類的全部對象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和行為兩個主要部分。利用類可以實現(xiàn)數(shù)據(jù)的封裝、隱藏、繼承與派生。利用類易于編寫大型復(fù)雜程序,其模塊化程度比C中采用函數(shù)更高。類和對象13c++中的類類是具有相同屬性和行為的一組對象的集合,它為14類的聲明形式

類是一種用戶自定義類型,聲明形式:class類名稱{

public:

公有成員(外部接口)

private:

私有成員

protected:

保護型成員}類和對象14類的聲明形式類是一種用戶自定義類型,聲明形式:類和15公有類型成員在關(guān)鍵字public后面聲明,它們是類與外部的接口,任何外部函數(shù)都可以訪問公有類型數(shù)據(jù)和函數(shù)。類和對象15公有類型成員在關(guān)鍵字public后面聲明,它們是類與外部16私有類型成員在關(guān)鍵字private后面聲明,只允許本類中的函數(shù)訪問,而類外部的任何函數(shù)都不能訪問。如果緊跟在類名稱的后面聲明私有成員,則關(guān)鍵字private可以省略。類和對象16私有類型成員在關(guān)鍵字private后面聲明,只允許本類中17保護類型與private類似,其差別表現(xiàn)在繼承與派生時對派生類的影響不同,第七章講。類和對象17保護類型與private類似,其差別表現(xiàn)在繼承與派生時對18類的成員classclock{public:

voidsetTime(intnewH,intnewM,intnewS);

voidshowTime();private:inthour,hinute,second;};類和對象成員數(shù)據(jù)成員函數(shù)18類的成員classclock{類和對象成員數(shù)據(jù)voidClock::setTime(intnewH,intnewM, intnewS){hour=newH;minute=newM;second=newS;}voidClock::showTime(){cout<<hour<<":"<<minute<<":"<< second;}19voidClock::setTime(intnewH,20成員數(shù)據(jù)與一般的變量聲明相同,但需要將它放在類的聲明體中。類和對象20成員數(shù)據(jù)與一般的變量聲明相同,但需要將它放在類的聲明體中21成員函數(shù)在類中說明原型,可以在類外給出函數(shù)體實現(xiàn),并在函數(shù)名前使用類名加以限定。也可以直接在類中給出函數(shù)體,形成內(nèi)聯(lián)成員函數(shù)。允許聲明重載函數(shù)和帶默認形參值的函數(shù)類和對象21成員函數(shù)在類中說明原型,可以在類外給出函數(shù)體實現(xiàn),并在函22內(nèi)聯(lián)成員函數(shù)為了提高運行時的效率,對于較簡單的函數(shù)可以聲明為內(nèi)聯(lián)形式。內(nèi)聯(lián)函數(shù)體中不要有復(fù)雜結(jié)構(gòu)(如循環(huán)語句和switch語句)。在類中聲明內(nèi)聯(lián)成員函數(shù)的方式:將函數(shù)體放在類的聲明中。使用inline關(guān)鍵字。類和對象22內(nèi)聯(lián)成員函數(shù)為了提高運行時的效率,對于較簡單的函數(shù)可以聲23內(nèi)聯(lián)成員函數(shù)舉例(一)classPoint{public:voidinit(intinitX,intinitY){x=initX;y=initY;}intgetX(){returnx;}intgetY(){returny;}private:intx,y;};類和對象23內(nèi)聯(lián)成員函數(shù)舉例(一)classPoint{類和24內(nèi)聯(lián)成員函數(shù)舉例(二)classPoint{public:voidinit(intinitX,intinitY);intgetX();

intgetY();

private:intx,y;};類和對象24內(nèi)聯(lián)成員函數(shù)舉例(二)classPoint{類和inlinevoidPoint::

init(intinitX,intinitY){x=initX;y=initY;}inlineintPoint::getX(){returnx;}inlineintPoint::GetY(){returny;}25inlinevoidPoint::

i26對象類的對象是該類的某一特定實體,即類類型的變量。聲明形式:

類名對象名;例:

ClockmyClock;類和對象26對象類的對象是該類的某一特定實體,即類類型的變量。類和27類中成員的訪問方式類中成員互訪直接使用成員名類外訪問使用“對象名.成員名”方式訪問

public

屬性的成員類和對象27類中成員的訪問方式類中成員互訪類和對象28例4-1類的應(yīng)用舉例#include<iostream>usingnamespacestd;classClock{......//類的聲明略}//......類的實現(xiàn)略intmain(){ ClockmyClock; myClock.setTime(8,30,30); myClock.showTime(); return0;}類和對象28例4-1類的應(yīng)用舉例#include<iostream>29構(gòu)造函數(shù)構(gòu)造函數(shù)的作用是在對象被創(chuàng)建時使用特定的值構(gòu)造對象,或者說將對象初始化為一個特定的狀態(tài)。在對象創(chuàng)建時由系統(tǒng)自動調(diào)用。如果程序中未聲明,則系統(tǒng)自動產(chǎn)生出一個隱含的參數(shù)列表為空的構(gòu)造函數(shù)允許為內(nèi)聯(lián)函數(shù)、重載函數(shù)、帶默認形參值的函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)29構(gòu)造函數(shù)構(gòu)造函數(shù)的作用是在對象被創(chuàng)建時使用特定的值構(gòu)造對30構(gòu)造函數(shù)舉例classClock{public:

Clock(intnewH,intnewM,intnewS);//構(gòu)造函數(shù)

voidsetTime(intnewH,intnewM,intnewS); voidshowTime();private: inthour,minute,second;};構(gòu)造函數(shù)和析構(gòu)函數(shù)30構(gòu)造函數(shù)舉例classClock{構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)的實現(xiàn):Clock::Clock(intnewH,intnewM,intnewS){ hour=newH; minute=newM; second=newS;}建立對象時構(gòu)造函數(shù)的作用:intmain(){

Clockc(0,0,0);//隱含調(diào)用構(gòu)造函數(shù),將初始值作為實參。

c.showTime(); return0;}31構(gòu)造函數(shù)的實現(xiàn):3132拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),其形參為本類的對象引用。class類名{public:

類名(形參);//構(gòu)造函數(shù)類名(類名&對象名);//拷貝構(gòu)造函數(shù)

...};類名::類(類名&對象名)//拷貝構(gòu)造函數(shù)的實現(xiàn){函數(shù)體}構(gòu)造函數(shù)和析構(gòu)函數(shù)32拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),其形參為本33拷貝構(gòu)造函數(shù)(例4-2)classPoint{public: Point(intxx=0,intyy=0){x=xx;y=yy;} Point(Point&p); intgetX(){returnx;} intgetY(){returny;}private: intx,y;};構(gòu)造函數(shù)和析構(gòu)函數(shù)33拷貝構(gòu)造函數(shù)(例4-2)classPoint{構(gòu)造函Point::Point(Point&p){x=p.x;y=p.y;cout<<"Callingthecopyconstructor" <<endl;}34Point::Point(Point&p){3435拷貝構(gòu)造函數(shù)(例4-2)當用類的一個對象去初始化該類的另一個對象時系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(shù)實現(xiàn)拷貝賦值。intmain(){Pointa(1,2);Pointb=a;//拷貝構(gòu)造函數(shù)被調(diào)用cout<<b.getX()<<endl;}構(gòu)造函數(shù)和析構(gòu)函數(shù)35拷貝構(gòu)造函數(shù)(例4-2)當用類的一個對象去初始化該類的另36拷貝構(gòu)造函數(shù)(例4-2)若函數(shù)的形參為類對象,調(diào)用函數(shù)時,實參賦值給形參,系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(shù)。例如:voidfun1(Pointp){cout<<p.getX()<<endl;}intmain(){Pointa(1,2);fun1(a);//調(diào)用拷貝構(gòu)造函數(shù)

return0;}構(gòu)造函數(shù)和析構(gòu)函數(shù)36拷貝構(gòu)造函數(shù)(例4-2)若函數(shù)的形參為類對象,調(diào)用函數(shù)時37拷貝構(gòu)造函數(shù)(例4-2)當函數(shù)的返回值是類對象時,系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(shù)。例如:Pointfun2(){Pointa(1,2);returna;//調(diào)用拷貝構(gòu)造函數(shù)}intmain(){Pointb;b=fun2();return0;}構(gòu)造函數(shù)和析構(gòu)函數(shù)37拷貝構(gòu)造函數(shù)(例4-2)當函數(shù)的返回值是類對象時,系統(tǒng)自38隱含的拷貝構(gòu)造函數(shù)如果程序員沒有為類聲明拷貝初始化構(gòu)造函數(shù),則編譯器自己生成一個隱含的拷貝構(gòu)造函數(shù)。這個構(gòu)造函數(shù)執(zhí)行的功能是:用作為初始值的對象的每個數(shù)據(jù)成員的值,初始化將要建立的對象的對應(yīng)數(shù)據(jù)成員。構(gòu)造函數(shù)和析構(gòu)函數(shù)38隱含的拷貝構(gòu)造函數(shù)如果程序員沒有為類聲明拷貝初始化構(gòu)造函39析構(gòu)函數(shù)完成對象被刪除前的一些清理工作。在對象的生存期結(jié)束的時刻系統(tǒng)自動調(diào)用它,然后再釋放此對象所屬的空間。如果程序中未聲明析構(gòu)函數(shù),編譯器將自動產(chǎn)生一個隱含的析構(gòu)函數(shù)。構(gòu)造函數(shù)和析構(gòu)函數(shù)39析構(gòu)函數(shù)完成對象被刪除前的一些清理工作。構(gòu)造函數(shù)和析構(gòu)函40構(gòu)造函數(shù)和析構(gòu)函數(shù)舉例#include<iostream>usingnamespacestd;classPoint{public:Point(intxx,intyy);~Point();//...其他函數(shù)原型private:intx,y;};構(gòu)造函數(shù)和析構(gòu)函數(shù)40構(gòu)造函數(shù)和析構(gòu)函數(shù)舉例#include<iostreaPoint::Point(intxx,intyy){x=xx;y=yy;}Point::~Point(){}//...其他函數(shù)的實現(xiàn)略41Point::Point(intxx,intyy){442類的應(yīng)用舉例(例4-3)一圓形游泳池如圖所示,現(xiàn)在需在其周圍建一圓形過道,并在其四周圍上柵欄。柵欄價格為35元/米,過道造價為20元/平方米。過道寬度為3米,游泳池半徑由鍵盤輸入。要求編程計算并輸出過道和柵欄的造價。游泳池過道42類的應(yīng)用舉例(例4-3)一圓形游泳池如圖所示,現(xiàn)在需在其#include<iostream>usingnamespacestd;constfloatPI=3.141593; //給出p的值constfloatFENCE_PRICE=35; //柵欄的單價constfloatCONCRETE_PRICE=20;//過道水泥單價classCircle{ //聲明定義類Circle及其數(shù)據(jù)和方法public: //外部接口

Circle(floatr); //構(gòu)造函數(shù)

floatcircumference(); //計算圓的周長

floatarea(); //計算圓的面積private: //私有數(shù)據(jù)成員

floatradius; //圓半徑};43#include<iostream>43//類的實現(xiàn)//構(gòu)造函數(shù)初始化數(shù)據(jù)成員radiusCircle::Circle(floatr){ radius=r;} //計算圓的周長floatCircle::circumference(){return2*PI*radius;}//計算圓的面積floatCircle::area(){returnPI*radius*radius;}44//類的實現(xiàn)44intmain(){ floatradius; cout<<"Entertheradiusofthepool:"; //提示用戶輸入半徑

cin>>radius;

Circlepool(radius); //游泳池邊界

CirclepoolRim(radius+3); //柵欄

//計算柵欄造價并輸出

floatfenceCost=poolRim.circumference()*FENCE_PRICE;cout<<"FencingCostis$"<<fenceCost<<endl;45intmain(){45

//計算過道造價并輸出

floatconcreteCost=(poolRim.area()-pool.area())*CONCRETE_PRICE; cout<<"ConcreteCostis$"<<concreteCost<<endl; return0;}運行結(jié)果Entertheradiusofthepool:10FencingCostis$2858.85ConcreteCostis$4335.446 //計算過道造價并輸出4647組合的概念類中的成員數(shù)據(jù)是另一個類的對象??梢栽谝延谐橄蟮幕A(chǔ)上實現(xiàn)更復(fù)雜的抽象。類的組合47組合的概念類中的成員數(shù)據(jù)是另一個類的對象。類的組合48舉例classPoint{private:floatx,y;//點的坐標public:Point(floath,floatv);//構(gòu)造函數(shù)

floatgetX();//取X坐標floatgetY();//取Y坐標

voiddraw();//在(x,y)處畫點};//...函數(shù)的實現(xiàn)略類的組合48舉例classPoint{類的組合classLine{private:Pointp1,p2;//線段的兩個端點public:Line(Pointa,Pointb);//構(gòu)造函數(shù)

voiddraw(void);//畫出線段};//...函數(shù)的實現(xiàn)略49classLine{4950類組合的構(gòu)造函數(shù)設(shè)計原則:不僅要負責對本類中的基本類型成員數(shù)據(jù)賦初值,也要對對象成員初始化。聲明形式:類名::類名(對象成員所需的形參,本類成員形參):對象1(參數(shù)),對象2(參數(shù)),......{本類初始化}類的組合50類組合的構(gòu)造函數(shù)設(shè)計原則:不僅要負責對本類中的基本類型成51類組合的構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)調(diào)用順序:先調(diào)用內(nèi)嵌對象的構(gòu)造函數(shù)(按內(nèi)嵌時的聲明順序,先聲明者先構(gòu)造)。然后調(diào)用本類的構(gòu)造函數(shù)。(析構(gòu)函數(shù)的調(diào)用順序相反)初始化列表中未出現(xiàn)的內(nèi)嵌對象,用默認構(gòu)造函數(shù)(即無形參的)初始化系統(tǒng)自動生成的隱含的默認構(gòu)造函數(shù)中,內(nèi)嵌對象全部用默認構(gòu)造函數(shù)初始化類的組合51類組合的構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)調(diào)用順序:先調(diào)用內(nèi)嵌對象的構(gòu)52類的組合舉例(二)classPart{//部件類public:Part();Part(inti);~Part();voidPrint();private:intval;};類的組合52類的組合舉例(二)classPart{//部件類類classWhole{public:Whole();Whole(inti,intj,intk);~Whole();voidPrint();private:Partone;Parttwo;intdate;};53classWhole{53Whole::Whole(){date=0;}Whole::Whole(inti,intj,intk):two(i),one(j),date(k){}//...其他函數(shù)的實現(xiàn)略54Whole::Whole(){5455前向引用聲明類應(yīng)該先聲明,后使用如果需要在某個類的聲明之前,引用該類,則應(yīng)進行前向引用聲明。前向引用聲明只為程序引入一個標識符,但具體聲明在其他地方。類的組合55前向引用聲明類應(yīng)該先聲明,后使用類的組合56前向引用聲明舉例classB;//前向引用聲明classA{public:voidf(Bb);};classB{public:voidg(Aa);};類的組合56前向引用聲明舉例classB;//前向引用聲明類57前向引用聲明注意事項使用前向引用聲明雖然可以解決一些問題,但它并不是萬能的。需要注意的是,盡管使用了前向引用聲明,但是在提供一個完整的類聲明之前,不能聲明該類的對象,也不能在內(nèi)聯(lián)成員函數(shù)中使用該類的對象。請看下面的程序段:classFred;//前向引用聲明classBarney{Fredx;//錯誤:類Fred的聲明尚不完善};classFred{Barneyy;};類的組合57前向引用聲明注意事項使用前向引用聲明雖然可以解決一些問題58前向引用聲明注意事項classFred; //前向引用聲明

classBarney{public:……voidmethod(){x.yabbaDabbaDo(); //錯誤:Fred類的對象在定義之前被使用

}private:Fred&x;//正確,經(jīng)過前向引用聲明,可以聲明Fred類的對象引用};

classFred{public:voidyabbaDabbaDo();private:Barney&y;};類的組合58前向引用聲明注意事項classFred; //前向引用59前向引用聲明注意事項應(yīng)該記?。寒斈闶褂们跋蛞寐暶鲿r,你只能使用被聲明的符號,而不能涉及類的任何細節(jié)。類的組合59前向引用聲明注意事項應(yīng)該記住:當你使用前向引用聲明時,你60UML簡介UML語言是一種可視化的的面向?qū)ο蠼UZ言。UML有三個基本的部分事物(Things)

UML中重要的組成部分,在模型中屬于最靜態(tài)的部分,代表概念上的或物理上的元素關(guān)系(Relationships)

關(guān)系把事物緊密聯(lián)系在一起圖(Diagrams)

圖是很多有相互相關(guān)的事物的組UML圖形標識60UML簡介UML語言是一種可視化的的面向?qū)ο蠼UZ言。U61UML中有4種類型的事物結(jié)構(gòu)事物(Structuralthings)動作事物(Behavioralthings)分組事物(Groupingthings)注釋事物(Annotationalthings)UML圖形標識61UML中有4種類型的事物結(jié)構(gòu)事物(Structural62UML中的關(guān)系依賴(Dependencies)關(guān)聯(lián)(Association)泛化(Generalization)實現(xiàn)(Realization)UML圖形標識62UML中的關(guān)系依賴(Dependencies)U63UML中的9種圖類圖(Classdiagram)對象圖(Objectdiagram)用例圖(Usecasediagram)順序圖(Sequencediagram)協(xié)作圖(Collaborationdiagram)狀態(tài)圖(Statechartdiagram)活動圖(Activitydiagram)組件圖(Componentdiagram)實施圖(Deploymentdiagram)UML圖形標識63UML中的9種圖類圖(Classdiagram)UML64類圖舉例:Clock類的完整表示Clock類的簡潔表示Clock-hour:int-minute:int-second:int+showTime():void+setTime(newH:int=0,newM:int=0,newS:int=0):voidClockUML圖形標識64類圖舉例:Clock類的完整表示Clock-hour65對象圖myClock:Clock-hour:int-minute:int-second:intmyClock:ClockUML圖形標識65對象圖myClock:Clock-hour:i66類與對象關(guān)系的圖形標識依賴關(guān)系圖中的“類A”是源,“類B”是目標,表示“類A”使用了“類B”,或稱“類A”依賴“類B”類A類BUML圖形標識66類與對象關(guān)系的圖形標識依賴關(guān)系類A類BUML圖形標識67類與對象關(guān)系的圖形標識作用關(guān)系——關(guān)聯(lián)圖中的“重數(shù)A”決定了類B的每個對象與類A的多少個對象發(fā)生作用,同樣“重數(shù)B”決定了類A的每個對象與類B的多少個對象發(fā)生作用。類A重數(shù)A類B重數(shù)BUML圖形標識67類與對象關(guān)系的圖形標識作用關(guān)系——關(guān)聯(lián)類A重數(shù)A類B68類與對象關(guān)系的圖形標識包含關(guān)系——聚集和組合類A類B重數(shù)A重數(shù)B類A類B重數(shù)A重數(shù)B聚集表示類之間的關(guān)系是整體與部分的關(guān)系,“包含”、“組成”、“分為……部分”等都是聚集關(guān)系。UML圖形標識68類與對象關(guān)系的圖形標識包含關(guān)系——聚集和組合類A類B69類與對象關(guān)系的圖形標識繼承關(guān)系——泛化父類A父類B子類1子類2UML圖形標識69類與對象關(guān)系的圖形標識繼承關(guān)系——泛化父類A父類B子70注釋在UML圖形上,注釋表示為帶有褶角的矩形,然后用虛線連接到UML的其他元素上,它是一種用于在圖中附加文字注釋的機制。注釋文字UML圖形標識70注釋在UML圖形上,注釋表示為帶有褶角的矩形,然后用虛線結(jié)構(gòu)體結(jié)構(gòu)體是一種特殊形態(tài)的類與類的唯一區(qū)別:類的缺省訪問權(quán)限是private,結(jié)構(gòu)體的缺省訪問權(quán)限是public結(jié)構(gòu)體存在的主要原因:與C語言保持兼容什么時候用結(jié)構(gòu)體而不用類定義主要用來保存數(shù)據(jù)、而沒有什么操作的類型人們習慣將結(jié)構(gòu)體的數(shù)據(jù)成員設(shè)為公有,因此這時用結(jié)構(gòu)體更方便71結(jié)構(gòu)體與聯(lián)合體結(jié)構(gòu)體結(jié)構(gòu)體是一種特殊形態(tài)的類71結(jié)構(gòu)體與聯(lián)合體結(jié)構(gòu)體的定義和初始化結(jié)構(gòu)體定義struct結(jié)構(gòu)體名稱{

公有成員protected:

保護型成員private:

私有成員};一些結(jié)構(gòu)體變量的初始化可以用以下形式類型名變量名

={成員數(shù)據(jù)1初值,成員數(shù)據(jù)2初值,……};72結(jié)構(gòu)體與聯(lián)合體結(jié)構(gòu)體的定義和初始化結(jié)構(gòu)體定義72結(jié)構(gòu)體與聯(lián)合體結(jié)構(gòu)體舉例(例4-7)#include<iostream>#include<iomanip>#include<string>usingnamespacestd;structStudent{ //學(xué)生信息結(jié)構(gòu)體

intnum; //學(xué)號

stringname; //姓名,字符串對象,將在第6章詳細介紹

charsex; //性別

intage; //年齡};73結(jié)構(gòu)體與聯(lián)合體結(jié)構(gòu)體舉例(例4-7)#include<iostream>結(jié)構(gòu)體舉例(例4-7)intmain(){ Studentstu={97001,"LinLin",'F',19}; cout<<"Num:"<<stu.num<<endl; cout<<"Name:"<<<<endl; cout<<"Sex:"<<stu.sex<<endl; cout<<"Age:"<<stu.age<<endl; return0;}運行結(jié)果:Num:97001Name:LinLinSex:FAge:1974結(jié)構(gòu)體與聯(lián)合體結(jié)構(gòu)體舉例(例4-7)intmain(){74結(jié)構(gòu)體與聯(lián)聯(lián)合體聲明形式union聯(lián)合體名稱{公有成員protected:

保護型成員private:

私有成員};特點:成員共用相同的內(nèi)存單元任何兩個成員不會同時有效75結(jié)構(gòu)體與聯(lián)合體聯(lián)合體聲明形式75結(jié)構(gòu)體與聯(lián)合體聯(lián)合體的內(nèi)存分配unionMark{ //表示成績的聯(lián)合體 chargrade; //等級制的成績

boolpass; //只記是否通過課程的成績

intpercent; //百分制的成績};76Markgradepercentpass結(jié)構(gòu)體與聯(lián)合體聯(lián)合體的內(nèi)存分配unionMark{ //表示成績的聯(lián)合77無名聯(lián)合無名聯(lián)合沒有標記名,只是聲明一個成員項的集合,這些成員項具有相同的內(nèi)存地址,可以由成員項的名字直接訪問。例:union{inti;floatf;}在程序中可以這樣使用:i=10;f=2.2;結(jié)構(gòu)體與聯(lián)合體77無名聯(lián)合無名聯(lián)合沒有標記名,只是聲明一個成員項的集合,這聯(lián)合體舉例(例4-8)#include<string>#include<iostream>usingnamespacestd;classExamInfo{private: stringname; //課程名稱

enum{GRADE,PASS,PERCENTAGE}mode;//采用何種計分方式

union{ chargrade; //等級制的成績

boolpass; //只記是否通過課程的成績

intpercent; //百分制的成績

};78結(jié)構(gòu)體與聯(lián)合體聯(lián)合體舉例(例4-8)#include<string>78聯(lián)合體舉例(例4-8)public: //三種構(gòu)造函數(shù),分別用等級、是否通過和百分初始化

ExamInfo(stringname,chargrade) :name(name),mode(GRADE),grade(grade){} ExamInfo(stringname,boolpass) :name(name),mode(PASS),pass(pass){} ExamInfo(stringname,intpercent) :name(name),mode(PERCENTAGE),percent(percent){} voidshow();}79結(jié)構(gòu)體與聯(lián)合體聯(lián)合體舉例(例4-8)public:79結(jié)構(gòu)體與聯(lián)合體聯(lián)合體舉例(例4-8)voidExamInfo::show(){ cout<<name<<":"; switch(mode){ caseGRADE:cout<<grade;break; casePASS:cout<<(pass?"PASS":"FAIL");break; casePERCENTAGE:cout<<percent;break; } cout<<endl;}80結(jié)構(gòu)體與聯(lián)合體聯(lián)合體舉例(例4-8)voidExamInfo::show聯(lián)合體舉例(例4-8)intmain(){ ExamInfocourse1("English",'B'); ExamInfocourse2("Calculus",true); ExamInfocourse3("C++Programming",85); course1.show(); course2.show(); course3.show(); return0;}運行結(jié)果:English:BCalculus:PASSC++Programming:8581結(jié)構(gòu)體與聯(lián)合體聯(lián)合體舉例(例4-8)intmain(){81結(jié)構(gòu)體與聯(lián)位域位域的聲明形式

數(shù)據(jù)類型說明符成員名

:位數(shù);位域的作用通過“打包”,使類的不同成員共享相同的字節(jié),從而節(jié)省存儲空間。注意事項具體的打包方式,因編譯器而異;只有bool、char、int和枚舉類型的成員,允許定義為位域;節(jié)省空間,但可能增加時間開銷。82深度探索位域位域的聲明形式82深度探索例4-9設(shè)計一個結(jié)構(gòu)體存儲學(xué)生的成績信息,需要包括學(xué)號、年級和成績?nèi)梼?nèi)容,學(xué)號的范圍是0到99,999,999,年級分為freshman、sophomore、junior、senior四種,成績包括A、B、C、D四個等級。83深度探索例4-9設(shè)計一個結(jié)構(gòu)體存儲學(xué)生的成績信息,需要包括學(xué)號、年級例4-9#include<iostream>usingnamespacestd;enumLevel{FRESHMAN,SOPHOMORE,JUNIOR,SENIOR};enumGrade{A,B,C,D};classStudent{public: Student(unsignednumber,Levellevel,Gradegrade) :number(number),level(level),grade(grade){} voidshow();private: unsignednumber:27; Levellevel:2; Gradegrade:2;};84深度探索例4-9#include<iostream>84深度探例4-9voidStudent::show(){ cout<<"Number:"<<number<<endl; cout<<"Level:"; switch(level){ caseFRESHMAN:cout<<"freshman";break; caseSOPHOMORE:cout<<"sophomore";break; caseJUNIOR:cout<<"junior";break; caseSENIOR:cout<<"senior";break; } cout<<endl; cout<<"Grade:"; switch(grade){ caseA:cout<<"A";break; caseB:cout<<"B";break; caseC:cout<<"C";break; caseD:cout<<"D";break; } cout<<endl;}85深度探索例4-9voidStudent::show(){85深例4-9intmain(){ Students(12345678,SOPHOMORE,B); cout<<"SizeofStudent:"<<sizeof(Student)<<endl; s.show(); return0;}運行結(jié)果:(運行結(jié)果第一行會因編譯環(huán)境的不同而有所差異)SizeofStudent:4Number:12345678Level:sophomoreGrade:B86深度探索例4-9intmain(){86深度探索臨時對象與類型轉(zhuǎn)換(例4-2中Point構(gòu)造函數(shù):Point(intxx=0,intyy=0))臨時對象的顯式創(chuàng)建可以直接調(diào)用類的構(gòu)造函數(shù)顯式創(chuàng)建臨時對象例:Linex(Point(1,1),Point(4,5));臨時對象到表達式執(zhí)行完畢后即銷毀單參數(shù)構(gòu)造函數(shù)可以設(shè)立類型轉(zhuǎn)換Point(1)表示創(chuàng)建一個臨時對象,同時也表示顯式類型轉(zhuǎn)換與Point(1)等價的形式:(Point)1static_cast<Point>(1)無論形式為何,執(zhí)行轉(zhuǎn)換時都會創(chuàng)建臨時對象87深度探索臨時對象與類型轉(zhuǎn)換(例4-2中Point構(gòu)造函數(shù):Poin隱含轉(zhuǎn)換由構(gòu)造函數(shù)確立的類型轉(zhuǎn)換,可以隱含執(zhí)行例:Linex(1,4);效果:構(gòu)造以(1,0)和(4,0)兩坐標為端點的線段,這里Point的構(gòu)造函數(shù)被隱含調(diào)用避免隱含轉(zhuǎn)換的發(fā)生在構(gòu)造函數(shù)中使用explicit關(guān)鍵字,explicit要寫在類定義中的構(gòu)造函數(shù)前88深度探索隱含轉(zhuǎn)換由構(gòu)造函數(shù)確立的類型轉(zhuǎn)換,可以隱含執(zhí)行88深度探例4-10#include<iostream>usingnamespacestd;classComplex{//復(fù)數(shù)類private:

floatreal,imag; //復(fù)數(shù)的實部和虛部public://構(gòu)造函數(shù),可以當作隱式類型轉(zhuǎn)換使用

Complex(floatreal=0,floatimag=0):real(real),imag(imag){}

Complexadd(Complexc){ //復(fù)數(shù)加法,生成臨時對象并返回

returnComplex(real+c.real,imag+c.imag);}

Complexsub(Complexc){ //復(fù)數(shù)減法,生成臨時對象并返回returnComplex(real-c.real,imag-c.imag);}Complexmul(Complexc){ //復(fù)數(shù)乘法,生成臨時對象并返回

returnComplex(real*c.real-imag*c.imag,real*c.imag+imag*c.real);}89深度探索例4-10#include<iostream>89深度例4-10voidshow(){//顯示復(fù)數(shù)if(imag>=0)cout<<real<<"+"<<imag<<'i'<<endl;elsecout<<real<<"-"<<-imag<<'i'<<endl;}};intmain(){ Complexz(1,2); //z=1+2i z.add(Complex(3,4)).show(); //Complex(3,4)是臨時對象 static_cast<Complex>(5).sub(z).show();//輸出5–z,使用了顯示類型轉(zhuǎn)換

z.mul(-3.0f).show();//輸出z*(-3),使用了隱含類型轉(zhuǎn)換 return0;}運行結(jié)果:4+6i4-2i-3-6i90深度探索例4-10voidshow(){//顯示復(fù)數(shù)90成員函數(shù)的調(diào)用成員函數(shù)調(diào)用的實現(xiàn)機制問題的關(guān)鍵:如何傳遞調(diào)用的目的對象解決辦法:把目的對象的引用當作參數(shù)傳遞91voidClock::setTime(intnewH,intnewM,intnewS){hour=newH;minute=newM;second=newS;}voidClock_setTime(_Clock&_this,intnewH,intnewM,intnewS){_this.hour=newH;_this.minute=newM;_this.second=newS;}Clock_setTime(myClock,8,30,30);myClock.setTime(8,30,30);深度探索成員函數(shù)的調(diào)用成員函數(shù)調(diào)用的實現(xiàn)機制91voidClock構(gòu)造函數(shù)的調(diào)用92Line::Line(Pointxp1,Pointxp2):p1(xp1),p2(xp2){doublex=p1.getX()-p2.getX();doubley=p1.getY()-p2.getY();len=sqrt(x*x+y*y);}voidLine_Line(_Line&_this,_Pointxp1,_Pointxp2){Point_Point(_this.p1,xp1);Point_Point(_this.p2,xp2);doublex=Point_getX(_this.p1)-Point_getX(_this.p2);doubley=Point_getY(_this.p1)-Point_getY(_this.p2);_this.len=sqrt(x*x+y*y);}Lineline(myp1,myp2);_Lineline;Line_Line(line,myp1,myp2);先分配空間,再調(diào)用構(gòu)造函數(shù)深度探索構(gòu)造函數(shù)的調(diào)用92Line::Line(Pointxp1,對象作為參數(shù)的傳遞方式對象參數(shù)的傳遞方式通過運行棧來傳遞主調(diào)函數(shù)調(diào)用拷貝構(gòu)造函數(shù),在運行棧的傳參區(qū)域上創(chuàng)建對象被調(diào)函數(shù)可以讀取傳參區(qū)域上的對象有時對拷貝構(gòu)造函數(shù)的調(diào)用可以省去例:

z.add(Complex(3,4))直接調(diào)用構(gòu)造函數(shù)Complex(float,float),在運行棧的傳參區(qū)域上建立對象93深度探索對象作為參數(shù)的傳遞方式對象參數(shù)的傳遞方式93深度探索對象作為返回值的傳遞方式傳遞方式在主調(diào)函數(shù)中創(chuàng)建臨時對象主調(diào)函數(shù)把該對象地址(引用)傳遞給被調(diào)函數(shù)被調(diào)函數(shù)返回時,在該地址上執(zhí)行拷貝構(gòu)造94深度探索Pointfun2(){Pointa(1,2);returna;}voidfun2(_Point&result){_Pointa;Point_Point(a,1,2);Point_Point(result,a);}b=fun2();_Pointtemp;fun2(temp);b=temp;對象作為返回值的傳遞方式傳遞方式94深度探索Point對象作為返回值的傳遞方式有時返回時可以不調(diào)用拷貝構(gòu)造函數(shù)例:returnPoint(1,2);直接調(diào)用構(gòu)造函數(shù)Point(int,int),生成返回的對象有時主調(diào)函數(shù)中可以不建立臨時對象例:Pointp=fun2();先為p申請空間,調(diào)用fun2()前傳遞p的地址,這樣在返回時可直接在p的空間上構(gòu)造返回對象95深度探索對象作為返回值的傳遞方式有時返回時可以不調(diào)用拷貝構(gòu)造函數(shù)9596小結(jié)與復(fù)習建議主要內(nèi)容面向?qū)ο蟮幕靖拍?、類和對象的聲明、?gòu)造函數(shù)、析構(gòu)函數(shù)、內(nèi)聯(lián)成員函數(shù)、拷貝構(gòu)造函數(shù)、類的組合達到的目標學(xué)會將一段功能相對獨立的程序?qū)懗梢粋€函數(shù),為下一章學(xué)習類和對象打好必要的基礎(chǔ)。實驗任務(wù)實驗四96小結(jié)與復(fù)習建議主要內(nèi)容第四章類與對象C++語言程序設(shè)計清華大學(xué)鄭莉第四章類與對象C++語言程序設(shè)計清華大學(xué)鄭莉98本章主要內(nèi)容面向?qū)ο蟮乃枷隣OP的基本特點類概念和聲明對象構(gòu)造函數(shù)析構(gòu)函數(shù)內(nèi)聯(lián)成員函數(shù)拷貝構(gòu)造函數(shù)類的組合結(jié)構(gòu)體與聯(lián)合體深度探索2本章主要內(nèi)容面向?qū)ο蟮乃枷雰?nèi)聯(lián)成員函數(shù)99回顧:面向過程的設(shè)計方法重點:如何實現(xiàn)的細節(jié)和過程,將數(shù)據(jù)與函數(shù)分開。形式:主模塊+若干個子模塊(main()+子函數(shù))。特點:自頂向下,逐步求精——功能分解。缺點:效率低,程序的可重用性差。面向?qū)ο蟮乃枷?回顧:面向過程的設(shè)計方法重點:面向?qū)ο蟮乃枷?00面向?qū)ο蟮姆椒康模簩崿F(xiàn)軟件設(shè)計的產(chǎn)業(yè)化。觀點:自然界是由實體(對象)所組成。程序設(shè)計方法:使用面向?qū)ο蟮挠^點來描述模仿并處理現(xiàn)實問題。要求:高度概括、分類、和抽象。面向?qū)ο蟮乃枷?面向?qū)ο蟮姆椒康模好嫦驅(qū)ο蟮乃枷?01抽象抽象是對具體對象(問題)進行概括,抽出這一類對象的公共性質(zhì)并加以描述的過程。先注意問題的本質(zhì)及描述,其次是實現(xiàn)過程或細節(jié)。數(shù)據(jù)抽象:描述某類對象的屬性或狀態(tài)(對象相互區(qū)別的物理量)。代碼抽象:描述某類對象的共有的行為特征或具有的功能。抽象的實現(xiàn):通過類的聲明。OOP的基本特點5抽象抽象是對具體對象(問題)進行概括,抽出這一類對象的公共102抽象實例——鐘表數(shù)據(jù)抽象:inthour,intminute,intsecond代碼抽象:setTime(),showTime()OOP的基本特點6抽象實例——鐘表數(shù)據(jù)抽象:OOP的基本特點103抽象實例——鐘表類classClock{

public:voidsetTime(intnewH,intnewM,intnewS);

voidshowTime();

private:inthour,minute,second;};OOP的基本特點7抽象實例——鐘表類classClock{OOP的基本104抽象實例——人數(shù)據(jù)抽象:stringname,stringgender,intage,intid代碼抽象:生物屬性角度:

getCloth(),eat(),step(),…社會屬性角度:

work(),promote(),…OOP的基本特點8抽象實例——人數(shù)據(jù)抽象:OOP的基本特點105封裝將抽象出的數(shù)據(jù)成員、代碼成員相結(jié)合,將它們視為一個整體。目的是曾強安全性和簡化編程,使用者不必了解具體的實現(xiàn)細節(jié),而只需要通過外部接口,以特定的訪問權(quán)限,來使用類的成員。實現(xiàn)封裝:類聲明中的{}OOP的基本特點9封裝將抽象出的數(shù)據(jù)成員、代碼成員相結(jié)合,將它們視為一個整體106封裝實例:classClock{

public:voidsetTime(intnewH,intnewM,intnewS);

voidshowTime();

private:inthour,minute,second;};邊界特定的訪問權(quán)限OOP的基本特點外部接口10封裝實例:邊界特定的訪問權(quán)限OOP的基本特點外部接口107繼承與派生是C++中支持層次分類的一種機制,允許程序員在保持原有類特性的基礎(chǔ)上,進行更具體的說明。實現(xiàn):聲明派生類——見第7章OOP的基本特點11繼承與派生是C++中支持層次分類的一種機制,允許程序員在108多態(tài)性多態(tài):同一名稱,不同的功能實現(xiàn)方式。目的:達到行為標識統(tǒng)一,減少程序中標識符的個數(shù)。實現(xiàn):重載函數(shù)和虛函數(shù)——見第8章OOP的基本特點12多態(tài)性多態(tài):同一名稱,不同的功能實現(xiàn)方式。OOP的基本特109c++中的類類是具有相同屬性和行為的一組對象的集合,它為屬于該類的全部對象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和行為兩個主要部分。利用類可以實現(xiàn)數(shù)據(jù)的封裝、隱藏、繼承與派生。利用類易于編寫大型復(fù)雜程序,其模塊化程度比C中采用函數(shù)更高。類和對象13c++中的類類是具有相同屬性和行為的一組對象的集合,它為110類的聲明形式

類是一種用戶自定義類型,聲明形式:class類名稱{

public:

公有成員(外部接口)

private:

私有成員

protected:

保護型成員}類和對象14類的聲明形式類是一種用戶自定義類型,聲明形式:類和111公有類型成員在關(guān)鍵字public后面聲明,它們是類與外部的接口,任何外部函數(shù)都可以訪問公有類型數(shù)據(jù)和函數(shù)。類和對象15公有類型成員在關(guān)鍵字public后面聲明,它們是類與外部112私有類型成員在關(guān)鍵字private后面聲明,只允許本類中的函數(shù)訪問,而類外部的任何函數(shù)都不能訪問。如果緊跟在類名稱的后面聲明私有成員,則關(guān)鍵字private可以省略。類和對象16私有類型成員在關(guān)鍵字private后面聲明,只允許本類中113保護類型與private類似,其差別表現(xiàn)在繼承與派生時對派生類的影響不同,第七章講。類和對象17保護類型與private類似,其差別表現(xiàn)在繼承與派生時對114類的成員classclock{public:

voidsetTime(intnewH,intnewM,intnewS);

voidshowTime();private:inthour,hinute,second;};類和對象成員數(shù)據(jù)成員函數(shù)18類的成員classclock{類和對象成員數(shù)據(jù)voidClock::setTime(intnewH,intnewM, intnewS){hour=newH;minute=newM;second=newS;}voidClock::showTime(){cout<<hour<<":"<<minute<<":"<< second;}115voidClock::setTime(intnewH,116成員數(shù)據(jù)與一般的變量聲明相同,但需要將它放在類的聲明體中。類和對象20成員數(shù)據(jù)與一般的變量聲明相同,但需要將它放在類的聲明體中117成員函數(shù)在類中說明原型,可以在類外給出函數(shù)體實現(xiàn),并在函數(shù)名前使用類名加以限定。也可以直接在類中給出函數(shù)體,形成內(nèi)聯(lián)成員函數(shù)。允許聲明重載函數(shù)和帶默認形參值的函數(shù)類和對象21成員函數(shù)在類中說明原型,可以在類外給出函數(shù)體實現(xiàn),并在函118內(nèi)聯(lián)成員函數(shù)為了提高運行時的效率,對于較簡單的函數(shù)可以聲明為內(nèi)聯(lián)形式。內(nèi)聯(lián)函數(shù)體中不要有復(fù)雜結(jié)構(gòu)(如循環(huán)語句和switch語句)。在類中聲明內(nèi)聯(lián)成員函數(shù)的方式:將函數(shù)體放在類的聲明中。使用inline關(guān)鍵字。類和對象22內(nèi)聯(lián)成員函數(shù)為了提高運行時的效率,對于較簡單的函數(shù)可以聲119內(nèi)聯(lián)成員函數(shù)舉例(一)classPoint{public:voidinit(intinitX,intinitY){x=initX;y=initY;}intgetX(){returnx;}intgetY(){returny;}private:intx,y;};類和對象23內(nèi)聯(lián)成員函數(shù)舉例(一)classPoint{類和120內(nèi)聯(lián)成員函數(shù)舉例(二)classPoint{public:voidinit(intinitX,intinitY);intgetX();

intgetY();

private:intx,y;};類和對象24內(nèi)聯(lián)成員函數(shù)舉例(二)classPoint{類和inlinevoidPoint::

init(intinitX,intinitY){x=initX;y=initY;}inlineintPoint::getX(){returnx;}inlineintPoint::GetY(){returny;}121inlinevoidPoint::

i122對象類的對象是該類的某一特定實體,即類類型的變量。聲明形式:

類名對象名;例:

ClockmyClock;類和對象26對象類的對象是該類的某一特定實體,即類類型的變量。類和123類中成員的訪問方式類中成員互訪直接使用成員名類外訪問使用“對象名.成員名”方式訪問

public

屬性的成員類和對象27類中成員的訪問方式類中成員互訪類和對象124例4-1類的應(yīng)用舉例#include<iostream>usingnamespacestd;classClock{......//類的聲明略}//......類的實現(xiàn)略intmain(){ ClockmyClock; myClock.setTime(8,30,30); myClock.showTime(); return0;}類和對象28例4-1類的應(yīng)用舉例#include<iostream>125構(gòu)造函數(shù)構(gòu)造函數(shù)的作用是在對象被創(chuàng)建時使用特定的值構(gòu)造對象,或者說將對象初始化為一個特定的狀態(tài)。在對象創(chuàng)建時由系統(tǒng)自動調(diào)用。如果程序中未聲明,則系統(tǒng)自動產(chǎn)生出一個隱含的參數(shù)列表為空的構(gòu)造函數(shù)允許為內(nèi)聯(lián)函數(shù)、重載函數(shù)、帶默認形參值的函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)29構(gòu)造函數(shù)構(gòu)造函數(shù)的作用是在對象被創(chuàng)建時使用特定的值構(gòu)造對126構(gòu)造函數(shù)舉例classClock{public:

Clock(intnewH,intnewM,intnewS);//構(gòu)造函數(shù)

voidsetTime(intnewH,intnewM,intnewS); voidshowTime();private: inthour,minute,second;};構(gòu)造函數(shù)和析構(gòu)函數(shù)30構(gòu)造函數(shù)舉例classClock{構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)的實現(xiàn):Clock::Clock(intnewH,intnewM,intnewS){ hour=newH; minute=newM; second=newS;}建立對象時構(gòu)造函數(shù)的作用:intmain(){

Clockc(0,0,0);//隱含調(diào)用構(gòu)造函數(shù),將初始值作為實參。

c.showTime(); return0;}127構(gòu)造函數(shù)的實現(xiàn):31128拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),其形參為本類的對象引用。class類名{public:

類名(形參);//構(gòu)造函數(shù)類名(類名&對象名);//拷貝構(gòu)造函數(shù)

...};類名::類(類名&對象名)//拷貝構(gòu)造函數(shù)的實現(xiàn){函數(shù)體}構(gòu)造函數(shù)和析構(gòu)函數(shù)32拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),其形參為本129拷貝構(gòu)造函數(shù)(例4-2)classPoint{public: Point(intxx=0,intyy=0){x=xx;y=yy;} Point(Point&p); intgetX(){returnx;} intgetY(){returny;}private: intx,y;};構(gòu)造函數(shù)和析構(gòu)函數(shù)33拷貝構(gòu)造函數(shù)(例4-2)classPoint{構(gòu)造函Point::Point(Point&p){x=p.x;y=p.y;cout<<"Callingthecopyconstructor" <<endl;}130Point::Point(Point&p){34131拷貝構(gòu)造函數(shù)(例4-2)當用類的一個對象去初始化該類的另一個對象時系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(shù)實現(xiàn)拷貝賦值。intmain(){Pointa(1,2);Pointb=a;//拷貝構(gòu)造函數(shù)被調(diào)用cout<<b.getX()<<endl;}構(gòu)造函數(shù)和析構(gòu)函數(shù)35拷貝構(gòu)造函數(shù)(例4-2)當用類的一個對象去初始化該類的另132拷貝構(gòu)造函數(shù)(例4-2)若函數(shù)的形參為類對象,調(diào)用函數(shù)時,實參賦值給形參,系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(shù)。例如:voidfun1(Pointp){cout<<p.getX()<<endl;}intmain(){Pointa(1,2);fun1(a);//調(diào)用拷貝構(gòu)造函數(shù)

return0;}構(gòu)造函數(shù)和析構(gòu)函數(shù)36拷貝構(gòu)造函數(shù)(例4-2)若函數(shù)的形參為類對象,調(diào)用函數(shù)時133拷貝構(gòu)造函數(shù)(例4-2)當函數(shù)的返回值是類對象時,系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(shù)。例如:Pointfun2(){Pointa(1,2);returna;//調(diào)用拷貝構(gòu)造函數(shù)}intmain(){Pointb;b=fun2();return0;}構(gòu)造函數(shù)和析構(gòu)函數(shù)37拷貝構(gòu)造函數(shù)(例4-2)當函數(shù)的返回值是類對象時,系統(tǒng)自134隱含的拷貝構(gòu)造函數(shù)如果程序員沒有為類聲明拷貝初始化構(gòu)造函數(shù),則編譯器自己生成一個隱含的拷貝構(gòu)造函數(shù)。這個構(gòu)造函數(shù)執(zhí)行的功能是:用作為初始值的對象的每個數(shù)據(jù)成員的值,初始化將要建立的對象的對應(yīng)數(shù)據(jù)成員。構(gòu)造函數(shù)和析構(gòu)函數(shù)38隱含的拷貝構(gòu)造函數(shù)如果程序員沒有為類聲明拷貝初始化構(gòu)造函135析構(gòu)函數(shù)完成對象被刪除前的一些清理工作。在對象的生存期結(jié)束的時刻系統(tǒng)自動調(diào)用它,然后再釋放此對象所屬的空間。如果程序中未聲明析構(gòu)函數(shù),編譯器將自動產(chǎn)生一個隱含的析構(gòu)函數(shù)。構(gòu)造函數(shù)和析構(gòu)函數(shù)39析構(gòu)函數(shù)完成對象被刪除前的一些清理工作。構(gòu)造函數(shù)和析構(gòu)函136構(gòu)造函數(shù)和析構(gòu)函數(shù)舉例#include<iostream>usingnamespacestd;classPoint{public:Point(intxx,intyy);~Point();//...其他函數(shù)原型private:intx,y;};構(gòu)造函數(shù)和析構(gòu)函數(shù)40構(gòu)造函數(shù)和析構(gòu)函數(shù)舉例#include<iostreaPoint::Point(intxx,intyy){x=xx;y=yy;}Point::~Point(){}//...其他函數(shù)的實現(xiàn)略137Point::Point(intxx,intyy){4138類的應(yīng)用舉例(例4-3)一圓形游泳池如圖所示,現(xiàn)在需在其周圍建一圓形過道,并在其四周圍上柵欄。柵欄價格為35元/米,過道造價為20元/平方米。過道寬度為3米,游泳池半徑由鍵盤輸入。要求編程計算并輸出過道和柵欄的造價。游泳池過道42類的應(yīng)用舉例(例4-3)一圓形游泳池如圖所示,現(xiàn)在需在其#include<iostream>usingnamespacestd;constfloatPI=3.141593; //給出p的值constfloatFENCE_PRICE=35; //柵欄的單價constfloatCONCRETE_PRICE=20;//過道水泥單價classCircle{ //聲明定義類Circle及其數(shù)據(jù)和方法public: //外部接口

Circle(floatr); //構(gòu)造函數(shù)

floatcircumference(); //計算圓的周長

floatarea(); //計算圓的面積private: //私有數(shù)據(jù)成員

floatradius; //圓半徑};139#include<iostream>43//類的實現(xiàn)//構(gòu)造函數(shù)初始化數(shù)據(jù)成員radiusCircle::Circle(floatr){ radius=r;} //計算圓的周長floatCircle::ci

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論