C清華大學鄭莉PPT課件_第1頁
C清華大學鄭莉PPT課件_第2頁
C清華大學鄭莉PPT課件_第3頁
C清華大學鄭莉PPT課件_第4頁
C清華大學鄭莉PPT課件_第5頁
已閱讀5頁,還剩91頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第四章 類與對象C+語言程序設(shè)計清華大學 鄭 莉第1頁/共96頁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頁/共96頁3回顧:面向過程的設(shè)計方法 重點: 如何實現(xiàn)的細節(jié)和過程,將數(shù)據(jù)與函數(shù)分開。 形式: 主模塊+若干個子模塊(main()+子函數(shù))。 特點: 自頂向下,逐步求精功能分解。 缺點: 效率低,程序的可重用性差。面向?qū)ο蟮乃枷氲?頁/共96頁4面向?qū)ο蟮姆椒?目的: 實現(xiàn)軟件設(shè)計的產(chǎn)業(yè)化。 觀點: 自然界是由實體(對象)所組成。 程序設(shè)計方法: 使用面向?qū)ο蟮挠^點來描述模仿并處理現(xiàn)實問題。 要

2、求: 高度概括、分類、和抽象。面向?qū)ο蟮乃枷氲?頁/共96頁5抽象抽象是對具體對象(問題)進行概括,抽出這一類對象的公共性質(zhì)并加以描述的過程。 先注意問題的本質(zhì)及描述,其次是實現(xiàn)過程或細節(jié)。 數(shù)據(jù)抽象:描述某類對象的屬性或狀態(tài)(對象相互區(qū)別的物理量)。 代碼抽象:描述某類對象的共有的行為特征或具有的功能。 抽象的實現(xiàn):通過類的聲明。OOP的基本特點第5頁/共96頁6抽象實例鐘表 數(shù)據(jù)抽象:int hour,int minute,int second 代碼抽象:setTime(),showTime()OOP的基本特點第6頁/共96頁7抽象實例鐘表類class Clock public: void

3、 setTime(int newH, int newM, int newS); void showTime(); private: int hour, minute, second;OOP的基本特點第7頁/共96頁8抽象實例人 數(shù)據(jù)抽象:string name,string gender,int age,int id 代碼抽象:生物屬性角度:getCloth(), eat(), step(),社會屬性角度:work(), promote() ,OOP的基本特點第8頁/共96頁9封裝將抽象出的數(shù)據(jù)成員、代碼成員相結(jié)合,將它們視為一個整體。 目的是曾強安全性和簡化編程,使用者不必了解具體的實現(xiàn)細節(jié)

4、,而只需要通過外部接口,以特定的訪問權(quán)限,來使用類的成員。 實現(xiàn)封裝:類聲明中的OOP的基本特點第9頁/共96頁10封裝 實例:class Clock public:void setTime(int newH, int newM, int newS); void showTime(); private: int hour, minute, second;邊界特定的訪問權(quán)限OOP的基本特點外部接口第10頁/共96頁11繼承與派生是C+中支持層次分類的一種機制,允許程序員在保持原有類特性的基礎(chǔ)上,進行更具體的說明。實現(xiàn):聲明派生類見第7章OOP的基本特點第11頁/共96頁12多態(tài)性 多態(tài):同一名稱

5、,不同的功能實現(xiàn)方式。 目的:達到行為標識統(tǒng)一,減少程序中標識符的個數(shù)。 實現(xiàn):重載函數(shù)和虛函數(shù)見第8章OOP的基本特點第12頁/共96頁13c+中的類 類是具有相同屬性和行為的一組對象的集合,它為屬于該類的全部對象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和行為兩個主要部分。 利用類可以實現(xiàn)數(shù)據(jù)的封裝、隱藏、繼承與派生。 利用類易于編寫大型復雜程序,其模塊化程度比C中采用函數(shù)更高。類 和 對 象第13頁/共96頁14類的聲明形式 類是一種用戶自定義類型,聲明形式:class 類名稱 public: 公有成員(外部接口) private: 私有成員 protected: 保護型成員類 和 對 象第1

6、4頁/共96頁15公有類型成員在關(guān)鍵字public后面聲明,它們是類與外部的接口,任何外部函數(shù)都可以訪問公有類型數(shù)據(jù)和函數(shù)。類 和 對 象第15頁/共96頁16私有類型成員在關(guān)鍵字private后面聲明,只允許本類中的函數(shù)訪問,而類外部的任何函數(shù)都不能訪問。如果緊跟在類名稱的后面聲明私有成員,則關(guān)鍵字private可以省略。類 和 對 象第16頁/共96頁17保護類型與private類似,其差別表現(xiàn)在繼承與派生時對派生類的影響不同,第七章講。類 和 對 象第17頁/共96頁18類的成員class clock public: void setTime(int newH, int newM, in

7、t newS); void showTime(); private: int hour, hinute, second;類 和 對 象成員數(shù)據(jù)成員函數(shù)第18頁/共96頁void Clock:setTime(int newH, int newM,int newS) hour = newH; minute = newM; second = newS;void Clock:showTime() cout hour : minute : second;19第19頁/共96頁20成員數(shù)據(jù) 與一般的變量聲明相同,但需要將它放在類的聲明體中。類 和 對 象第20頁/共96頁21成員函數(shù) 在類中說明原型,可以

8、在類外給出函數(shù)體實現(xiàn),并在函數(shù)名前使用類名加以限定。也可以直接在類中給出函數(shù)體,形成內(nèi)聯(lián)成員函數(shù)。 允許聲明重載函數(shù)和帶默認形參值的函數(shù)類 和 對 象第21頁/共96頁22內(nèi)聯(lián)成員函數(shù) 為了提高運行時的效率,對于較簡單的函數(shù)可以聲明為內(nèi)聯(lián)形式。 內(nèi)聯(lián)函數(shù)體中不要有復雜結(jié)構(gòu)(如循環(huán)語句和switch語句)。 在類中聲明內(nèi)聯(lián)成員函數(shù)的方式: 將函數(shù)體放在類的聲明中。 使用inline關(guān)鍵字。類 和 對 象第22頁/共96頁23內(nèi)聯(lián)成員函數(shù)舉例(一)class Point public: void init(int initX, int initY) x = initX; y = initY; in

9、t getX() return x; int getY() return y; private: int x, y;類 和 對 象第23頁/共96頁24內(nèi)聯(lián)成員函數(shù)舉例(二)class Point public: void init(int initX, int initY); int getX(); int getY(); private: int x, y;類 和 對 象第24頁/共96頁inline void Point: init(int initX,int initY) x = initX; y = initY;inline int Point:getX() return x;inl

10、ine int Point:GetY() return y;25第25頁/共96頁26對象類的對象是該類的某一特定實體,即類類型的變量。聲明形式: 類名 對象名;例: Clock myClock;類 和 對 象第26頁/共96頁27類中成員的訪問方式 類中成員互訪 直接使用成員名 類外訪問 使用“對象名.成員名”方式訪問 public 屬性的成員類 和 對 象第27頁/共96頁28例4-1類的應用舉例#includeusing namespace std;class Clock ./類的聲明略/.類的實現(xiàn)略int main() Clock myClock;(8, 30, 30);();retu

11、rn 0;類 和 對 象第28頁/共96頁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頁/共96頁30構(gòu)造函數(shù)舉例class Clock public:Clock(int newH,int newM,int newS);/構(gòu)造函數(shù)void setTime(int newH, int newM, int newS);void showTime();private:int h

12、our, minute, second;構(gòu)造函數(shù)和析構(gòu)函數(shù)第30頁/共96頁構(gòu)造函數(shù)的實現(xiàn):Clock:Clock(int newH, int newM, int newS) hour = newH;minute = newM;second = newS;建立對象時構(gòu)造函數(shù)的作用:int main() Clock c(0,0,0); /隱含調(diào)用構(gòu)造函數(shù),將初始值作為實參。 c.showTime();return 0;31第31頁/共96頁32拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),其形參為本類的對象引用。class 類名 public : 類名(形參);/構(gòu)造函數(shù) 類名(類名 &

13、對象名);/拷貝構(gòu)造函數(shù) .;類名:類(類名 &對象名)/拷貝構(gòu)造函數(shù)的實現(xiàn) 函數(shù)體 構(gòu)造函數(shù)和析構(gòu)函數(shù)第32頁/共96頁33拷貝構(gòu)造函數(shù)(例4-2)class Point public:Point(int xx=0, int yy=0) x = xx; y = yy; Point(Point& p);int getX() return x; int getY() return y; private:int x, y;構(gòu)造函數(shù)和析構(gòu)函數(shù)第33頁/共96頁Point:Point (Point& p) x = p.x; y = p.y; cout Calling the c

14、opy constructor endl;34第34頁/共96頁35拷貝構(gòu)造函數(shù)(例4-2) 當用類的一個對象去初始化該類的另一個對象時系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(shù)實現(xiàn)拷貝賦值。int main() int main() Point a(1,2); Point a(1,2); Point b = a; / Point b = a; /拷貝構(gòu)造函數(shù)被調(diào)用 cout b.getX() endl; cout b.getX() endl; 構(gòu)造函數(shù)和析構(gòu)函數(shù)第35頁/共96頁36拷貝構(gòu)造函數(shù)(例4-2)l若函數(shù)的形參為類對象,調(diào)用函數(shù)時,實參賦值給形參,系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(shù)。例如:void fun1(

15、Point p) void fun1(Point p) coutcout () () endlendl; ; intint main() main() Point a(1, 2); Point a(1, 2); fun1(a); / fun1(a); /調(diào)用拷貝構(gòu)造函數(shù) return 0;return 0; 構(gòu)造函數(shù)和析構(gòu)函數(shù)第36頁/共96頁37拷貝構(gòu)造函數(shù)(例4-2) 當函數(shù)的返回值是類對象時,系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(shù)。例如:Point fun2() Point fun2() Point a(1, 2); Point a(1, 2); return a; / return a; /調(diào)用拷貝

16、構(gòu)造函數(shù) int main() int main() Point b; Point b; b = fun2(); b = fun2(); return 0; return 0; 構(gòu)造函數(shù)和析構(gòu)函數(shù)第37頁/共96頁38隱含的拷貝構(gòu)造函數(shù)如果程序員沒有為類聲明拷貝初始化構(gòu)造函數(shù),則編譯器自己生成一個隱含的拷貝構(gòu)造函數(shù)。這個構(gòu)造函數(shù)執(zhí)行的功能是:用作為初始值的對象的每個數(shù)據(jù)成員的值,初始化將要建立的對象的對應數(shù)據(jù)成員。構(gòu)造函數(shù)和析構(gòu)函數(shù)第38頁/共96頁39析構(gòu)函數(shù) 完成對象被刪除前的一些清理工作。 在對象的生存期結(jié)束的時刻系統(tǒng)自動調(diào)用它,然后再釋放此對象所屬的空間。 如果程序中未聲明析構(gòu)函數(shù),編

17、譯器將自動產(chǎn)生一個隱含的析構(gòu)函數(shù)。構(gòu)造函數(shù)和析構(gòu)函數(shù)第39頁/共96頁40構(gòu)造函數(shù)和析構(gòu)函數(shù)舉例#include using namespace std;class Point public: Point(int xx,int yy); Point(); /.其他函數(shù)原型private: int x, y;構(gòu)造函數(shù)和析構(gòu)函數(shù)第40頁/共96頁Point:Point(int xx,int yy) x = xx; y = yy;Point:Point() /.其他函數(shù)的實現(xiàn)略41第41頁/共96頁42類的應用舉例(例4-3)一圓形游泳池如圖所示,現(xiàn)在需在其周圍建一圓形過道,并在其四周圍上柵欄。柵欄

18、價格為35元/米,過道造價為20元/平方米。過道寬度為3米,游泳池半徑由鍵盤輸入。要求編程計算并輸出過道和柵欄的造價。游泳池過道第42頁/共96頁#include using namespace std;const float PI = 3.141593;/給出p的值const float FENCE_PRICE = 35;/柵欄的單價const float CONCRETE_PRICE = 20;/過道水泥單價class Circle /聲明定義類Circle 及其數(shù)據(jù)和方法public:/外部接口Circle(float r);/構(gòu)造函數(shù)float circumference();/計算圓

19、的周長float area();/計算圓的面積private: /私有數(shù)據(jù)成員float radius;/圓半徑;43第43頁/共96頁/類的實現(xiàn)/構(gòu)造函數(shù)初始化數(shù)據(jù)成員radiusCircle:Circle(float r) radius = r;/計算圓的周長float Circle:circumference() return 2 * PI * radius;/計算圓的面積float Circle:area() return PI * radius * radius;44第44頁/共96頁intint main () main () float radius;float radius;c

20、outcout Enter the radius of the pool: ; radius; radius;Circle pool(radius);Circle pool(radius);/游泳池邊界Circle Circle poolRimpoolRim(radius + 3);(radius + 3);/柵欄 /計算柵欄造價并輸出 float float fenceCostfenceCost = = () () * * FENCE_PRICE; FENCE_PRICE; coutcout Fencing Cost is $ Fencing Cost is $ fenceCostfence

21、Cost endlendl; ;45第45頁/共96頁/計算過道造價并輸出float concreteCost = (poolRim.area() - pool.area() * CONCRETE_PRICE;cout Concrete Cost is $ concreteCost endl;return 0;運行結(jié)果Enter the radius of the pool: 1046第46頁/共96頁47組合的概念 類中的成員數(shù)據(jù)是另一個類的對象。 可以在已有抽象的基礎(chǔ)上實現(xiàn)更復雜的抽象。類 的 組 合第47頁/共96頁48舉例class Point private: float x, y;

22、 /點的坐標public: Point(float h, float v); /構(gòu)造函數(shù) float getX(); /取X坐標 float getY(); /取Y坐標 void draw(); /在(x,y)處畫點;/.函數(shù)的實現(xiàn)略類 的 組 合第48頁/共96頁class Line private: Point p1, p2; /線段的兩個端點public: Line(Point a, Point b); /構(gòu)造函數(shù) void draw(void); /畫出線段;/.函數(shù)的實現(xiàn)略49第49頁/共96頁50類組合的構(gòu)造函數(shù)設(shè)計 原則:不僅要負責對本類中的基本類型成員數(shù)據(jù)賦初值,也要對對象成員

23、初始化。 聲明形式:類名:類名(對象成員所需的形參,本類成員形參) :對象1(參數(shù)),對象2(參數(shù)),. 本類初始化 類 的 組 合第50頁/共96頁51類組合的構(gòu)造函數(shù)調(diào)用l構(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)用順序相反)l初始化列表中未出現(xiàn)的內(nèi)嵌對象,用默認構(gòu)造函數(shù)(即無形參的)初始化l系統(tǒng)自動生成的隱含的默認構(gòu)造函數(shù)中,內(nèi)嵌對象全部用默認構(gòu)造函數(shù)初始化類 的 組 合第51頁/共96頁52類的組合舉例(二)class Part /部件類public: Part(); Part(int i); Part();

24、 void Print();private: int val;類 的 組 合第52頁/共96頁class Whole public: Whole(); Whole(int i, int j, int k); Whole(); void Print();private: Part one; Part two; int date;53第53頁/共96頁Whole:Whole() date=0;Whole:Whole(int i, int j, int k) : two(i), one(j), date(k)/.其他函數(shù)的實現(xiàn)略54第54頁/共96頁55前向引用聲明 類應該先聲明,后使用 如果需要在

25、某個類的聲明之前,引用該類,則應進行前向引用聲明。 前向引用聲明只為程序引入一個標識符,但具體聲明在其他地方。類 的 組 合第55頁/共96頁56前向引用聲明舉例class B; /前向引用聲明class A public: void f(B b);class B public: void g(A a);類 的 組 合第56頁/共96頁57前向引用聲明注意事項 使用前向引用聲明雖然可以解決一些問題,但它并不是萬能的。需要注意的是,盡管使用了前向引用聲明,但是在提供一個完整的類聲明之前,不能聲明該類的對象,也不能在內(nèi)聯(lián)成員函數(shù)中使用該類的對象。請看下面的程序段:class Fred; /前向引用

26、聲明class Barney Fred x; /錯誤:類Fred的聲明尚不完善;class Fred Barney y;類 的 組 合第57頁/共96頁58前向引用聲明注意事項class Fred;/前向引用聲明 class Barney public: void method() x.yabbaDabbaDo();/錯誤:Fred類的對象在定義之前被使用 private: Fred &x;/正確,經(jīng)過前向引用聲明,可以聲明Fred類的對象引用; class Fred public: void yabbaDabbaDo();private: Barney &y; 類 的 組 合

27、第58頁/共96頁59前向引用聲明注意事項 應該記?。寒斈闶褂们跋蛞寐暶鲿r,你只能使用被聲明的符號,而不能涉及類的任何細節(jié)。類 的 組 合第59頁/共96頁60UML簡介 UML語言是一種可視化的的面向?qū)ο蠼UZ言。 UML有三個基本的部分 事物(Things)UML中重要的組成部分,在模型中屬于最靜態(tài)的部分,代表概念上的或物理上的元素 關(guān)系(Relationships)關(guān)系把事物緊密聯(lián)系在一起 圖(Diagrams)圖是很多有相互相關(guān)的事物的組UML圖形標識第60頁/共96頁61UML中有4種類型的事物 結(jié)構(gòu)事物(Structural things) 動作事物(Behavioral thi

28、ngs) 分組事物(Grouping things) 注釋事物(Annotational things)UML圖形標識第61頁/共96頁62UML中的關(guān)系 依賴(Dependencies) 關(guān)聯(lián)(Association) 泛化(Generalization) 實現(xiàn)(Realization)UML圖形標識第62頁/共96頁63UML中的9種圖 類圖(Class diagram) 對象圖(Object diagram) 用例圖(Use case diagram) 順序圖(Sequence diagram) 協(xié)作圖(Collaboration diagram) 狀態(tài)圖(Statechart diag

29、ram) 活動圖(Activity diagram) 組件圖(Component diagram) 實施圖(Deployment diagram)UML圖形標識第63頁/共96頁64類圖 舉例:Clock類的完整表示 Clock類的簡潔表示Clock- hour : int- minute : int- second : int+ showTime() : void+ setTime(newH:int=0,newM:int=0,newS:int=0):voidClockUML圖形標識第64頁/共96頁65對象圖myClock : Clock- hour : int- minute : int-

30、 second : intmyClock : ClockUML圖形標識第65頁/共96頁66類與對象關(guān)系的圖形標識 依賴關(guān)系圖中的“類A”是源,“類B”是目標,表示“類A”使用了“類B”,或稱“類A”依賴“類B”類 A類 BUML圖形標識第66頁/共96頁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頁/共96頁68類與對象關(guān)系的圖形標識 包含關(guān)系聚集和組合類 A類 B重數(shù)A重數(shù)B類 A類 B重數(shù)A重數(shù)B聚集表示類之間的關(guān)系是整體與

31、部分的關(guān)系,“包含”、“組成”、“分為部分”等都是聚集關(guān)系。UML圖形標識第68頁/共96頁69類與對象關(guān)系的圖形標識 繼承關(guān)系泛化父類 A父類 B子類 1子類 2UML圖形標識第69頁/共96頁70注釋 在UML圖形上,注釋表示為帶有褶角的矩形,然后用虛線連接到UML的其他元素上,它是一種用于在圖中附加文字注釋的機制。注釋文字UML圖形標識第70頁/共96頁結(jié)構(gòu)體l結(jié)構(gòu)體是一種特殊形態(tài)的類 與類的唯一區(qū)別:類的缺省訪問權(quán)限是private,結(jié)構(gòu)體的缺省訪問權(quán)限是public 結(jié)構(gòu)體存在的主要原因:與C語言保持兼容l什么時候用結(jié)構(gòu)體而不用類 定義主要用來保存數(shù)據(jù)、而沒有什么操作的類型 人們習慣

32、將結(jié)構(gòu)體的數(shù)據(jù)成員設(shè)為公有,因此這時用結(jié)構(gòu)體更方便71結(jié)構(gòu)體與聯(lián)合體第71頁/共96頁結(jié)構(gòu)體的定義和初始化l結(jié)構(gòu)體定義struct 結(jié)構(gòu)體名稱 公有成員protected: 保護型成員private: 私有成員;l一些結(jié)構(gòu)體變量的初始化可以用以下形式類型名 變量名 = 成員數(shù)據(jù)1初值, 成員數(shù)據(jù)2初值, ;72結(jié)構(gòu)體與聯(lián)合體第72頁/共96頁結(jié)構(gòu)體舉例(例4-7)#include #include #include using namespace std;struct Student /學生信息結(jié)構(gòu)體int num;/學號string name; /姓名,字符串對象,將在第6章詳細介紹char

33、 sex;/性別int age;/年齡;73結(jié)構(gòu)體與聯(lián)合體第73頁/共96頁結(jié)構(gòu)體舉例(例4-7)int main() Student stu = 97001, Lin Lin, F, 19 ;cout Num: stu.num endl;cout Name: endl;cout Sex: stu.sex endl;cout Age: endl;return 0;運行結(jié)果:Num: 97001Name: Lin LinSex: FAge: 1974結(jié)構(gòu)體與聯(lián)合體第74頁/共96頁聯(lián)合體l聲明形式union 聯(lián)合體名稱 公有成員protected: 保護型成員private:

34、私有成員;l特點: 成員共用相同的內(nèi)存單元 任何兩個成員不會同時有效75結(jié)構(gòu)體與聯(lián)合體第75頁/共96頁聯(lián)合體的內(nèi)存分配union Mark /表示成績的聯(lián)合體char grade;/等級制的成績bool pass;/只記是否通過課程的成績int percent; /百分制的成績;76Markgradepercentpass結(jié)構(gòu)體與聯(lián)合體第76頁/共96頁77無名聯(lián)合 無名聯(lián)合沒有標記名,只是聲明一個成員項的集合,這些成員項具有相同的內(nèi)存地址,可以由成員項的名字直接訪問。 例:union int i; float f;在程序中可以這樣使用:i = 10;f = 2.2;結(jié)構(gòu)體與聯(lián)合體第77頁/

35、共96頁聯(lián)合體舉例(例4-8)#include #include using namespace std;class ExamInfo private:string name;/課程名稱enum GRADE, PASS, PERCENTAGE mode;/采用何種計分方式union char grade;/等級制的成績bool pass; /只記是否通過課程的成績int percent;/百分制的成績;78結(jié)構(gòu)體與聯(lián)合體第78頁/共96頁聯(lián)合體舉例(例4-8)public:/三種構(gòu)造函數(shù),分別用等級、是否通過和百分初始化ExamInfo(string name, char grade): na

36、me(name), mode(GRADE), grade(grade) ExamInfo(string name, bool pass): name(name), mode(PASS), pass(pass) ExamInfo(string name, int percent): name(name), mode(PERCENTAGE), percent(percent) void show();79結(jié)構(gòu)體與聯(lián)合體第79頁/共96頁聯(lián)合體舉例(例4-8)void ExamInfo:show() cout name : ;switch (mode) case GRADE: cout grade;

37、 break; case PASS: cout (pass ? PASS : FAIL); break; case PERCENTAGE: cout percent; break;cout endl;80結(jié)構(gòu)體與聯(lián)合體第80頁/共96頁聯(lián)合體舉例(例4-8)int main() ExamInfo course1(English, B);ExamInfo course2(Calculus, true);ExamInfo course3(C+ Programming, 85);course1.show();course2.show();course3.show();return 0;運行結(jié)果:En

38、glish: BCalculus: PASSC+ Programming: 8581結(jié)構(gòu)體與聯(lián)合體第81頁/共96頁位域l位域的聲明形式 數(shù)據(jù)類型說明符 成員名 : 位數(shù);l位域的作用 通過“打包”,使類的不同成員共享相同的字節(jié),從而節(jié)省存儲空間。l注意事項 具體的打包方式,因編譯器而異; 只有bool、char、int和枚舉類型的成員,允許定義為位域; 節(jié)省空間,但可能增加時間開銷。82深 度 探 索第82頁/共96頁例4-9 設(shè)計一個結(jié)構(gòu)體存儲學生的成績信息,需要包括學號、年級和成績?nèi)梼?nèi)容,學號的范圍是0到99,999,999,年級分為freshman、sophomore、junior、

39、senior四種,成績包括A、B、C、D四個等級。83深 度 探 索第83頁/共96頁例4-9#include using namespace std;enum Level FRESHMAN, SOPHOMORE, JUNIOR, SENIOR ;enum Grade A, B, C, D ;class Student public:Student(unsigned number, Level level, Grade grade): number(number), level(level), grade(grade) void show();private:unsigned number :

40、 27;Level level : 2;Grade grade : 2;84深 度 探 索第84頁/共96頁例4-9void Student:show() cout Number: number endl;cout Level: ;switch (level) case FRESHMAN: cout freshman; break;case SOPHOMORE: cout sophomore; break;case JUNIOR: cout junior; break;case SENIOR: cout senior; break;cout endl;cout Grade: ;switch (

41、grade) case A: cout A; break;case B: cout B; break;case C: cout C; break;case D: cout D; break;cout endl;85深 度 探 索第85頁/共96頁例4-9int main() Student s(12345678, SOPHOMORE, B);cout Size of Student: sizeof(Student) endl;();return 0;運行結(jié)果:(運行結(jié)果第一行會因編譯環(huán)境的不同而有所差異)Size of Student: 4Number: 12345678Level: soph

42、omoreGrade: B86深 度 探 索第86頁/共96頁臨時對象與類型轉(zhuǎn)換( 例4-2中Point構(gòu)造函數(shù):Point(int xx = 0, int yy = 0) )l臨時對象的顯式創(chuàng)建 可以直接調(diào)用類的構(gòu)造函數(shù)顯式創(chuàng)建臨時對象例:Line x(Point(1, 1), Point(4, 5); 臨時對象到表達式執(zhí)行完畢后即銷毀l單參數(shù)構(gòu)造函數(shù)可以設(shè)立類型轉(zhuǎn)換 Point(1)表示創(chuàng)建一個臨時對象,同時也表示顯式類型轉(zhuǎn)換 與Point(1)等價的形式:l(Point) 1lstatic_cast(1) 無論形式為何,執(zhí)行轉(zhuǎn)換時都會創(chuàng)建臨時對象87深 度 探 索第87頁/共96頁隱含轉(zhuǎn)

43、換l由構(gòu)造函數(shù)確立的類型轉(zhuǎn)換,可以隱含執(zhí)行 例:Line x(1, 4); 效果:構(gòu)造以(1,0)和(4,0)兩坐標為端點的線段,這里Point的構(gòu)造函數(shù)被隱含調(diào)用l避免隱含轉(zhuǎn)換的發(fā)生 在構(gòu)造函數(shù)中使用explicit關(guān)鍵字,explicit要寫在類定義中的構(gòu)造函數(shù)前88深 度 探 索第88頁/共96頁例4-10#include using namespace std;class Complex /復數(shù)類private: float real, imag;/復數(shù)的實部和虛部public: /構(gòu)造函數(shù),可以當作隱式類型轉(zhuǎn)換使用 Complex(float real = 0, float imag

44、 = 0) : real(real), imag(imag) Complex add(Complex c) /復數(shù)加法,生成臨時對象并返回 return Complex(real + , imag + ); Complex sub(Complex c) /復數(shù)減法,生成臨時對象并返回 return Complex(real - , imag - ); Complex mul(Complex c) /復數(shù)乘法,生成臨時對象并返回 return Complex(real * - imag * , real * + imag * ); 89深 度 探 索第89頁/共96頁例4-10 void show() /顯示復數(shù) if (imag = 0) cout real + imag i endl; else cout real - -imag i endl; ;int main() Complex z(1, 2);/z = 1 + 2i(Complex(3, 4).show(); /Complex(3, 4)是臨時對象static_cast(5).sub(z).show(); /輸出5 z,使用了顯示類型轉(zhuǎn)換z.mul(-3.0f).show(); /輸出z * (-3),使用了隱含類型轉(zhuǎn)換return 0;運行結(jié)果:4 + 6i4 - 2i-3 - 6i9

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論