




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、第四章第四章 類與對象類與對象C+語言程序設(shè)計清華大學(xué)清華大學(xué)C+語言程序設(shè)計清華大學(xué) 鄭莉2本章主要內(nèi)容本章主要內(nèi)容l面向?qū)ο蟮乃枷朊嫦驅(qū)ο蟮乃枷雔OOP的基本特點的基本特點l類概念和聲明類概念和聲明l對象對象l構(gòu)造函數(shù)構(gòu)造函數(shù)l析構(gòu)函數(shù)析構(gòu)函數(shù)l內(nèi)聯(lián)成員函數(shù)內(nèi)聯(lián)成員函數(shù)l拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)l類的組合類的組合l結(jié)構(gòu)體與聯(lián)合體結(jié)構(gòu)體與聯(lián)合體l深度探索深度探索C+語言程序設(shè)計清華大學(xué) 鄭莉3回顧:面向過程的設(shè)計方法回顧:面向過程的設(shè)計方法l重點重點: :如何實現(xiàn)的細節(jié)和過程,將數(shù)據(jù)與函數(shù)分開。l形式:形式:主模塊+若干個子模塊(main()+子函數(shù))。l特點:特點:自頂向下,逐步求精功能分
2、解。l缺點:缺點:效率低,程序的可重用性差。面向?qū)ο蟮乃枷隒+語言程序設(shè)計清華大學(xué) 鄭莉4面向?qū)ο蟮姆椒嫦驅(qū)ο蟮姆椒╨目的:目的: 實現(xiàn)軟件設(shè)計的產(chǎn)業(yè)化。l觀點:觀點: 自然界是由實體(對象)所組成。l程序設(shè)計方法:程序設(shè)計方法: 使用面向?qū)ο蟮挠^點來描述模仿并處理現(xiàn)實問題。l要求:要求: 高度概括、分類、和抽象。面向?qū)ο蟮乃枷隒+語言程序設(shè)計清華大學(xué) 鄭莉5抽象抽象抽象是對具體對象(問題)進行概括,抽象是對具體對象(問題)進行概括,抽出這一類對象的公共性質(zhì)并加以描述抽出這一類對象的公共性質(zhì)并加以描述的過程。的過程。 先注意問題的本質(zhì)及描述,其次是實現(xiàn)過程或細節(jié)。 數(shù)據(jù)抽象:描述某類對象的屬
3、性或狀態(tài)(對象相互區(qū)別的物理量)。 代碼抽象:描述某類對象的共有的行為特征或具有的功能。 抽象的實現(xiàn):通過類的聲明。OOP的基本特點C+語言程序設(shè)計清華大學(xué) 鄭莉6抽象實例抽象實例鐘表鐘表l數(shù)據(jù)抽象:數(shù)據(jù)抽象:int hour,int minute,int secondl代碼抽象:代碼抽象:setTime(),showTime()OOP的基本特點C+語言程序設(shè)計清華大學(xué) 鄭莉7抽象實例抽象實例鐘表類鐘表類class Clock public: void setTime(int newH, int newM, int newS); void showTime(); private: int ho
4、ur, minute, second;OOP的基本特點C+語言程序設(shè)計清華大學(xué) 鄭莉8抽象實例抽象實例人人l數(shù)據(jù)抽象:數(shù)據(jù)抽象:string name,string gender,int age,int idl代碼抽象:代碼抽象:生物屬性角度:getCloth(), eat(), step(),社會屬性角度:work(), promote() ,OOP的基本特點C+語言程序設(shè)計清華大學(xué) 鄭莉9封裝封裝將抽象出的數(shù)據(jù)成員、代碼成員相結(jié)將抽象出的數(shù)據(jù)成員、代碼成員相結(jié)合,將它們視為一個整體。合,將它們視為一個整體。目的是曾強安全性和簡化編程,使用者不必了解具體的實現(xiàn)細節(jié),而只需要通過外部接口,以特
5、定的訪問權(quán)限,來使用類的成員。實現(xiàn)封裝:類聲明中的OOP的基本特點C+語言程序設(shè)計清華大學(xué) 鄭莉10封裝封裝l實例:實例:class Clock public:void setTime(int newH, int newM, int newS); void showTime(); private: int hour, minute, second;邊界特定的訪問權(quán)限OOP的基本特點外部接口C+語言程序設(shè)計清華大學(xué) 鄭莉11繼承與派生繼承與派生是是C+中支持層次分類的一種機制,中支持層次分類的一種機制,允許程序員在保持原有類特性的基礎(chǔ)上,允許程序員在保持原有類特性的基礎(chǔ)上,進行更具體的說明。進行
6、更具體的說明。實現(xiàn):聲明派生類實現(xiàn):聲明派生類見見第第7章章OOP的基本特點C+語言程序設(shè)計清華大學(xué) 鄭莉12多態(tài)性多態(tài)性l多態(tài):同一名稱,不同的功能實現(xiàn)方式。多態(tài):同一名稱,不同的功能實現(xiàn)方式。l目的:達到行為標(biāo)識統(tǒng)一,減少程序中標(biāo)目的:達到行為標(biāo)識統(tǒng)一,減少程序中標(biāo)識符的個數(shù)。識符的個數(shù)。l實現(xiàn):重載函數(shù)和虛函數(shù)實現(xiàn):重載函數(shù)和虛函數(shù)見見第第8章章OOP的基本特點C+語言程序設(shè)計清華大學(xué) 鄭莉13c+中的類中的類l類是具有相同屬性和行為的一組對象類是具有相同屬性和行為的一組對象的集合,它為屬于該類的全部對象提的集合,它為屬于該類的全部對象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬供了統(tǒng)一的抽象描述
7、,其內(nèi)部包括屬性和行為兩個主要部分。性和行為兩個主要部分。l利用類可以實現(xiàn)數(shù)據(jù)的封裝、隱藏、利用類可以實現(xiàn)數(shù)據(jù)的封裝、隱藏、繼承與派生。繼承與派生。l利用類易于編寫大型復(fù)雜程序,其模利用類易于編寫大型復(fù)雜程序,其模塊化程度比塊化程度比C中采用函數(shù)更高。中采用函數(shù)更高。類 和 對 象C+語言程序設(shè)計清華大學(xué) 鄭莉14類的聲明形式類的聲明形式 類是一種用戶自定義類型,聲明形式:類是一種用戶自定義類型,聲明形式:class 類名稱 public: 公有成員(外部接口) private: 私有成員 protected: 保護型成員類 和 對 象C+語言程序設(shè)計清華大學(xué) 鄭莉15公有類型成員公有類型成員
8、在關(guān)鍵字在關(guān)鍵字public后面聲明,它們是類后面聲明,它們是類與外部的接口,任何外部函數(shù)都可以訪與外部的接口,任何外部函數(shù)都可以訪問公有類型數(shù)據(jù)和函數(shù)。問公有類型數(shù)據(jù)和函數(shù)。類 和 對 象C+語言程序設(shè)計清華大學(xué) 鄭莉16私有類型成員私有類型成員在關(guān)鍵字在關(guān)鍵字private后面聲明,后面聲明,只允許只允許本類中的函數(shù)訪問,而類外部的任何函本類中的函數(shù)訪問,而類外部的任何函數(shù)都不能訪問。數(shù)都不能訪問。如果如果緊跟在類名稱的后面聲明私有成員,緊跟在類名稱的后面聲明私有成員,則則關(guān)鍵字關(guān)鍵字privateprivate可以可以省略。省略。類 和 對 象C+語言程序設(shè)計清華大學(xué) 鄭莉17保護類型保
9、護類型與與private類似,其差別表現(xiàn)在繼承與類似,其差別表現(xiàn)在繼承與派生時對派生類的影響不同,第七章講。派生時對派生類的影響不同,第七章講。類 和 對 象C+語言程序設(shè)計清華大學(xué) 鄭莉18類的成員類的成員class clock public: void setTime(int newH, int newM, int newS); void showTime(); private: int hour, hinute, second;類 和 對 象成員數(shù)據(jù)成員函數(shù)void Clock:setTime(int newH, int newM,void Clock:setTime(int newH,
10、 int newM,int newS) int newS) hour = newH; hour = newH; minute = newM; minute = newM; second = newS; second = newS; void Clock:showTime() void Clock:showTime() cout hour : minute : cout hour : minute : second;second; 19C+語言程序設(shè)計清華大學(xué) 鄭莉20成員數(shù)據(jù)成員數(shù)據(jù)l與一般的變量聲明相同,但需要將它與一般的變量聲明相同,但需要將它放在類的聲明體中。放在類的聲明體中。類 和 對
11、 象C+語言程序設(shè)計清華大學(xué) 鄭莉21成員函數(shù)成員函數(shù)l在類中說明原型,可以在類外給出函在類中說明原型,可以在類外給出函數(shù)體實現(xiàn),并在函數(shù)名前使用類名加數(shù)體實現(xiàn),并在函數(shù)名前使用類名加以限定。也可以直接在類中給出函數(shù)以限定。也可以直接在類中給出函數(shù)體,形成內(nèi)聯(lián)成員函數(shù)。體,形成內(nèi)聯(lián)成員函數(shù)。l允許聲明重載函數(shù)和帶默認(rèn)形參值的允許聲明重載函數(shù)和帶默認(rèn)形參值的函數(shù)函數(shù)類 和 對 象C+語言程序設(shè)計清華大學(xué) 鄭莉22內(nèi)聯(lián)成員函數(shù)內(nèi)聯(lián)成員函數(shù)l為了提高運行時的效率,對于較簡單為了提高運行時的效率,對于較簡單的函數(shù)可以聲明為內(nèi)聯(lián)形式。的函數(shù)可以聲明為內(nèi)聯(lián)形式。l內(nèi)聯(lián)函數(shù)體中不要有復(fù)雜結(jié)構(gòu)(如循內(nèi)聯(lián)函數(shù)體
12、中不要有復(fù)雜結(jié)構(gòu)(如循環(huán)語句和環(huán)語句和switch語句)。語句)。l在類中聲明內(nèi)聯(lián)成員函數(shù)的方式:在類中聲明內(nèi)聯(lián)成員函數(shù)的方式: 將函數(shù)體放在類的聲明中。 使用inline關(guān)鍵字。類 和 對 象C+語言程序設(shè)計清華大學(xué) 鄭莉23內(nèi)聯(lián)成員函數(shù)舉例內(nèi)聯(lián)成員函數(shù)舉例(一一)class Point class Point public: public: void init(int initX, int initY) void init(int initX, int initY) x = initX; x = initX; y = initY; y = initY; int getX() int get
13、X() return x; return x; int getY() int getY() return y; return y; private: private: int x, y; int x, y;類 和 對 象C+語言程序設(shè)計清華大學(xué) 鄭莉24內(nèi)聯(lián)成員函數(shù)舉例內(nèi)聯(lián)成員函數(shù)舉例(二二)class Point class Point public: public: void init(int initX, int initY); void init(int initX, int initY); int getX() int getX(); int getY()int getY(); pr
14、ivate:private: int x, y; int x, y;類 和 對 象inlineinline void Point: void Point: init(int initX,int initY) init(int initX,int initY) x = initX; x = initX; y = initY; y = initY; inlineinline int Point:getX() int Point:getX() return x; return x; inlineinline int Point:GetY() int Point:GetY() return y; re
15、turn y; 25C+語言程序設(shè)計清華大學(xué) 鄭莉26對象對象l類的對象是該類的某一特定實體,即類的對象是該類的某一特定實體,即類類型的變量。類類型的變量。l聲明形式:聲明形式: 類名類名 對象名;對象名;l例:例: Clock myClock;Clock myClock;類 和 對 象C+語言程序設(shè)計清華大學(xué) 鄭莉27類中成員的訪問方式類中成員的訪問方式l類中成員互訪類中成員互訪 直接使用成員名l類外訪問類外訪問 使用“對象名.成員名”方式訪問 public 屬性的成員類 和 對 象C+語言程序設(shè)計清華大學(xué) 鄭莉28例例4-1類的應(yīng)用舉例類的應(yīng)用舉例#include#includeusing
16、 namespace std;using namespace std;class Clock class Clock ./ ./類的聲明略類的聲明略 /./.類的實現(xiàn)略類的實現(xiàn)略int main() int main() Clock Clock myClockmyClock; ;myClock.setTimemyClock.setTime(8, 30, 30);(8, 30, 30);myClock.showTimemyClock.showTime();();return 0;return 0; 類 和 對 象C+語言程序設(shè)計清華大學(xué) 鄭莉29構(gòu)造函數(shù)構(gòu)造函數(shù)l構(gòu)造函數(shù)的作用是在對象被創(chuàng)建時使
17、構(gòu)造函數(shù)的作用是在對象被創(chuàng)建時使用特定的值構(gòu)造對象,或者說將對象用特定的值構(gòu)造對象,或者說將對象初始化初始化為一個特定的狀態(tài)。為一個特定的狀態(tài)。l在對象創(chuàng)建時在對象創(chuàng)建時由系統(tǒng)自動調(diào)用由系統(tǒng)自動調(diào)用。l如果程序中未聲明,則系統(tǒng)自動產(chǎn)生如果程序中未聲明,則系統(tǒng)自動產(chǎn)生出一個出一個隱含隱含的參數(shù)列表為空的構(gòu)造函的參數(shù)列表為空的構(gòu)造函數(shù)數(shù)l允許為允許為內(nèi)聯(lián)內(nèi)聯(lián)函數(shù)、函數(shù)、重載重載函數(shù)、函數(shù)、帶默認(rèn)帶默認(rèn)形參值形參值的函數(shù)的函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)C+語言程序設(shè)計清華大學(xué) 鄭莉30構(gòu)造函數(shù)舉例構(gòu)造函數(shù)舉例class Clock class Clock public:public:Clock(int ne
18、wH,int newM,int newS);/Clock(int newH,int newM,int newS);/構(gòu)造函數(shù)構(gòu)造函數(shù)void setTime(int newH, int newM, int newS);void setTime(int newH, int newM, int newS);void showTime();void showTime();private:private:int hour, minute, second;int hour, minute, second;構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)的實現(xiàn):構(gòu)造函數(shù)的實現(xiàn):Clock:Clock(int newH, int
19、 newM, int newS) Clock:Clock(int newH, int newM, int newS) hour = newH;hour = newH;minute = newM;minute = newM;second = newS;second = newS; 建立對象時構(gòu)造函數(shù)的作用:建立對象時構(gòu)造函數(shù)的作用:int main() int main() Clock c(0,0,0); Clock c(0,0,0); /隱含調(diào)用構(gòu)造函數(shù),將初始值作為實參。隱含調(diào)用構(gòu)造函數(shù),將初始值作為實參。 c.showTime();c.showTime();return 0;return
20、0; 31C+語言程序設(shè)計清華大學(xué) 鄭莉32拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)是一種特殊的構(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ù)C+語言程序設(shè)計清華大學(xué) 鄭莉33拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)(例例4-2)class Point public:Point(int xx=0, int yy=0) x = xx; y = yy; Point(Point&a
21、mp; p);int getX() return x; int getY() return y; private:int x, y;構(gòu)造函數(shù)和析構(gòu)函數(shù)Point:Point (Point& p) Point:Point (Point& p) x = p.x; x = p.x; y = p.y; y = p.y; cout Calling the copy constructor cout Calling the copy constructor endl; endl; 34C+語言程序設(shè)計清華大學(xué) 鄭莉35拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)(例例4-2)l當(dāng)用類的一個對象去初始化該類的另
22、一當(dāng)用類的一個對象去初始化該類的另一個對象時系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(shù)實個對象時系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(shù)實現(xiàn)拷貝賦值?,F(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)用拷貝構(gòu)造函數(shù)被調(diào)用 cout b.getX() endl; cout b.getX() endl; 構(gòu)造函數(shù)和析構(gòu)函數(shù)C+語言程序設(shè)計清華大學(xué) 鄭莉36拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)(例例4-2)l若函數(shù)的形參為類對象,調(diào)用函數(shù)時,若函數(shù)的形參為類對象,調(diào)用函數(shù)時,實參賦值給形參,系統(tǒng)自動調(diào)用拷貝實參
23、賦值給形參,系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(shù)。例如:構(gòu)造函數(shù)。例如:void fun1(Point p) void fun1(Point p) cout p.getX() endl; cout p.getX() endl; int main() int main() Point a(1, 2); Point a(1, 2); fun1(a); / fun1(a); /調(diào)用拷貝構(gòu)造函數(shù)調(diào)用拷貝構(gòu)造函數(shù) return 0;return 0; 構(gòu)造函數(shù)和析構(gòu)函數(shù)C+語言程序設(shè)計清華大學(xué) 鄭莉37拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)(例例4-2)l當(dāng)函數(shù)的返回值是類對象時,系統(tǒng)自動調(diào)當(dāng)函數(shù)的返回值是類對象時,系統(tǒng)自動調(diào)用
24、拷貝構(gòu)造函數(shù)。例如:用拷貝構(gòu)造函數(shù)。例如:Point fun2() Point fun2() Point a(1, 2); Point a(1, 2); return a; / return a; /調(diào)用拷貝構(gòu)造函數(shù)調(diào)用拷貝構(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ù)C+語言程序設(shè)計清華大學(xué) 鄭莉38隱含的拷貝構(gòu)造函數(shù)隱含的拷貝構(gòu)造函數(shù)如果程序員沒有為類聲明拷貝初始如果程序員沒有為類聲明拷貝初始化構(gòu)造函數(shù),則編譯器自己生成一個隱化構(gòu)造函數(shù),則編
25、譯器自己生成一個隱含的拷貝構(gòu)造函數(shù)。含的拷貝構(gòu)造函數(shù)。這個構(gòu)造函數(shù)執(zhí)行的功能是:用作這個構(gòu)造函數(shù)執(zhí)行的功能是:用作為初始值的對象的每個數(shù)據(jù)成員的值,為初始值的對象的每個數(shù)據(jù)成員的值,初始化將要建立的對象的對應(yīng)數(shù)據(jù)成員。初始化將要建立的對象的對應(yīng)數(shù)據(jù)成員。構(gòu)造函數(shù)和析構(gòu)函數(shù)C+語言程序設(shè)計清華大學(xué) 鄭莉39析構(gòu)函數(shù)析構(gòu)函數(shù)l完成對象被刪除前的一些清理工作。完成對象被刪除前的一些清理工作。l在對象的生存期結(jié)束的時刻系統(tǒng)自動在對象的生存期結(jié)束的時刻系統(tǒng)自動調(diào)用它,然后再釋放此對象所屬的空調(diào)用它,然后再釋放此對象所屬的空間。間。l如果程序中未聲明析構(gòu)函數(shù),編譯器如果程序中未聲明析構(gòu)函數(shù),編譯器將自動產(chǎn)
26、生一個隱含的析構(gòu)函數(shù)。將自動產(chǎn)生一個隱含的析構(gòu)函數(shù)。構(gòu)造函數(shù)和析構(gòu)函數(shù)C+語言程序設(shè)計清華大學(xué) 鄭莉40構(gòu)造函數(shù)和析構(gòu)函數(shù)舉例構(gòu)造函數(shù)和析構(gòu)函數(shù)舉例#include #include using namespace std;using namespace std;class Point class Point public:public: Point(int xx,int yy); Point(int xx,int yy); Point(); Point(); /. /.其他函數(shù)原型其他函數(shù)原型private:private: int x, y; int x, y;構(gòu)造函數(shù)和析構(gòu)函數(shù)Point
27、:Point(int xx,int yy) Point:Point(int xx,int yy) x = xx; x = xx; y = yy; y = yy; Point:Point() Point:Point() /./.其他函數(shù)的實現(xiàn)略其他函數(shù)的實現(xiàn)略41C+語言程序設(shè)計清華大學(xué) 鄭莉42類的應(yīng)用舉例類的應(yīng)用舉例(例例4-3)一圓形游泳池如圖所示,現(xiàn)在需在其周圍一圓形游泳池如圖所示,現(xiàn)在需在其周圍建一圓形過道,并在其四周圍上柵欄。柵欄價格建一圓形過道,并在其四周圍上柵欄。柵欄價格為為35元元/米,過道造價為米,過道造價為20元元/平方米。過道寬度平方米。過道寬度為為3米,游泳池半徑由鍵盤
28、輸入。要求編程計算米,游泳池半徑由鍵盤輸入。要求編程計算并輸出過道和柵欄的造價。并輸出過道和柵欄的造價。游泳池過道#include #include using namespace std;using namespace std;const float PI = 3.141593;const float PI = 3.141593;/給出給出p p的值的值const float FENCE_PRICE = 35;const float FENCE_PRICE = 35; /柵欄的單價柵欄的單價const float CONCRETE_PRICE = 20;/const float CONCRE
29、TE_PRICE = 20;/過道水泥單價過道水泥單價class Circle class Circle /聲明定義類聲明定義類Circle Circle 及其數(shù)據(jù)和方法及其數(shù)據(jù)和方法public:public:/外部接口外部接口Circle(float r);Circle(float r);/構(gòu)造函數(shù)構(gòu)造函數(shù)float circumference();float circumference(); /計算圓的周長計算圓的周長float area();float area();/計算圓的面積計算圓的面積private:private:/私有數(shù)據(jù)成員私有數(shù)據(jù)成員float radius;float
30、 radius;/圓半徑圓半徑;43/類的實現(xiàn)類的實現(xiàn)/構(gòu)造函數(shù)初始化數(shù)據(jù)成員構(gòu)造函數(shù)初始化數(shù)據(jù)成員radiusradiusCircle:Circle(float r) Circle:Circle(float r) radius = r;radius = r; /計算圓的周長計算圓的周長float Circle:circumference() float Circle:circumference() return 2 return 2 * * PI PI * * radius; radius; /計算圓的面積計算圓的面積float Circle:area() float Circle:area
31、() return PI return PI * * radius radius * * radius; radius; 44int main () int main () float radius;float radius;cout Enter the radius of the pool: ;cout radius;cin radius;Circle pool(radius);Circle pool(radius);/游泳池邊界游泳池邊界Circle poolRim(radius + 3);Circle poolRim(radius + 3);/柵欄柵欄 /計算柵欄造價并輸出計算柵欄造價并
32、輸出 float fenceCost = poolRim.circumference() float fenceCost = poolRim.circumference() * * FENCE_PRICE;FENCE_PRICE; cout Fencing Cost is $ fenceCost cout Fencing Cost is $ fenceCost endl;endl;45/計算過道造價并輸出計算過道造價并輸出float concreteCost = (poolRim.area() - pool.area() float concreteCost = (poolRim.area()
33、 - pool.area() * * CONCRETE_PRICE;CONCRETE_PRICE;cout Concrete Cost is $ concreteCost endl;cout Concrete Cost is $ concreteCost endl;return 0;return 0; 運行結(jié)果運行結(jié)果Enter the radius of the pool: 10Enter the radius of the pool: 10Fencing Cost is $2858.85Fencing Cost is $2858.85Concrete Cost is $4335.4Conc
34、rete Cost is $4335.446C+語言程序設(shè)計清華大學(xué) 鄭莉47組合的概念組合的概念l類中的成員數(shù)據(jù)是另一個類的對象。類中的成員數(shù)據(jù)是另一個類的對象。l可以在已有抽象的基礎(chǔ)上實現(xiàn)更復(fù)雜可以在已有抽象的基礎(chǔ)上實現(xiàn)更復(fù)雜的抽象。的抽象。類 的 組 合C+語言程序設(shè)計清華大學(xué) 鄭莉48舉例舉例class Point private: float x, y; /點的坐標(biāo)public: Point(float h, float v); /構(gòu)造函數(shù) float getX(); /取X坐標(biāo) float getY(); /取Y坐標(biāo) void draw(); /在(x,y)處畫點;/.函數(shù)的實現(xiàn)略
35、類 的 組 合class Line class Line private:private: Point p1, p2; / Point p1, p2; /線段的兩個端點線段的兩個端點public:public: Line(Point a, Point b); / Line(Point a, Point b); /構(gòu)造函數(shù)構(gòu)造函數(shù) void draw(void); /void draw(void); /畫出線段畫出線段;/./.函數(shù)的實現(xiàn)略函數(shù)的實現(xiàn)略49C+語言程序設(shè)計清華大學(xué) 鄭莉50類組合的構(gòu)造函數(shù)設(shè)計類組合的構(gòu)造函數(shù)設(shè)計l原則:不僅要負責(zé)對本類中的基本類型成原則:不僅要負責(zé)對本類中的基本
36、類型成員數(shù)據(jù)賦初值,也要對對象成員初始化。員數(shù)據(jù)賦初值,也要對對象成員初始化。l聲明形式:聲明形式:類名:類名(對象成員所需的形參,本類成員形參) :對象1(參數(shù)),對象2(參數(shù)),. 本類初始化 類 的 組 合C+語言程序設(shè)計清華大學(xué) 鄭莉51類組合的構(gòu)造函數(shù)調(diào)用類組合的構(gòu)造函數(shù)調(diào)用l構(gòu)造函數(shù)調(diào)用順序:先調(diào)用內(nèi)嵌對象的構(gòu)造函數(shù)調(diào)用順序:先調(diào)用內(nèi)嵌對象的構(gòu)造函數(shù)(按內(nèi)嵌時的聲明順序,先聲構(gòu)造函數(shù)(按內(nèi)嵌時的聲明順序,先聲明者先構(gòu)造)。然后調(diào)用本類的構(gòu)造函明者先構(gòu)造)。然后調(diào)用本類的構(gòu)造函數(shù)。(析構(gòu)函數(shù)的調(diào)用順序相反)數(shù)。(析構(gòu)函數(shù)的調(diào)用順序相反)l初始化列表中未出現(xiàn)的內(nèi)嵌對象,用默初始化列表中
37、未出現(xiàn)的內(nèi)嵌對象,用默認(rèn)構(gòu)造函數(shù)(即無形參的)初始化認(rèn)構(gòu)造函數(shù)(即無形參的)初始化l系統(tǒng)自動生成的隱含的默認(rèn)構(gòu)造函數(shù)中,系統(tǒng)自動生成的隱含的默認(rèn)構(gòu)造函數(shù)中,內(nèi)嵌對象全部用默認(rèn)構(gòu)造函數(shù)初始化內(nèi)嵌對象全部用默認(rèn)構(gòu)造函數(shù)初始化類 的 組 合C+語言程序設(shè)計清華大學(xué) 鄭莉52類的組合舉例(二)類的組合舉例(二)class Part /class Part /部件類部件類public:public: Part(); Part(); Part(int i); Part(int i); Part(); Part(); void Print(); void Print();private:private: i
38、nt val; int val;類 的 組 合class Whole class Whole public:public: Whole(); Whole(); Whole(int i, int j, int k); Whole(int i, int j, int k); Whole(); Whole(); void Print(); void Print();private:private: Part one; Part one; Part two; Part two; int date; int date;53Whole:Whole() Whole:Whole() date=0; date=
39、0; Whole:Whole(int i, int j, int k)Whole:Whole(int i, int j, int k) : two(i), one(j), date(k) : two(i), one(j), date(k)/./.其他函數(shù)的實現(xiàn)略其他函數(shù)的實現(xiàn)略54C+語言程序設(shè)計清華大學(xué) 鄭莉55前向引用聲明前向引用聲明l類應(yīng)該先聲明,后使用類應(yīng)該先聲明,后使用l如果需要在某個類的聲明之前,引用如果需要在某個類的聲明之前,引用該類,則應(yīng)進行前向引用聲明。該類,則應(yīng)進行前向引用聲明。l前向引用聲明只為程序引入一個標(biāo)識前向引用聲明只為程序引入一個標(biāo)識符,但具體聲明在其他地方。符,
40、但具體聲明在其他地方。類 的 組 合C+語言程序設(shè)計清華大學(xué) 鄭莉56前向引用聲明舉例前向引用聲明舉例class B; /class B; /前向引用聲明前向引用聲明class A class A public:public: void f(B b); void f(B b);class B class B public:public: void g(A a); void g(A a);類 的 組 合C+語言程序設(shè)計清華大學(xué) 鄭莉57前向引用聲明注意事項前向引用聲明注意事項l使用前向引用聲明雖然可以解決一些問題,但它使用前向引用聲明雖然可以解決一些問題,但它并不是萬能的。需要注意的是,盡管使用
41、了前向并不是萬能的。需要注意的是,盡管使用了前向引用聲明,但是在提供一個完整的類聲明之前,引用聲明,但是在提供一個完整的類聲明之前,不能聲明該類的對象,也不能在內(nèi)聯(lián)成員函數(shù)中不能聲明該類的對象,也不能在內(nèi)聯(lián)成員函數(shù)中使用該類的對象。請看下面的程序段:使用該類的對象。請看下面的程序段:class Fred; /前向引用聲明class Barney Fred x; /錯誤:類Fred的聲明尚不完善;class Fred Barney y;類 的 組 合C+語言程序設(shè)計清華大學(xué) 鄭莉58前向引用聲明注意事項前向引用聲明注意事項class Fred;class Fred;/前向引用聲明前向引用聲明 c
42、lass Barney class Barney public:public: void method() void method() x.yabbaDabbaDo(); x.yabbaDabbaDo();/錯誤:錯誤:FredFred類的對象在定義之前被使用類的對象在定義之前被使用 private: private: Fred &x;/ Fred &x;/正確,經(jīng)過前向引用聲明,可以聲明正確,經(jīng)過前向引用聲明,可以聲明FredFred類的對象引用類的對象引用; class Fred class Fred public:public: void yabbaDabbaDo();
43、void yabbaDabbaDo();private:private: Barney &y; Barney &y; ; 類 的 組 合C+語言程序設(shè)計清華大學(xué) 鄭莉59前向引用聲明注意事項前向引用聲明注意事項l應(yīng)該記?。寒?dāng)你使用前向引用聲明時,應(yīng)該記?。寒?dāng)你使用前向引用聲明時,你只能使用被聲明的符號,而不能涉你只能使用被聲明的符號,而不能涉及類的任何細節(jié)。及類的任何細節(jié)。類 的 組 合C+語言程序設(shè)計清華大學(xué) 鄭莉60UML簡介簡介lUMLUML語言是一種可視化的的面向?qū)ο蠼UZ語言是一種可視化的的面向?qū)ο蠼UZ言。言。lUMLUML有三個基本的部分有三個基本的部分事物(Th
44、ings)UML中重要的組成部分,在模型中屬于最靜態(tài)的部分,代表概念上的或物理上的元素關(guān)系(Relationships)關(guān)系把事物緊密聯(lián)系在一起圖(Diagrams)圖是很多有相互相關(guān)的事物的組UML圖形標(biāo)識C+語言程序設(shè)計清華大學(xué) 鄭莉61UML中有中有4種類型的事物種類型的事物l結(jié)構(gòu)事物(結(jié)構(gòu)事物(Structural thingsStructural things)l動作事物(動作事物(Behavioral thingsBehavioral things)l分組事物(分組事物(Grouping thingsGrouping things)l注釋事物(注釋事物(Annotational t
45、hingsAnnotational things)UML圖形標(biāo)識C+語言程序設(shè)計清華大學(xué) 鄭莉62UML中的關(guān)系中的關(guān)系l依賴(依賴(DependenciesDependencies) l關(guān)聯(lián)(關(guān)聯(lián)(AssociationAssociation) l泛化(泛化(GeneralizationGeneralization) l實現(xiàn)(實現(xiàn)(RealizationRealization)UML圖形標(biāo)識C+語言程序設(shè)計清華大學(xué) 鄭莉63UML中的中的9種圖種圖l類圖(類圖(Class diagramClass diagram)l對象圖(對象圖(Object diagramObject diagram)l
46、用例圖(用例圖(Use case diagramUse case diagram)l順序圖(順序圖(Sequence diagramSequence diagram)l協(xié)作圖(協(xié)作圖(Collaboration diagramCollaboration diagram)l狀態(tài)圖(狀態(tài)圖(Statechart diagramStatechart diagram)l活動圖(活動圖(Activity diagramActivity diagram)l組件圖(組件圖(Component diagramComponent diagram)l實施圖(實施圖(Deployment diagramDeploy
47、ment diagram)UML圖形標(biāo)識C+語言程序設(shè)計清華大學(xué) 鄭莉64類圖類圖l舉例:舉例:ClockClock類的完整表示類的完整表示lClockClock類的簡潔表示類的簡潔表示Clock- hour : int- minute : int- second : int+ showTime() : void+ setTime(newH:int=0,newM:int=0,newS:int=0):voidClockUML圖形標(biāo)識C+語言程序設(shè)計清華大學(xué) 鄭莉65對象圖對象圖myClock : Clock- hour : int- minute : int- second : intmyClo
48、ck : ClockUML圖形標(biāo)識C+語言程序設(shè)計清華大學(xué) 鄭莉66類與對象關(guān)系的圖形標(biāo)識類與對象關(guān)系的圖形標(biāo)識l依賴關(guān)系依賴關(guān)系圖中的“類A”是源,“類B”是目標(biāo),表示“類A”使用了“類B”,或稱“類A”依賴“類B”類 A類 BUML圖形標(biāo)識C+語言程序設(shè)計清華大學(xué) 鄭莉67類與對象關(guān)系的圖形標(biāo)識類與對象關(guān)系的圖形標(biāo)識l作用關(guān)系作用關(guān)系關(guān)聯(lián)關(guān)聯(lián)圖中的“重數(shù)A”決定了類B的每個對象與類A的多少個對象發(fā)生作用,同樣“重數(shù)B”決定了類A的每個對象與類B的多少個對象發(fā)生作用。類 A重數(shù)A類 B重數(shù)BUML圖形標(biāo)識C+語言程序設(shè)計清華大學(xué) 鄭莉68類與對象關(guān)系的圖形標(biāo)識類與對象關(guān)系的圖形標(biāo)識l包含關(guān)系
49、包含關(guān)系聚集和組合聚集和組合類 A類 B重數(shù)A重數(shù)B類 A類 B重數(shù)A重數(shù)B聚集表示類之間的關(guān)系是整體與部分的關(guān)系,“包含”、“組成”、“分為部分”等都是聚集關(guān)系。UML圖形標(biāo)識C+語言程序設(shè)計清華大學(xué) 鄭莉69類與對象關(guān)系的圖形標(biāo)識類與對象關(guān)系的圖形標(biāo)識l繼承關(guān)系繼承關(guān)系泛化泛化父類 A父類 B子類 1子類 2UML圖形標(biāo)識C+語言程序設(shè)計清華大學(xué) 鄭莉70注釋注釋l在在UML圖形上,注釋表示為帶有褶角圖形上,注釋表示為帶有褶角的矩形,然后用虛線連接到的矩形,然后用虛線連接到UML的其的其他元素上,它是一種用于在圖中附加他元素上,它是一種用于在圖中附加文字注釋的機制。文字注釋的機制。注釋文字
50、UML圖形標(biāo)識C+語言程序設(shè)計清華大學(xué) 鄭莉結(jié)構(gòu)體結(jié)構(gòu)體l結(jié)構(gòu)體是一種特殊形態(tài)的類結(jié)構(gòu)體是一種特殊形態(tài)的類 與類的唯一區(qū)別:類的缺省訪問權(quán)限是private,結(jié)構(gòu)體的缺省訪問權(quán)限是public 結(jié)構(gòu)體存在的主要原因:與C語言保持兼容l什么時候用結(jié)構(gòu)體而不用類什么時候用結(jié)構(gòu)體而不用類 定義主要用來保存數(shù)據(jù)、而沒有什么操作的類型 人們習(xí)慣將結(jié)構(gòu)體的數(shù)據(jù)成員設(shè)為公有,因此這時用結(jié)構(gòu)體更方便71結(jié)構(gòu)體與聯(lián)合體C+語言程序設(shè)計清華大學(xué) 鄭莉結(jié)構(gòu)體的定義和初始化結(jié)構(gòu)體的定義和初始化l結(jié)構(gòu)體定義結(jié)構(gòu)體定義struct 結(jié)構(gòu)體名稱 公有成員protected: 保護型成員private: 私有成員;l一些結(jié)構(gòu)
51、體變量的初始化可以用以下形式一些結(jié)構(gòu)體變量的初始化可以用以下形式類型名 變量名 = 成員數(shù)據(jù)1初值, 成員數(shù)據(jù)2初值, ;72結(jié)構(gòu)體與聯(lián)合體C+語言程序設(shè)計清華大學(xué) 鄭莉結(jié)構(gòu)體舉例結(jié)構(gòu)體舉例(例例4-7)#include #include #include #include #include #include using namespace std;using namespace std;struct Student struct Student /學(xué)生信息結(jié)構(gòu)體學(xué)生信息結(jié)構(gòu)體int num;int num;/學(xué)號學(xué)號string name;string name;/姓名,字符串對象,將在第姓
52、名,字符串對象,將在第6 6章章詳細介紹詳細介紹char sex;char sex;/性別性別int age;int age;/年齡年齡;73結(jié)構(gòu)體與聯(lián)合體C+語言程序設(shè)計清華大學(xué) 鄭莉結(jié)構(gòu)體舉例結(jié)構(gòu)體舉例(例例4-7)int main() int main() Student stu = 97001, Lin Lin, F, 19 ;Student stu = 97001, Lin Lin, F, 19 ;cout Num: stu.num endl;cout Num: stu.num endl;cout Name: endl;cout Name: end
53、l;cout Sex: stu.sex endl;cout Sex: stu.sex endl;cout Age: stu.age endl;cout Age: stu.age endl;return 0;return 0; 運行結(jié)果:運行結(jié)果:Num: 97001Num: 97001Name: Lin LinName: Lin LinSex: FSex: FAge: 19Age: 1974結(jié)構(gòu)體與聯(lián)合體C+語言程序設(shè)計清華大學(xué) 鄭莉聯(lián)合體聯(lián)合體l聲明形式聲明形式union 聯(lián)合體名稱 公有成員protected: 保護型成員private: 私有成員;l特點:特點: 成員共用相同的內(nèi)存單元
54、任何兩個成員不會同時有效75結(jié)構(gòu)體與聯(lián)合體C+語言程序設(shè)計清華大學(xué) 鄭莉聯(lián)合體的內(nèi)存分配聯(lián)合體的內(nèi)存分配union Mark /表示成績的聯(lián)合體char grade;/等級制的成績bool pass;/只記是否通過課程的成績int percent; /百分制的成績;76Markgradepercentpass結(jié)構(gòu)體與聯(lián)合體C+語言程序設(shè)計清華大學(xué) 鄭莉77無名聯(lián)合無名聯(lián)合l無名聯(lián)合沒有標(biāo)記名,只是聲明一個成員無名聯(lián)合沒有標(biāo)記名,只是聲明一個成員項的集合,這些成員項具有相同的內(nèi)存地項的集合,這些成員項具有相同的內(nèi)存地址,可以由成員項的名字直接訪問。址,可以由成員項的名字直接訪問。l例:例:uni
55、on int i; float f;在程序中可以這樣使用:i = 10;f = 2.2;結(jié)構(gòu)體與聯(lián)合體C+語言程序設(shè)計清華大學(xué) 鄭莉聯(lián)合體舉例聯(lián)合體舉例(例例4-8)#include #include #include #include using namespace std;using namespace std;class ExamInfo class ExamInfo private:private:string name;string name;/課程名稱課程名稱enum GRADE, PASS, PERCENTAGE mode;/enum GRADE, PASS, PERCENTAG
56、E mode;/采用何種計分采用何種計分方式方式union union char grade;char grade;/等級制的成績等級制的成績bool pass;bool pass;/只記是否通過課程的成績只記是否通過課程的成績int percent;int percent;/百分制的成績百分制的成績;78結(jié)構(gòu)體與聯(lián)合體C+語言程序設(shè)計清華大學(xué) 鄭莉聯(lián)合體舉例聯(lián)合體舉例(例例4-8)public:public:/三種構(gòu)造函數(shù),分別用等級、是否通過和百分初始化三種構(gòu)造函數(shù),分別用等級、是否通過和百分初始化ExamInfo(string name, char grade)ExamInfo(stri
57、ng name, char grade): name(name), mode(GRADE), grade(grade) : name(name), mode(GRADE), grade(grade) ExamInfo(string name, bool pass)ExamInfo(string name, bool pass): name(name), mode(PASS), pass(pass) : name(name), mode(PASS), pass(pass) ExamInfo(string name, int percent)ExamInfo(string name, int pe
58、rcent): name(name), mode(PERCENTAGE), percent(percent) : name(name), mode(PERCENTAGE), percent(percent) void show();void show(); 79結(jié)構(gòu)體與聯(lián)合體C+語言程序設(shè)計清華大學(xué) 鄭莉聯(lián)合體舉例聯(lián)合體舉例(例例4-8)void ExamInfo:show() void ExamInfo:show() cout name : ;cout name : ;switch (mode) switch (mode) case GRADE: cout grade; break; cas
59、e GRADE: cout grade; break; case PASS: cout (pass ? PASS : case PASS: cout (pass ? PASS : FAIL); break;FAIL); break; case PERCENTAGE: cout percent; break; case PERCENTAGE: cout percent; break; cout endl;cout endl; 80結(jié)構(gòu)體與聯(lián)合體C+語言程序設(shè)計清華大學(xué) 鄭莉聯(lián)合體舉例聯(lián)合體舉例(例例4-8)int main() int main() ExamInfo course1(Englis
60、h, B);ExamInfo course1(English, B);ExamInfo course2(Calculus, true);ExamInfo course2(Calculus, true);ExamInfo course3(C+ Programming, 85);ExamInfo course3(C+ Programming, 85);course1.show();course1.show();course2.show();course2.show();course3.show();course3.show();return 0;return 0; 運行結(jié)果:運行結(jié)果:English: BEnglish: BCalculus: PASSCalcu
溫馨提示
- 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 宿舍創(chuàng)意活動方案
- 定制口罩捐贈活動方案
- 家居誠信活動方案
- 寶安無煙日活動方案
- 親子互動活動行業(yè)深度調(diào)研及發(fā)展項目商業(yè)計劃書
- 醫(yī)療旅游定制服務(wù)行業(yè)跨境出海項目商業(yè)計劃書
- 高效除臭劑環(huán)保配方企業(yè)制定與實施新質(zhì)生產(chǎn)力項目商業(yè)計劃書
- 人造石材路緣石防滑設(shè)計創(chuàng)新創(chuàng)業(yè)項目商業(yè)計劃書
- 三年級心理健康測評實施計劃
- 科技公司人事部門職責(zé)
- 2025年廣東省佛山市順德區(qū)中考二模物理試題(含答案)
- 研發(fā)項目變更管理制度
- 2024-2025學(xué)年下學(xué)期小學(xué)數(shù)學(xué)人教版三年級期末必刷??碱}之復(fù)式統(tǒng)計表
- 瑞幸大學(xué)題目及答案
- 消防監(jiān)督檢查員崗位技能考核題庫
- 2025年湖北武漢市青山區(qū)區(qū)管國有企業(yè)招聘筆試參考題庫含答案解析
- 自主招生試題及答案網(wǎng)
- 2025年高考江蘇卷物理真題(解析版)
- 2025年重慶市中考化學(xué)試卷真題(含標(biāo)準(zhǔn)答案)
- 2025至2030中國光電共封裝(CPO)行業(yè)投融資風(fēng)險及發(fā)展前景分析報告
- 四川阿壩州公開招聘社區(qū)工作者考試高頻題庫帶答案2025年
評論
0/150
提交評論