C面向?qū)ο蟮乃枷隷第1頁
C面向?qū)ο蟮乃枷隷第2頁
C面向?qū)ο蟮乃枷隷第3頁
C面向?qū)ο蟮乃枷隷第4頁
C面向?qū)ο蟮乃枷隷第5頁
已閱讀5頁,還剩89頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

會計學1C面向?qū)ο蟮乃枷?面向?qū)ο蟮姆椒康模簩崿F(xiàn)軟件設計的產(chǎn)業(yè)化。觀點:自然界是由實體(對象)所組成。程序設計方法:使用面向?qū)ο蟮挠^點來描述模仿并處理現(xiàn)實問題。要求:高度概括、分類、和抽象。面向?qū)ο蟮乃枷氲?頁/共94頁3抽象抽象是對具體對象(問題)進行概括,抽出這一類對象的公共性質(zhì)并加以描述的過程。先注意問題的本質(zhì)及描述,其次是實現(xiàn)過程或細節(jié)。數(shù)據(jù)抽象:描述某類對象的屬性或狀態(tài)(對象相互區(qū)別的物理量)。代碼抽象:描述某類對象的共有的行為特征或具有的功能。抽象的實現(xiàn):通過類的聲明。OOP的基本特點第2頁/共94頁4抽象實例——鐘表數(shù)據(jù)抽象:inthour,intminute,intsecond代碼抽象:setTime(),showTime()OOP的基本特點第3頁/共94頁5抽象實例——鐘表類classClock{

public:voidsetTime(intnewH,intnewM,intnewS);

voidshowTime();

private:inthour,minute,second;};OOP的基本特點第4頁/共94頁6抽象實例——人數(shù)據(jù)抽象:stringname,stringgender,intage,intid代碼抽象:生物屬性角度:

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

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

public:voidsetTime(intnewH,intnewM,intnewS);

voidshowTime();

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

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

public:

公有成員(外部接口)

private:

私有成員

protected:

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

voidsetTime(intnewH,intnewM,intnewS);

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

intgetY();

private:intx,y;};類和對象第21頁/共94頁inlinevoidPoint::

init(intinitX,intinitY){x=initX;y=initY;}inlineintPoint::getX(){returnx;}inlineintPoint::GetY(){returny;}23第22頁/共94頁24對象類的對象是該類的某一特定實體,即類類型的變量。聲明形式:

類名對象名;例:

ClockmyClock;類和對象第23頁/共94頁25類中成員的訪問方式類中成員互訪直接使用成員名類外訪問使用“對象名.成員名”方式訪問

public

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

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

voidsetTime(intnewH,intnewM,intnewS); voidshowTime();private: inthour,minute,second;};構造函數(shù)和析構函數(shù)第27頁/共94頁構造函數(shù)的實現(xiàn):Clock::Clock(intnewH,intnewM,intnewS){ hour=newH; minute=newM; second=newS;}建立對象時構造函數(shù)的作用:intmain(){

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

c.showTime(); return0;}29第28頁/共94頁30拷貝構造函數(shù)拷貝構造函數(shù)是一種特殊的構造函數(shù),其形參為本類的對象引用。class類名{public:

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

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

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

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

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

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

floatradius; //圓半徑};41第40頁/共94頁//類的實現(xiàn)//構造函數(shù)初始化數(shù)據(jù)成員radiusCircle::Circle(floatr){ radius=r;} //計算圓的周長floatCircle::circumference(){return2*PI*radius;}//計算圓的面積floatCircle::area(){returnPI*radius*radius;}42第41頁/共94頁intmain(){ floatradius; cout<<"Entertheradiusofthepool:"; //提示用戶輸入半徑

cin>>radius;

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

CirclepoolRim(radius+3); //柵欄

//計算柵欄造價并輸出

floatfenceCost=poolRim.circumference()*FENCE_PRICE;cout<<"FencingCostis$"<<fenceCost<<endl;43第42頁/共94頁

//計算過道造價并輸出

floatconcreteCost=(poolRim.area()-pool.area())*CONCRETE_PRICE; cout<<"ConcreteCostis$"<<concreteCost<<endl; return0;}運行結果Entertheradiusofthepool:10FencingCostis$2858.85ConcreteCostis$4335.444第43頁/共94頁45組合的概念類中的成員數(shù)據(jù)是另一個類的對象??梢栽谝延谐橄蟮幕A上實現(xiàn)更復雜的抽象。類的組合第44頁/共94頁46舉例classPoint{private:floatx,y;//點的坐標public:Point(floath,floatv);//構造函數(shù)

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

voiddraw();//在(x,y)處畫點};//...函數(shù)的實現(xiàn)略類的組合第45頁/共94頁classLine{private:Pointp1,p2;//線段的兩個端點public:Line(Pointa,Pointb);//構造函數(shù)

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

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

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

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

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

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

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

公有成員protected:

保護型成員private:

私有成員};一些結構體變量的初始化可以用以下形式類型名變量名={成員數(shù)據(jù)1初值,成員數(shù)據(jù)2初值,……};70結構體與聯(lián)合體第69頁/共94頁結構體舉例(例4-7)#include<iostream>#include<iomanip>#include<string>usingnamespacestd;structStudent{ //學生信息結構體

intnum; //學號

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

charsex; //性別

intage; //年齡};71結構體與聯(lián)合體第70頁/共94頁結構體舉例(例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;}運行結果:Num:97001Name:LinLinSex:FAge:1972結構體與聯(lián)合體第71頁/共94頁聯(lián)合體聲明形式union聯(lián)合體名稱{公有成員protected:

保護型成員private:

私有成員};特點:成員共用相同的內(nèi)存單元任何兩個成員不會同時有效73結構體與聯(lián)合體第72頁/共94頁聯(lián)合體的內(nèi)存分配unionMark{ //表示成績的聯(lián)合體 chargrade; //等級制的成績

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

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

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

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

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

intpercent; //百分制的成績

};76結構體與聯(lián)合體第75頁/共94頁聯(lián)合體舉例(例4-8)public: //三種構造函數(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();}77結構體與聯(lián)合體第76頁/共94頁聯(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;}78結構體與聯(lián)合體第77頁/共94頁聯(lián)合體舉例(例4-8)intmain(){ ExamInfocourse1("English",'B'); ExamInfocourse2("Calculus",true); ExamInfocourse3("C++Programming",85); course1.show(); course2.show(); course3.show(); return0;}運行結果:English:BCalculus:PASSC++Programming:8579結構體與聯(lián)合體第78頁/共94頁位域位域的聲明形式

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

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

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

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

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

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

returnComplex(real*c.real-imag*c.imag,real*c.imag+imag*c.real);}87深度探索第86頁/共94頁例4-10voidshow(){//顯示復數(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;}運行結果

溫馨提示

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

評論

0/150

提交評論