面向?qū)ο蟪绦蛟O(shè)計(jì)(C++):第4章 類與對象_第1頁
面向?qū)ο蟪绦蛟O(shè)計(jì)(C++):第4章 類與對象_第2頁
面向?qū)ο蟪绦蛟O(shè)計(jì)(C++):第4章 類與對象_第3頁
面向?qū)ο蟪绦蛟O(shè)計(jì)(C++):第4章 類與對象_第4頁
面向?qū)ο蟪绦蛟O(shè)計(jì)(C++):第4章 類與對象_第5頁
已閱讀5頁,還剩82頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第四章 類與對象目錄4.1 面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特點(diǎn)4.2 類和對象4.3 構(gòu)造函數(shù)和析構(gòu)函數(shù)4.4 類的組合4.5 UML圖形標(biāo)識4.6 結(jié)構(gòu)體和聯(lián)合體4.7 綜合實(shí)例個人銀行賬戶管理程序4.8 深度探索4.9 小結(jié)2面向?qū)ο蟮姆椒康模簩?shí)現(xiàn)軟件設(shè)計(jì)的產(chǎn)業(yè)化。觀點(diǎn):自然界是由實(shí)體(對象)所組成。程序設(shè)計(jì)方法:使用面向?qū)ο蟮挠^點(diǎn)來描述模仿并處理現(xiàn)實(shí)問題。要求:高度概括、分類、和抽象。34.1 面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特點(diǎn)4.1.1 抽象抽象是對具體對象(問題)進(jìn)行概括,抽出這一類對象的公共性質(zhì)并加以描述的過程。先注意問題的本質(zhì)及描述,其次是實(shí)現(xiàn)過程或細(xì)節(jié)。數(shù)據(jù)抽象:描述某類對象的屬性或狀態(tài)(對

2、象相互區(qū)別的物理量)。代碼抽象:描述某類對象的共有的行為特征或具有的功能。抽象的實(shí)現(xiàn):通過類的聲明。44.1 面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特點(diǎn)抽象實(shí)例鐘表數(shù)據(jù)抽象:int hour,int minute,int second代碼抽象:setTime(),showTime()54.1 面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特點(diǎn) 4.1.1 抽象抽象實(shí)例鐘表(續(xù))class Clock public: void setTime(int newH, int newM, int newS); void showTime(); private: int hour, minute, second;64.1 面向?qū)ο蟪绦蛟O(shè)計(jì)的基

3、本特點(diǎn) 4.1.1 抽象抽象實(shí)例人數(shù)據(jù)抽象:string name, string gender, int age, int id代碼抽象:生物屬性角度:getCloth(), eat(), step(),社會屬性角度:work(), promote() ,74.1 面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特點(diǎn) 4.1.1 抽象4.1.2 封裝將抽象出的數(shù)據(jù)成員、代碼成員相結(jié)合,將它們視為一個整體。目的是曾強(qiáng)安全性和簡化編程,使用者不必了解具體的實(shí)現(xiàn)細(xì)節(jié),而只需要通過外部接口,以特定的訪問權(quán)限,來使用類的成員。實(shí)現(xiàn)封裝:類聲明中的84.1 面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特點(diǎn)4.1.2 封裝(續(xù))實(shí)例:class Clo

4、ck public:void setTime(int newH, int newM, int newS); void showTime(); private: int hour, minute, second;94.1 面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特點(diǎn)邊界特定的訪問權(quán)限外部接口4.1.3 繼承是C+中支持層次分類的一種機(jī)制,允許程序員在保持原有類特性的基礎(chǔ)上,進(jìn)行更具體的說明。實(shí)現(xiàn):聲明派生類見第7章104.1 面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特點(diǎn)4.1.4 多態(tài)多態(tài):同一名稱,不同的功能實(shí)現(xiàn)方式。目的:達(dá)到行為標(biāo)識統(tǒng)一,減少程序中標(biāo)識符的個數(shù)。實(shí)現(xiàn):重載函數(shù)和虛函數(shù)見第8章114.1 面向?qū)ο蟪绦蛟O(shè)計(jì)的基本

5、特點(diǎn)4.2 類和對象類是具有相同屬性和行為的一組對象的集合,它為屬于該類的全部對象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和行為兩個主要部分。利用類可以實(shí)現(xiàn)數(shù)據(jù)的封裝、隱藏、繼承與派生。利用類易于編寫大型復(fù)雜程序,其模塊化程度比C中采用函數(shù)更高。124.2.1 類的定義類是一種用戶自定義類型,聲明形式:class 類名稱 public: 公有成員(外部接口) private: 私有成員 protected: 保護(hù)型成員134.2 類和對象4.2.2 類成員的訪問控制 公有類型成員在關(guān)鍵字public后面聲明,它們是類與外部的接口,任何外部函數(shù)都可以訪問公有類型數(shù)據(jù)和函數(shù)。144.2 類和對象私有類

6、型成員在關(guān)鍵字private后面聲明,只允許本類中的函數(shù)訪問,而類外部的任何函數(shù)都不能訪問。如果緊跟在類名稱的后面聲明私有成員,則關(guān)鍵字private可以省略。154.2 類和對象 4.2.2 類成員的訪問控制保護(hù)類型成員與private類似,其差別表現(xiàn)在繼承與派生時對派生類的影響不同,第七章講。164.2 類和對象 4.2.2 類成員的訪問控制4.2.3 對象類的對象是該類的某一特定實(shí)體,即類類型的變量。聲明形式: 類名 對象名;例:Clock myClock; 類中成員互訪直接使用成員名 類外訪問使用“對象名.成員名”方式訪問 public 屬性的成員174.2 類和對象4.2.4 類的成

7、員函數(shù)在類中說明原型,可以在類外給出函數(shù)體實(shí)現(xiàn),并在函數(shù)名前使用類名加以限定。也可以直接在類中給出函數(shù)體,形成內(nèi)聯(lián)成員函數(shù)。允許聲明重載函數(shù)和帶默認(rèn)形參值的函數(shù)184.2 類和對象內(nèi)聯(lián)成員函數(shù)為了提高運(yùn)行時的效率,對于較簡單的函數(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)鍵字。194.2 類和對象 4.2.4 類的成員函數(shù)內(nèi)聯(lián)成員函數(shù)舉例(一)class Point public: void init(int initX, int initY) x = initX; y = initY

8、; int getX() return x; int getY() return y; private: int x, y;204.2 類和對象 4.2.4 類的成員函數(shù)內(nèi)聯(lián)成員函數(shù)舉例(二)class Point public: void init(int initX, int initY); int getX(); int getY(); private: int x, y;214.2 類和對象 4.2.4 類的成員函數(shù)內(nèi)聯(lián)成員函數(shù)舉例(三)inline void Point: init(int initX,int initY) x = initX; y = initY;inline in

9、t Point:getX() return x;inline int Point:GetY() return y;224.2 類和對象 4.2.4 類的成員函數(shù)4.2.5 程序?qū)嵗?-1#includeusing namespace std;class Clock ./類的聲明略/.類的實(shí)現(xiàn)略int main() Clock myClock;myClock.setTime(8, 30, 30);myClock.showTime();return 0;234.2 類和對象類的成員(續(xù))void Clock:setTime(int newH, int newM,int newS) hour =

10、newH; minute = newM; second = newS;void Clock:showTime() cout hour : minute : second;244.2 類和對象 4.2.2 類成員的訪問控制4.3.1 構(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ù)、帶默認(rèn)形參值的函數(shù)254.3 構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)舉例class Clock public:Clock(int newH,int newM,int

11、 newS);/構(gòu)造函數(shù)void setTime(int newH, int newM, int newS);void showTime();private:int hour, minute, second;264.3 構(gòu)造函數(shù)和析構(gòu)函數(shù) 4.3.1 構(gòu)造函數(shù) 構(gòu)造函數(shù)舉例(續(xù))構(gòu)造函數(shù)的實(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ù),將初始值作為實(shí)參。 c.showTime

12、();return 0;274.3 構(gòu)造函數(shù)和析構(gòu)函數(shù) 4.3.1 構(gòu)造函數(shù) 4.3.2 拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),其形參為本類的對象引用。class 類名 public : 類名(形參);/構(gòu)造函數(shù) 類名(類名 &對象名);/拷貝構(gòu)造函數(shù) .;類名:類(類名 &對象名)/拷貝構(gòu)造函數(shù)的實(shí)現(xiàn) 函數(shù)體 284.3 構(gòu)造函數(shù)和析構(gòu)函數(shù)例4-2 Point類的完整程序class Point /Point 類的定義public:Point(int xx=0, int yy=0) x = xx; y = yy; /構(gòu)造函數(shù)Point(Point& p); /拷貝構(gòu)造函數(shù)int get

13、X() return x; int getY() return y; private:int x, y; /私有數(shù)據(jù);/成員函數(shù)的實(shí)現(xiàn)Point:Point (Point& p) x = p.x; y = p.y; cout Calling the copy constructor endl;294.3 構(gòu)造函數(shù)和析構(gòu)函數(shù) 4.3.2 拷貝構(gòu)造函數(shù) /形參為Point類對象的函數(shù)void fun1(Point p) cout p.getX() endl;/返回值為Point類對象的函數(shù)Point fun2() Point a(1, 2);return a;/主程序int main() Poin

14、t a(4, 5);/第一個對象APoint b = a;/情況一,用A初始化B。第一次調(diào)用拷貝構(gòu)造函數(shù)cout b.getX() endl;fun1(b);/情況二,對象B作為fun1的實(shí)參。第二次調(diào)用拷貝構(gòu)造函數(shù)b = fun2();/情況三,函數(shù)的返回值是類對象,函數(shù)返回時調(diào)用拷貝構(gòu)造函數(shù)cout b.getX() endl;return 0;304.3 構(gòu)造函數(shù)和析構(gòu)函數(shù) 4.3.2 拷貝構(gòu)造函數(shù) 例4-2 (續(xù))隱含的拷貝構(gòu)造函數(shù)如果程序員沒有為類聲明拷貝初始化構(gòu)造函數(shù),則編譯器自己生成一個隱含的拷貝構(gòu)造函數(shù)。這個構(gòu)造函數(shù)執(zhí)行的功能是:用作為初始值的對象的每個數(shù)據(jù)成員的值,初始化將要

15、建立的對象的對應(yīng)數(shù)據(jù)成員。314.3 構(gòu)造函數(shù)和析構(gòu)函數(shù) 4.3.2 拷貝構(gòu)造函數(shù) 4.3.3 析構(gòu)函數(shù)完成對象被刪除前的一些清理工作。在對象的生存期結(jié)束的時刻系統(tǒng)自動調(diào)用它,然后再釋放此對象所屬的空間。如果程序中未聲明析構(gòu)函數(shù),編譯器將自動產(chǎn)生一個隱含的析構(gòu)函數(shù)。324.3 構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)舉例#include using namespace std;class Point public: Point(int xx,int yy); Point(); /.其他函數(shù)原型private: int x, y;334.3 構(gòu)造函數(shù)和析構(gòu)函數(shù) 4.3.3 析構(gòu)函數(shù)Point:Poi

16、nt(int xx,int yy) x = xx; y = yy;Point:Point() /.其他函數(shù)的實(shí)現(xiàn)略4.3.4 程序?qū)嵗?-3一圓形游泳池如圖所示,現(xiàn)在需在其周圍建一圓形過道,并在其四周圍上柵欄。柵欄價格為35元/米,過道造價為20元/平方米。過道寬度為3米,游泳池半徑由鍵盤輸入。要求編程計(jì)算并輸出過道和柵欄的造價。34游泳池過道4.3 構(gòu)造函數(shù)和析構(gòu)函數(shù)#include using namespace std;const float PI = 3.141593;/給出p的值const float FENCE_PRICE = 35;/柵欄的單價const float CONCR

17、ETE_PRICE = 20;/過道水泥單價class Circle /聲明定義類Circle 及其數(shù)據(jù)和方法public:/外部接口Circle(float r);/構(gòu)造函數(shù)float circumference();/計(jì)算圓的周長float area();/計(jì)算圓的面積private:/私有數(shù)據(jù)成員float radius;/圓半徑;/類的實(shí)現(xiàn)/構(gòu)造函數(shù)初始化數(shù)據(jù)成員radiusCircle:Circle(float r) radius = r;354.3 構(gòu)造函數(shù)和析構(gòu)函數(shù) 4.3.4 程序?qū)嵗?-3(續(xù))float Circle:circumference() /計(jì)算圓的周長 ret

18、urn 2 * PI * radius;float Circle:area() /計(jì)算圓的面積 return PI * radius * radius;int main () float radius;cout radius;Circle pool(radius);/游泳池邊界Circle poolRim(radius + 3);/柵欄 /計(jì)算柵欄造價并輸出 float fenceCost = poolRim.circumference() * FENCE_PRICE; cout Fencing Cost is $ fenceCost endl;364.3 構(gòu)造函數(shù)和析構(gòu)函數(shù) 4.3.4 程序

19、實(shí)例例4-3(續(xù))/計(jì)算過道造價并輸出float concreteCost = (poolRim.area() - pool.area() * CONCRETE_PRICE;cout Concrete Cost is $ concreteCost endl;return 0;運(yùn)行結(jié)果:Enter the radius of the pool: 10Fencing Cost is $2858.85Concrete Cost is $4335.4374.3 構(gòu)造函數(shù)和析構(gòu)函數(shù) 4.3.4 程序?qū)嵗?-3(續(xù))4.4.1組合類中的成員數(shù)據(jù)是另一個類的對象??梢栽谝延谐橄蟮幕A(chǔ)上實(shí)現(xiàn)更復(fù)雜的抽象。3

20、84.4 類的組合類組合的構(gòu)造函數(shù)設(shè)計(jì)原則:不僅要負(fù)責(zé)對本類中的基本類型成員數(shù)據(jù)賦初值,也要對對象成員初始化。聲明形式:類名:類名(對象成員所需的形參,本類成員形參) :對象1(參數(shù)),對象2(參數(shù)),. 本類初始化 394.4 類的組合 4.4.1 組合類組合的構(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)嵌對象,用默認(rèn)構(gòu)造函數(shù)(即無形參的)初始化系統(tǒng)自動生成的隱含的默認(rèn)構(gòu)造函數(shù)中,內(nèi)嵌對象全部用默認(rèn)構(gòu)造函數(shù)初始化404.4 類的組合 4.4.1 組合例4-4 類的組合,線

21、段(Line)類/4_4.cpp#include #include using namespace std;class Point /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;Point:Point(Point &p) /拷貝構(gòu)造函數(shù)的實(shí)現(xiàn)x = p.x;y = p.y;cout Calling the copy constructor of Point endl;414

22、.4 類的組合 4.4.1 組合/類的組合class Line /Line類的定義public:/外部接口Line(Point xp1, Point xp2);Line(Line &l);double getLen() return len; private:/私有數(shù)據(jù)成員Point p1, p2;/Point類的對象p1,p2double len;/組合類的構(gòu)造函數(shù)Line:Line(Point xp1, Point xp2) : p1(xp1), p2(xp2) cout Calling constructor of Line endl;double x = static_cast(p1.

23、getX() - p2.getX();double y = static_cast(p1.getY() - p2.getY();len = sqrt(x * x + y * y);Line:Line (Line &l): p1(l.p1), p2(l.p2) /組合類的拷貝構(gòu)造函數(shù)cout Calling the copy constructor of Line endl;len = l.len;424.4 類的組合 4.4.1 組合例4-4(續(xù))/主函數(shù)int main() Point myp1(1, 1), myp2(4, 5);/建立Point類的對象Line line(myp1, my

24、p2);/建立Line類的對象Line line2(line);/利用拷貝構(gòu)造函數(shù)建立一個新對象cout The length of the line is: ;cout line.getLen() endl;cout The length of the line2 is: ;cout line2.getLen() endl;return 0;434.4 類的組合 4.4.1 組合例4-4(續(xù))運(yùn)行結(jié)果如下:Calling the copy constructor of PointCalling the copy constructor of PointCalling the copy con

25、structor of PointCalling the copy constructor of PointCalling constructor of LineCalling the copy constructor of PointCalling the copy constructor of PointCalling the copy constructor of LineThe length of the line is: 5The length of the line2 is: 54.4.2 前向引用聲明類應(yīng)該先聲明,后使用如果需要在某個類的聲明之前,引用該類,則應(yīng)進(jìn)行前向引用聲明。

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

27、y Fred x; /錯誤:類Fred的聲明尚不完善;class Fred Barney y;class Fred;/前向引用聲明 class Barney public: void method() x.yabbaDabbaDo();/錯誤:Fred類的對象在定義之前被使用 private: Fred &x;/正確,經(jīng)過前向引用聲明,可以聲明Fred類的對象引用; class Fred public: void yabbaDabbaDo();private: Barney &y; 前向引用聲明注意事項(xiàng)(續(xù))474.4 類的組合 4.4.2 前向引用聲明前向引用聲明注意事項(xiàng)(續(xù))應(yīng)該記?。寒?dāng)你

28、使用前向引用聲明時,你只能使用被聲明的符號,而不能涉及類的任何細(xì)節(jié)。484.4 類的組合 4.4.2 前向引用聲明4.5.1 UML簡介UML(Unified Modeling Language)語言是一種可視化的的面向?qū)ο蠼UZ言。UML有三個基本的部分事物(Things)UML中重要的組成部分,在模型中屬于最靜態(tài)的部分,代表概念上的或物理上的元素關(guān)系(Relationships)關(guān)系把事物緊密聯(lián)系在一起圖(Diagrams)圖是很多有相互相關(guān)的事物的組494.5 UML圖形標(biāo)識4.5.2 UML類圖舉例:Clock類的完整表示Clock類的簡潔表示504.5 UML圖形標(biāo)識Clock- h

29、our : int- minute : int- second : int+ showTime() : void+ setTime(newH:int=0,newM:int=0,newS:int=0):voidClock對象圖514.5 UML圖形標(biāo)識 4.5.2 UML類圖myClock : Clock- hour : int- minute : int- second : intmyClock : Clock幾種關(guān)系的圖形標(biāo)識依賴關(guān)系圖中的“類A”是源,“類B”是目標(biāo),表示“類A”使用了“類B”,或稱“類A”依賴“類B”524.5 UML圖形標(biāo)識 4.5.2 UML類圖類 A類 B幾種關(guān)系的

30、圖形標(biāo)識作用關(guān)系關(guān)聯(lián)圖中的“重數(shù)A”決定了類B的每個對象與類A的多少個對象發(fā)生作用,同樣“重數(shù)B”決定了類A的每個對象與類B的多少個對象發(fā)生作用。534.5 UML圖形標(biāo)識 4.5.2 UML類圖類 A重數(shù)A類 B重數(shù)B幾種關(guān)系的圖形標(biāo)識包含關(guān)系聚集和組合聚集表示類之間的關(guān)系是整體與部分的關(guān)系,“包含”、“組成”、“分為部分”等都是聚集關(guān)系。544.5 UML圖形標(biāo)識 4.5.2 UML類圖類 A類 B重數(shù)A重數(shù)B類 A類 B重數(shù)A重數(shù)B例4-5 采用UML方法來描述例4-4中Line類和Point類的關(guān)系554.5 UML圖形標(biāo)識 4.5.2 UML類圖Point- x : int- y :

31、 int+ Point(xx : int = 0, yy : int = 0)+ Point(p : Point &)+ getX() : int+ getY() : intLine- len : double+ Line(xp1 : Point, xp2 : Point)+ Line( : Line &)+ getLen() : double-p1-p21.*21.*幾種關(guān)系的圖形標(biāo)識繼承關(guān)系泛化564.5 UML圖形標(biāo)識 4.5.2 UML類圖父類 A父類 B子類 1子類 2注釋在UML圖形上,注釋表示為帶有褶角的矩形,然后用虛線連接到UML的其他元素上,它是一種用于在圖中附加文字注釋的機(jī)

32、制。574.5 UML圖形標(biāo)識 4.5.2 UML類圖注釋文字例4-6帶有注釋的Line類和Point類關(guān)系的描述584.5 UML圖形標(biāo)識 4.5.2 UML類圖Point- x : int- y : int+ Point(xx : int = 0, yy : int = 0)+ Point(p : Point &)+ getX() : int+ getY() : intLine- len : double+ Line(xp1 : Point, xp2 : Point)+ Line( : Line &)+ getLen() : double-p1-p21.*21.*單向組合:直線段包含端點(diǎn)p

33、1、p24.6.1 結(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ù)、而沒有什么操作的類型人們習(xí)慣將結(jié)構(gòu)體的數(shù)據(jù)成員設(shè)為公有,因此這時用結(jié)構(gòu)體更方便594.6 結(jié)構(gòu)體和聯(lián)合體結(jié)構(gòu)體的定義和初始化結(jié)構(gòu)體定義struct 結(jié)構(gòu)體名稱 公有成員protected: 保護(hù)型成員private: 私有成員;一些結(jié)構(gòu)體變量的初始化可以用以下形式類型名 變量名 = 成員數(shù)據(jù)1初值, 成員數(shù)據(jù)2初值, ;604.6 結(jié)構(gòu)體和聯(lián)合體 4.6.1 結(jié)構(gòu)體例4-7用結(jié)構(gòu)

34、體表示學(xué)生的基本信息#include #include #include using namespace std;struct Student /學(xué)生信息結(jié)構(gòu)體int num;/學(xué)號string name;/姓名,字符串對象,將在第6章詳細(xì)介紹char sex;/性別int age;/年齡;614.6 結(jié)構(gòu)體和聯(lián)合體 4.6.1 結(jié)構(gòu)體例4-7(續(xù))int main() Student stu = 97001, Lin Lin, F, 19 ;cout Num: stu.num endl;cout Name: endl;cout Sex: stu.sex endl;cout Age: stu.

35、age endl;return 0;運(yùn)行結(jié)果:Num: 97001Name: Lin LinSex: FAge: 19624.6 結(jié)構(gòu)體和聯(lián)合體 4.6.1 結(jié)構(gòu)體4.6.2 聯(lián)合體聲明形式union 聯(lián)合體名稱 公有成員protected: 保護(hù)型成員private: 私有成員;特點(diǎn):成員共用相同的內(nèi)存單元任何兩個成員不會同時有效634.6 結(jié)構(gòu)體和聯(lián)合體聯(lián)合體的內(nèi)存分配union Mark /表示成績的聯(lián)合體char grade;/等級制的成績bool pass;/只記是否通過課程的成績int percent;/百分制的成績;644.6 結(jié)構(gòu)體和聯(lián)合體 4.6.2 聯(lián)合體Markgrade

36、percentpass無名聯(lián)合例:union int i; float f;在程序中可以這樣使用:i = 10;f = 2.2;654.6 結(jié)構(gòu)體和聯(lián)合體 4.6.2 聯(lián)合體無名聯(lián)合沒有標(biāo)記名,只是聲明一個成員項(xiàng)的集合,這些成員項(xiàng)具有相同的內(nèi)存地址,可以由成員項(xiàng)的名字直接訪問。例4-8使用聯(lián)合體保存成績信息,并且輸出。#include #include using namespace std;class ExamInfo private:string name;/課程名稱enum GRADE, PASS, PERCENTAGE mode;/采用何種計(jì)分方式union char grade;/等

37、級制的成績bool pass;/只記是否通過課程的成績int percent;/百分制的成績;664.6 結(jié)構(gòu)體和聯(lián)合體 4.6.2 聯(lián)合體例4-8(續(xù))public:/三種構(gòu)造函數(shù),分別用等級、是否通過和百分初始化ExamInfo(string name, char grade): name(name), mode(GRADE), grade(grade) ExamInfo(string name, bool pass): name(name), mode(PASS), pass(pass) ExamInfo(string name, int percent): name(name), mo

38、de(PERCENTAGE), percent(percent) void show();674.6 結(jié)構(gòu)體和聯(lián)合體 4.6.2 聯(lián)合體例4-8(續(xù))void ExamInfo:show() cout name : ;switch (mode) case GRADE: cout grade; break; case PASS: cout (pass ? PASS : FAIL); break; case PERCENTAGE: cout percent; break;cout endl;684.6 結(jié)構(gòu)體和聯(lián)合體 4.6.2 聯(lián)合體例4-8(續(xù))int main() ExamInfo cour

39、se1(English, B);ExamInfo course2(Calculus, true);ExamInfo course3(C+ Programming, 85);course1.show();course2.show();course3.show();return 0;運(yùn)行結(jié)果:English: BCalculus: PASSC+ Programming: 85694.6 結(jié)構(gòu)體和聯(lián)合體 4.6.2 聯(lián)合體4.7 綜合實(shí)例個人銀行賬戶管理程序我們以一個面向個人的銀行賬戶管理程序?yàn)槔?,說明類及成員函數(shù)的設(shè)計(jì)。例4-9:一個人可以有多個活期儲蓄賬戶,一個活期儲蓄賬戶包括賬號(id)、余額

40、(balance)、年利率(rate)等信息,還包括顯示賬戶信息(show)、存款(deposit)、取款(withdraw)、結(jié)算利息(settle)等操作,704.7.1 類的設(shè)計(jì)714.7 綜合實(shí)例個人銀行賬戶管理程序SavingsAccount-id : int-balance : double-rate : double-lastDate : int-accumulation : double-record(date: int, amount : double)-accumulate(date : int) : double+SavingsAccount(date : int, id

41、 : int, rate : double)+getId() : int+getBalance() : double+getRate() : double+show()+deposit(date : int, amount : double)+withdraw(date : int, amount : double)+settle(date : int)4.7.2 源程序及說明例4-9/4_9.cpp#include #include using namespace std;class SavingsAccount /儲蓄賬戶類private:int id;/賬號double balance;

42、/余額double rate;/存款的年利率int lastDate;/上次變更余額的時期double accumulation;/余額按日累加之和/記錄一筆帳,date為日期,amount為金額,desc為說明void record(int date, double amount);/獲得到指定日期為止的存款金額按日累積值double accumulate(int date) const return accumulation + balance * (date - lastDate);724.7 綜合實(shí)例個人銀行賬戶管理程序public:/構(gòu)造函數(shù)SavingsAccount(int da

43、te, int id, double rate);int getId() return id; double getBalance() return balance; double getRate() return rate; void deposit(int date, double amount);/存入現(xiàn)金void withdraw(int date, double amount);/取出現(xiàn)金/結(jié)算利息,每年1月1日調(diào)用一次該函數(shù)void settle(int date);void show(); /顯示賬戶信息;/SavingsAccount類相關(guān)成員函數(shù)的實(shí)現(xiàn)SavingsAccou

44、nt:SavingsAccount(int date, int id, double rate): id(id), balance(0), rate(rate), lastDate(date), accumulation(0) cout date t# id is created endl;734.7 綜合實(shí)例個人銀行賬戶管理程序例4-9(續(xù))void SavingsAccount:record(int date, double amount) accumulation = accumulate(date);lastDate = date;amount = floor(amount * 100

45、 + 0.5) / 100; /保留小數(shù)點(diǎn)后兩位balance += amount;cout date t# id t amount t balance getBalance()cout Error: not enough money endl;elserecord(date, -amount);void SavingsAccount:settle(int date) double interest = accumulate(date) * rate / 365;/計(jì)算年息if (interest != 0)record(date, interest);accumulation = 0;744

46、.7 綜合實(shí)例個人銀行賬戶管理程序例4-9(續(xù))void SavingsAccount:show() cout # id tBalance: balance;int main() /建立幾個賬戶SavingsAccount sa0(1, 21325302, 0.015);SavingsAccount sa1(1, 58320212, 0.015);/幾筆賬目sa0.deposit(5, 5000);sa1.deposit(25, 10000);sa0.deposit(45, 5500);sa1.withdraw(60, 4000);/開戶后第90天到了銀行的計(jì)息日,結(jié)算所有賬戶的年息sa0.s

47、ettle(90);sa1.settle(90);/輸出各個賬戶信息sa0.show();cout endl;sa1.show();cout endl;return 0;754.7 綜合實(shí)例個人銀行賬戶管理程序例4-9(續(xù))例4-9(續(xù))運(yùn)行結(jié)果:1 #21325302 is created1 #58320212 is created5 #21325302 5000 500025 #58320212 10000 1000045 #21325302 5500 1050060 #58320212 -4000 600090 #21325302 27.64 10527.690 #58320212 21

48、.78 6021.78#21325302 Balance: 10527.6#58320212 Balance: 6021.78764.7 綜合實(shí)例個人銀行賬戶管理程序4.8.1 位域位域的聲明形式 數(shù)據(jù)類型說明符 成員名 : 位數(shù);位域的作用通過“打包”,使類的不同成員共享相同的字節(jié),從而節(jié)省存儲空間。注意事項(xiàng)具體的打包方式,因編譯器而異;只有bool、char、int和枚舉類型的成員,允許定義為位域;節(jié)省空間,但可能增加時間開銷。774.8 深度探索例4-10設(shè)計(jì)一個結(jié)構(gòu)體存儲學(xué)生的成績信息,需要包括學(xué)號、年級和成績?nèi)?xiàng)內(nèi)容,學(xué)號的范圍是0到99,999,999,年級分為freshman、s

49、ophomore、junior、senior四種,成績包括A、B、C、D四個等級。784.8 深度探索 4.8.1 位域例4-10(續(xù))#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 : 27;Level level : 2;G

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論