版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、面向?qū)ο蟪绦蛟O(shè)計第 3 章 面向?qū)ο蟪绦蛟O(shè)計【學(xué)習(xí)目標(biāo)】【學(xué)習(xí)目標(biāo)】 l l理解對象和類的概念理解對象和類的概念l l定義并實例化類對象定義并實例化類對象l l理解類的繼承理解類的繼承l(wèi) l掌握類的靜態(tài)數(shù)據(jù)成員和靜態(tài)方法掌握類的靜態(tài)數(shù)據(jù)成員和靜態(tài)方法l l掌握運算符重載技術(shù)掌握運算符重載技術(shù)補(bǔ)充:虛函數(shù)補(bǔ)充:虛函數(shù)面向?qū)ο蟪绦蛟O(shè)計【學(xué)習(xí)導(dǎo)航】【學(xué)習(xí)導(dǎo)航】 面向?qū)ο蟪绦蛟O(shè)計【知識框架】【知識框架】 面向?qū)ο蟪绦蛟O(shè)計理解對象和類的概念理解類的繼承運算符重載技術(shù)定義并實例化類對象類的靜態(tài)數(shù)據(jù)成員和靜態(tài)方法面向?qū)ο蟪绦蛟O(shè)計【參考書籍】【參考書籍】 1.C/C+程序設(shè)計教程 龔沛曾,楊志強(qiáng) 高等教育出版
2、社2.C+程序設(shè)計 譚浩強(qiáng) 清華大學(xué)出版社面向?qū)ο蟪绦蛟O(shè)計本章目錄n3.1 類和對象n3.2 類的繼承n3.3 類的高級方法n3.4 類模板n3.5 異常處理n3.6 課后練習(xí)面向?qū)ο蟪绦蛟O(shè)計3.1 類和對象n深入理解類和對象n類的定義n類的實例化對象n類成員的訪問n類成員的訪問權(quán)限n構(gòu)造函數(shù)n析構(gòu)函數(shù)nthis指針面向?qū)ο蟪绦蛟O(shè)計深入理解類和對象 世界中的各種事物,如花、鳥、魚、蟲,都有自己的特征?;ň哂忻利惖纳?,鳥具有一對翅膀這些事物也都有自己的行為,花能夠生長,鳥能夠鳴叫,魚能夠游動在面向?qū)ο蟪绦蛟O(shè)計中,將事物的特征和行為組織在一起,便形成了類。在類中,事物的特征被描述為數(shù)據(jù)成員,行為
3、被描述為方法。 類的本質(zhì):一種自定義的數(shù)據(jù)結(jié)構(gòu)面向?qū)ο蟪绦蛟O(shè)計回顧結(jié)構(gòu)體n一個描述“狗”的結(jié)構(gòu)體struct Dog unsigned int m_Age; unsigned int m_Weight;面向?qū)ο蟪绦蛟O(shè)計類的定義類是結(jié)構(gòu)體的擴(kuò)展,除了成員變量,還可以有成員函數(shù)。一個描述“狗”的類:class CDog /數(shù)據(jù)成員 unsigned int m_Age; unsigned int m_Weight; /方法 void yelp();面向?qū)ο蟪绦蛟O(shè)計引例class CDogpublic: /成員變量 unsigned int m_Weight; unsigned int m_Age;
4、 /成員函數(shù)void yelp()printf(汪汪!n);void main(int argc, char* argv) CDog mydog; mydog.m_Age = 2; mydog.m_Weight = 4; printf(Age=%dn,mydog.m_Age); printf(Weight=%dn, mydog.m_Weight); mydog.yelp();面向?qū)ο蟪绦蛟O(shè)計類的實例化對象 對象是類的實例化。在聲明一個類時,并沒有為其分配內(nèi)存空間,只有在實例化一個對象時,才為對象分配空間。聲明一個對象和聲明一個整型變量類似。 下面聲明了一個整型變量i和一個CDog類對象mydo
5、g。 int i; CDog mydog;/聲明一個對象面向?qū)ο蟪绦蛟O(shè)計類成員的訪問 在定義一個類的對象之后,就可以通過對象訪問類的成員了。在對象之后使用“.”運算符訪問類成員。 下面的代碼演示了如何設(shè)置mydog的a_Age成員變量,如何調(diào)用mydog的yelp方法。 mydog.m_Age = 2; mydog.yelp();面向?qū)ο蟪绦蛟O(shè)計類成員的訪問權(quán)限類成員有三種訪問權(quán)限(安全級別)1.public(公有) 類內(nèi)可訪問,對象可訪問類內(nèi)可訪問,對象可訪問 一般可讓用戶隨意使用的成員可設(shè)置成public2.private(私有) 類內(nèi)可訪問,對象不可訪問類內(nèi)可訪問,對象不可訪問 不希望用
6、戶隨意操作(例如怕造成不良后果)的成員可設(shè)置成tected(保護(hù)) (下節(jié)詳解)面向?qū)ο蟪绦蛟O(shè)計類成員的訪問權(quán)限class CDog /私有成員 unsigned int m_Age;protected: /保護(hù)成員 unsigned int m_Weight; int main(int argc, char* argv) CDog mydog; mydog.m_Age = 2; /錯誤,不能訪問私有成員 mydog.m_Weight = 10; /錯誤,不能訪問保護(hù)成員 return 0;面向?qū)ο蟪绦蛟O(shè)計構(gòu)造函數(shù) 在建立一個對象時,常常需要對對象進(jìn)行初始化,為了進(jìn)行初
7、始化工作,C+提供了一個特殊的成員函數(shù)構(gòu)造函數(shù)(constructor)。 構(gòu)造函數(shù)是一個與類名相同的方法,可以根據(jù)需要設(shè)置參數(shù),但不具有返回值. 在開發(fā)程序時,用戶可以自己定義一個默認(rèn)的構(gòu)造函數(shù),只要構(gòu)造函數(shù)沒有任何參數(shù)就可以了。 下面的代碼定義了一個CDog類,在該類中定義一個默認(rèn)的構(gòu)造函數(shù),用于初始化成員變量。面向?qū)ο蟪绦蛟O(shè)計構(gòu)造函數(shù)例子classCDogpublic:unsignedintm_Weight;unsignedintm_Age;CDog();/默認(rèn)構(gòu)造函數(shù)默認(rèn)構(gòu)造函數(shù);CDog:CDog()m_Age=1;m_Weight=2;printf(constructinstanc
8、en);intmain(intargc,char*argv)CDogmydog;/調(diào)用默認(rèn)的構(gòu)造函數(shù)調(diào)用默認(rèn)的構(gòu)造函數(shù)printf(%d,mydog.m_Age);return0;面向?qū)ο蟪绦蛟O(shè)計構(gòu)造函數(shù)編譯器除了提供默認(rèn)的構(gòu)造函數(shù)外,還提供了默認(rèn)的復(fù)制構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù)。在一個函數(shù)中,按值傳遞一個對象或是將對象作為函數(shù)的返回值,均會調(diào)用類的復(fù)制構(gòu)造函數(shù)。所有的復(fù)制構(gòu)造函數(shù)均只有一個參數(shù),即該類的對象的引用。因為復(fù)制構(gòu)造函數(shù)的目的是生成一個對象的拷貝,所以參數(shù)是類的對象的常量引用,即在復(fù)制構(gòu)造函數(shù)中不允許修改參數(shù)。下面的代碼聲明了一個CDog類的復(fù)制構(gòu)造函數(shù)。CDog(const CDog
9、& theDog)當(dāng)按值傳遞一個對象作為函數(shù)參數(shù)或者函數(shù)返回一個對象時,編譯器將調(diào)用復(fù)制構(gòu)造函數(shù)重新構(gòu)造一個對象。下面的代碼演示了復(fù)制構(gòu)造函數(shù)的調(diào)用。在CDog類中定義一個復(fù)制構(gòu)造函數(shù),并在函數(shù)中輸出一個語句。面向?qū)ο蟪绦蛟O(shè)計析構(gòu)函數(shù)析構(gòu)函數(shù)是與構(gòu)造函數(shù)是相對的,它是在對象被撤銷后清除并釋放所分配的內(nèi)存。析構(gòu)函數(shù)與類同名,只是前面有一個“”號。析構(gòu)函數(shù)沒有返回值,也沒有參數(shù)。例如,CDog類的析構(gòu)函數(shù)聲明:CDog();面向?qū)ο蟪绦蛟O(shè)計析構(gòu)函數(shù)例子class CDog CDog();CDog:CDog() printf(destructor function was invokedn)
10、; Main() 面向?qū)ο蟪绦蛟O(shè)計3.2 類的繼承n單一繼承n多重繼承n虛繼承面向?qū)ο蟪绦蛟O(shè)計單一繼承 面向?qū)ο蟮淖畲筇攸c是實現(xiàn)了繼承。開發(fā)人員能夠根據(jù)已有類派生一個新類,新類繼承了父類所有公有和受保護(hù)的數(shù)據(jù)成員和方法。類的繼承是指派生類可以全部或者部分的繼承基類的特征,同時加入所需要的新特征和功能。簡單來說,派生類可以有選擇的繼承基類的某些數(shù)據(jù)成員和方法,同時定義一些新的數(shù)據(jù)成員和方法。新的類繼承了原有類的特性,被稱為原有類的派生類或子類,原有類被稱為新類的基類或父類。而單繼承就是以一個基類派生新類。 在派生一個新類時,使用class關(guān)鍵字,其后是類名稱、冒號、訪問限定符(public、pr
11、ivate、protected)、基類名稱。面向?qū)ο蟪绦蛟O(shè)計單一繼承 class CAnimalprotected: char* m_Name;/名稱 char* m_Color;/顏色public: char* GetName(); char* GetColor(); void SetName(char* name); void SetColor(char* color); void Move(); CAnimal(); CAnimal(); char* CAnimal:GetName() return m_Name; char* CAnimal:GetColor() return m_Co
12、lor; void CAnimal:SetName(char* name) strcpy(m_Name,name); 面向?qū)ο蟪绦蛟O(shè)計單一繼承void CAnimal:SetColor(char* color) strcpy(m_Color,color); CAnimal:CAnimal() m_Name = new char5; m_Color = new char5; CAnimal:CAnimal() delete m_Name; delete m_Color; void CAnimal:Move() printf(Animal is movingn);現(xiàn)在,定義一個CDog類,該類繼承
13、于CAnimal類。這樣,CDog類就擁有了CAnimal類的所有非私有的數(shù)據(jù)成員和方法。 面向?qū)ο蟪绦蛟O(shè)計單一繼承class CDog : public CAnimalprotected: char* m_Kind;public: char* GetKind(); void SetKind(char* kind); void yelp(); CDog(); CDog(); void CDog:yelp() printf(Dog can yelp);CDog:CDog() m_Kind = new char10;char* CDog:GetKind() return m_Kind; void
14、CDog:SetKind(char* kind) strcpy(m_Kind,kind);CDog:CDog() delete m_Kind;面向?qū)ο蟪绦蛟O(shè)計單一繼承下面的代碼演示了CDog類調(diào)用基類的Move方法。int main(int argc, char* argv) CDog dog; dog.SetColor(白色); dog.SetName(狗); dog.Move(); /調(diào)用基類的方法 dog.yelp(); /調(diào)用自身的方法 return 0;/運行結(jié)果:Animal is movingDog can yelp面向?qū)ο蟪绦蛟O(shè)計protected訪問權(quán)限類成員有三種訪問權(quán)限(
15、安全級別)1.public(公有) 本類內(nèi)可訪問,本類內(nèi)可訪問,子類內(nèi)可訪問,子類內(nèi)可訪問,對象可訪問對象可訪問2.private(私有) 本類內(nèi)可訪問,本類內(nèi)可訪問,子類內(nèi)不可訪問,子類內(nèi)不可訪問,對象不可訪問對象不可訪問3.protected(保護(hù)) 本類內(nèi)可訪問,子類內(nèi)可訪問,對象不可訪問本類內(nèi)可訪問,子類內(nèi)可訪問,對象不可訪問例例1 1:改寫:改寫Animal-DogAnimal-Dog例例例例2 2:HomeHome面向?qū)ο蟪绦蛟O(shè)計3.3 類的高級方法 繼承是一種編程技術(shù),可以從現(xiàn)有類中構(gòu)造一個新類,通過新類來實現(xiàn)面向?qū)ο蟮某绦蛟O(shè)計。本節(jié)將從淺入深地介紹類的繼承。 n內(nèi)聯(lián)方法n靜態(tài)數(shù)
16、據(jù)成員和靜態(tài)方法n友元類和友元函數(shù)nconst方法n運算符重載面向?qū)ο蟪绦蛟O(shè)計內(nèi)聯(lián)方法 在C+中,你可以編寫像內(nèi)聯(lián)函數(shù)一樣的內(nèi)聯(lián)方法,只需要在方法返回值前添加inline關(guān)鍵字。class CManpublic: void run();inline void CMan:run() printf(man can runn);也可以將方法的定義放在類的聲明中,此時該方法自動成為內(nèi)聯(lián)方法。class CManpublic: void run()printf(man can runn); /inline 方法;方法run自動成為內(nèi)聯(lián)方法。面向?qū)ο蟪绦蛟O(shè)計靜態(tài)數(shù)據(jù)成員和靜態(tài)方法 在C+中可以定義靜態(tài)成員
17、數(shù)據(jù),所謂靜態(tài)成員數(shù)據(jù)是指其數(shù)據(jù)屬于類的,通過類名就可以訪問成員數(shù)據(jù)。在聲明類成員數(shù)據(jù)時,只要在類型前添加static關(guān)鍵字,該成員數(shù)據(jù)就變?yōu)殪o態(tài)成員數(shù)據(jù)。下面的代碼定義了一個CMan類,在該類中定義了一個整型靜態(tài)成員變量。class CManpublic: static int data;如前所述,靜態(tài)數(shù)據(jù)成員不僅可以由對象訪問,也可以由類訪問。面向?qū)ο蟪绦蛟O(shè)計下面的代碼演示了如何通過類名設(shè)置和訪問靜態(tài)成員數(shù)據(jù)。class CManpublic: static int data;int CMan:data = 1;/初始化靜態(tài)成員int main(int argc, char* argv)
18、CMan:data = 10; printf(%d,CMan:data); return 0;/運行結(jié)果:10面向?qū)ο蟪绦蛟O(shè)計靜態(tài)數(shù)據(jù)成員和靜態(tài)方法靜態(tài)成員數(shù)據(jù)被多個對象所共有,無論定義多少個對象,內(nèi)存中的靜態(tài)成員只有一個。因此,當(dāng)一個對象修改了靜態(tài)成員數(shù)據(jù),另一個對象在訪問靜態(tài)成員數(shù)據(jù)時,也會發(fā)生變化。class CManpublic: static int data; int CMan:data = 1; int main(int argc, char* argv) CMan man1,man2; man1.data = 5; printf(%d,man2.data); printf(n)
19、; man2.data = 10; printf(%d,man1.data); printf(n); return 0;面向?qū)ο蟪绦蛟O(shè)計靜態(tài)數(shù)據(jù)成員和靜態(tài)方法靜態(tài)方法與靜態(tài)成員數(shù)據(jù)一樣,可以由類直接調(diào)用。聲明靜態(tài)方法與聲明普通方法相似,只是在方法返回值類型前添加static關(guān)鍵字。下面的代碼定義了一個CMan類,在該類中定義了一個靜態(tài)成員變量和一個靜態(tài)成員方法。class CManpublic: static int data; static int getdata();/靜態(tài)方法; int CMan:getdata() return data;int CMan:data = 1; int m
20、ain(int argc, char* argv) CMan man1; man1.data = 5; printf(%d,CMan:getdata();/由類名直接調(diào)用靜態(tài)方法 printf(n); return 0;面向?qū)ο蟪绦蛟O(shè)計類的多態(tài)性n發(fā)出同樣的消息被不同類型的對象接收時導(dǎo)致完發(fā)出同樣的消息被不同類型的對象接收時導(dǎo)致完全不同的行為。全不同的行為。函數(shù)重載(已有知識)函數(shù)重載(已有知識)運算符重載運算符重載基于虛函數(shù)的多態(tài)性基于虛函數(shù)的多態(tài)性面向?qū)ο蟪绦蛟O(shè)計運算符重載C+提供了運算符重載的功能,在可以在類中重載某個運算符,這樣就可以運算符作用與類對象。運算符重載的格式為:返回值類型
21、operator 運算符 參數(shù)列表。例如:int operator +();重載+運算符實現(xiàn)自加操作 例子 p82面向?qū)ο蟪绦蛟O(shè)計運算符重載CMan CMan:operator +(CMan& one )CMan* temp = new CMan;temp-age = age+one.getage();temp-height = height+one.getheight();return *temp;int main(int argc, char* argv)man3= man1+man2;面向?qū)ο蟪绦蛟O(shè)計補(bǔ)充:虛函數(shù)n虛函數(shù)說明方式虛函數(shù)說明方式 虛函數(shù)是動態(tài)聯(lián)編的基礎(chǔ),它是一種非虛
22、函數(shù)是動態(tài)聯(lián)編的基礎(chǔ),它是一種非staticstatic的成員函的成員函數(shù)實現(xiàn)動態(tài)聯(lián)編的條件數(shù)實現(xiàn)動態(tài)聯(lián)編的條件virtual 類型說明符類型說明符 函數(shù)名函數(shù)名 ( (參數(shù)表參數(shù)表) )基基類中有說明的類中有說明的虛函數(shù)虛函數(shù)調(diào)用虛函數(shù)操作的只能是對象指針或?qū)ο笠?,調(diào)用虛函數(shù)操作的只能是對象指針或?qū)ο笠?,否則仍為靜態(tài)聯(lián)編否則仍為靜態(tài)聯(lián)編面向?qū)ο蟪绦蛟O(shè)計#includeiostream.hclassAnimalpublic:voidcharacter()cout動物特征動物特征: :不同不同.n;virtualvoidfood()cout動物食物動物食物: :不同不同.n;classGir
23、affe:publicAnimalpublic:voidcharacter()cout長頸鹿特征長頸鹿特征: :長頸長頸.n;virtualvoidfood()cout長頸鹿食物長頸鹿食物: :樹葉樹葉.n;classElephant:publicAnimalpublic:voidcharacter()cout大象特征大象特征: :長鼻子長鼻子.n;virtualvoidfood()coutcharacter();p-food();voidmain()Giraffeg;f(&g);/實參為派生類對象的地址實參為派生類對象的地址Elephante;f(&e);/實參為派生類對象的
24、地址實參為派生類對象的地址觀察運行結(jié)果觀察運行結(jié)果 例例 虛函數(shù)示例程序虛函數(shù)示例程序 面向?qū)ο蟪绦蛟O(shè)計voidf(Animal&p)/形參為基類形參為基類對象的引用對象的引用p.character();p.food();voidmain()Giraffeg;f(g);/實參為派生類對象實參為派生類對象Elephante;f(e);/實參為派生類對象實參為派生類對象voidf(Animalp)/形參為基類形參為基類對象對象p.character();p.food();voidmain()Giraffeg;f(g);/實參為派生類對象實參為派生類對象Elephante;f(e);/實參為派生類對象實參為派生類對象若將程序的相應(yīng)部分修改為如下兩種形式,再觀察運行結(jié)果若將程序的相應(yīng)部分修改為如下兩種形式,再觀察運行結(jié)果面向?qū)ο蟪绦蛟O(shè)計從上述程序中可見:從上述程序中可見: 只有當(dāng)虛函數(shù)操作的是指向?qū)ο蟮闹羔樆蚴菍ο蟮囊脮r,只有當(dāng)虛函數(shù)操作的是指向?qū)ο蟮闹羔樆蚴菍ο蟮囊脮r,對該虛函數(shù)調(diào)用采取的才是動態(tài)聯(lián)編。對該虛函數(shù)調(diào)用采取的才是動態(tài)聯(lián)編。虛函數(shù)使用說明:虛函數(shù)使用說明:派生類中
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《學(xué)前教育概述》課件
- 單位管理制度集合大合集【人力資源管理篇】十篇
- 單位管理制度分享匯編【員工管理篇】十篇
- 單位管理制度分享大全【人員管理篇】
- 單位管理制度范例選集【員工管理】
- 單位管理制度范例合集【人力資源管理篇】十篇
- 單位管理制度呈現(xiàn)合集【員工管理篇】
- 單位管理制度呈現(xiàn)大合集【人事管理】十篇
- 《微點精析》考向19 文化常識 高考語文一輪復(fù)習(xí)考點微專題訓(xùn)練(原卷+解析)
- 第4單元 民族團(tuán)結(jié)與祖國統(tǒng)一(B卷·能力提升練)(解析版)
- 2023-2024學(xué)年廣東省深圳市光明區(qū)高二(上)期末地理試卷
- 【8地RJ期末】安徽省蕪湖市弋江區(qū)2023-2024學(xué)年八年級上學(xué)期期末考試地理試卷(含解析)
- 2025年春季幼兒園后勤工作計劃
- 鑄牢中華民族共同體意識的培養(yǎng)路徑
- 世界各大洲國家中英文、區(qū)號、首都大全
- 2024-2030年中國波浪發(fā)電商業(yè)計劃書
- 《中國腎性貧血診療的臨床實踐指南》解讀課件
- 申論公務(wù)員考試試題與參考答案(2024年)
- 2024年人教版八年級數(shù)學(xué)上冊期末考試卷(附答案)
- 電大本科《西方經(jīng)濟(jì)學(xué)》期末試題標(biāo)準(zhǔn)題庫及答案(試卷號:1026)
- 泰山產(chǎn)業(yè)領(lǐng)軍人才申報書
評論
0/150
提交評論