面向對象程序設計復習_第1頁
面向對象程序設計復習_第2頁
面向對象程序設計復習_第3頁
面向對象程序設計復習_第4頁
面向對象程序設計復習_第5頁
已閱讀5頁,還剩86頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、面向對象程序設計面向對象程序設計復習復習C+語語言言程程序序設設計計教教程程 復復習習課課第一章第一章C+語語言言程程序序設設計計教教程程 復復習習課課C+語語言言程程序序設設計計教教程程 第第1章章C+編編程程簡簡介介1.1 計算機程序設計語言自頂向下,逐步求精; 面向對象的方法將客觀事物描述成具有屬性和行為的對象對象; ; 同一類對象的共同屬性和行為形成類類; ; 封裝對象間通過發(fā)送和接受消息消息發(fā)生聯(lián)系; 類的繼承繼承與多態(tài)性多態(tài)性可以提供使用現(xiàn)成類的機制,從而實現(xiàn)代碼的重用. 關鍵是定義類,并由類實例化成對象C+語語言言程程序序設設計計教教程程 第第1章章C+編編程程簡簡介介 1 鍵

2、盤 cin 執(zhí) 行 cinX ; 鍵 入 123 3 123 內 存 顯 示 器 cout 執(zhí) 行 cout 對象對象1 對象對象2.對象對象n;C+中使用對象cin 作為標準輸入流對象,通常代表鍵盤,cin與提取操作符連用,使用格式為:意思是從標準輸入流對象鍵盤上提取n個數(shù)據(jù)分別給對象1、對象2、.、對象n。C+ C+ 輸入輸入/ /輸出簡介輸出簡介C+語語言言程程序序設設計計教教程程 第第1章章C+編編程程簡簡介介 1 鍵 盤 cin 執(zhí) 行 cin X ; 鍵 入 1 23 3 123 內 存 顯 示 器 cou t 執(zhí) 行 co u t X ; X = 123 2 cout 對象對象1

3、 對象對象2.對象對象n;C+中使用對象cout 作為標準輸出流對象,通常代表顯示設備,cout 與插入操作符n; if(n=1) break; for(i=2;i=n ? coutn是素數(shù)n : coutnn; if(n=1) break; for(i=2;i=n ? coutn是素數(shù)是素數(shù)n : coutn不是素數(shù)不是素數(shù)n; continue當不是素數(shù),直接跳到第15行繼續(xù)執(zhí)行。 程序結果錯誤。 C+語語言言程程序序設設計計教教程程 第第3章章控控制制結結構構 【例【例】continue和和break組和示例組和示例3.7.2 continue語句語句第四章第四章C+語語言言程程序序設設

4、計計教教程程 復復習習課課C+語語言言程程序序設設計計教教程程 第第4章章函函數(shù)數(shù)4.2.3 4.2.3 函數(shù)參數(shù)的按值傳遞函數(shù)參數(shù)的按值傳遞 函數(shù)調用過程實際上執(zhí)行了一個從參數(shù)傳遞-執(zhí)行函數(shù)體-返回的過程。其中的函數(shù)參數(shù)傳遞過程的實質是將實將實參值通過??臻g一一傳送給實參的過程參值通過棧空間一一傳送給實參的過程,這種把實參表達式的值傳送給對應的形參變量傳遞方式稱為“按值傳遞按值傳遞”。 函數(shù)調用 函數(shù)定義 返回類型 函數(shù)名 (形參 1, 形參 2, ., 形參 n ) 函數(shù)體; 棧內存 函數(shù)名 (實參1, 實參 2, ., 實參n ); 實參1 的值 實參2 的值 . 實參n 的值 內聯(lián)函數(shù)

5、的定義形式如下: C+語語言言程程序序設設計計教教程程 第第4章章函函數(shù)數(shù)4.3 4.3 內聯(lián)函數(shù)內聯(lián)函數(shù) inline 函數(shù)類型 函數(shù)名 (形式參數(shù)表) 函數(shù)體; 內聯(lián)函數(shù):內聯(lián)函數(shù): 是通過在編譯時將函數(shù)體代碼插入到函數(shù)調用處,將調用函數(shù)的方式改為順序執(zhí)行方式來節(jié)省程序執(zhí)行的時間開銷,這一過程叫做內聯(lián)函數(shù)的擴展內聯(lián)函數(shù)的擴展。因此,內聯(lián)函數(shù)實際上是一種用空間換時間的方案。但從用戶的角度看,調用內聯(lián)函數(shù)和一般函數(shù)沒有任何區(qū)別。 C+語語言言程程序序設設計計教教程程 第第4章章函函數(shù)數(shù)4.4 4.4 帶默認形參值的函數(shù)帶默認形參值的函數(shù) int sub(int x=8,int y=3) ret

6、urn x-y; void main(void) sub(20,15); /傳遞給形參x,y的值分別為20和15 sub(10); /傳遞給形參x,y的值分別為10和3 sub(); /傳遞給形參x,y的值分別為8和3 C+語言允許在函數(shù)說明或函數(shù)定義中為形參預賦一個默認的值,這樣的函數(shù)就叫做帶有默認形參值的函數(shù)帶有默認形參值的函數(shù)。在調用帶有默認參數(shù)值的函數(shù)時,若為相應形參指定了實參,則形參將使用實參的值;否則,形參相使用其默認值默認值。這就大大地方便了函數(shù)的使用。 C+語語言言程程序序設設計計教教程程 第第4章章函函數(shù)數(shù)4.5 4.5 函數(shù)重載函數(shù)重載 int max(int,int);i

7、nt max(int,int,int);float max(float,float);double max(double,double); 函數(shù)重載:函數(shù)重載: 就是兩個以上的函數(shù),取相同的函數(shù)名相同的函數(shù)名,但是形參的個數(shù)形參的個數(shù)和類型不同和類型不同,編譯器根據(jù)實參和形參的類型及個數(shù)的最佳匹配最佳匹配,自動決定調用哪一個函數(shù)。 例如: #includeusing namespace std;int add(int x,int y) cout(int, int)t; return x+y; double add(double x,double y) cout(double, double)t

8、; return x+y; int add(int x,double y) cout(int, double)t; return int(x+y); 123456789101112131415161718192021C+語語言言程程序序設設計計教教程程 第第4章章函函數(shù)數(shù)函數(shù)重載函數(shù)重載函數(shù)重載函數(shù)重載函數(shù)重載函數(shù)重載double add(double x,int y) cout(double,int)t; return x+y; void main() coutadd(9,8)endl; coutadd(9.0,8.0)endl; coutadd(9,8.0)endl; coutadd(9.

9、0,8)endl; 212223242526272829303132C+語語言言程程序序設設計計教教程程 第第4章章函函數(shù)數(shù)函數(shù)重載函數(shù)重載重載函數(shù)的調用重載函數(shù)的調用C+語語言言程程序序設設計計教教程程 第第4章章函函數(shù)數(shù)4.5 4.5 函數(shù)重載函數(shù)重載/ C+無法區(qū)分這兩個函數(shù)。/因為在沒有確定函數(shù)調用是對哪一個重載的函數(shù)之前,/返回類型是不知道的。 int add(int i1,int i2); float add(int f1,int f2);F注意注意:(1) 各個重載函數(shù)的返回類型可以相同,也可以不同。但如果函數(shù)名相同、形參表也相同,僅僅是返回類型不同,則是非非法法的。在編譯時會認

10、為是語法錯誤。 C+語語言言程程序序設設計計教教程程 第第4章章函函數(shù)數(shù)4.5 4.5 函數(shù)重載函數(shù)重載1、首先尋找一個嚴格的匹配,如果找到了,就調用這個函數(shù)。2、若無嚴格匹配的函數(shù),就通過類型的自然轉換尋找一個匹配,如果找到了,就調用這個函數(shù)。3、通過用戶定義的轉換尋找一個匹配。F注意注意:(2)確定對重載函數(shù)的哪個函數(shù)進行調用的過程稱為綁定綁定(binding)函數(shù)重載中參數(shù)匹配的步驟函數(shù)重載中參數(shù)匹配的步驟( (函數(shù)重載解析過程函數(shù)重載解析過程) )C+語語言言程程序序設設計計教教程程 第第4章章函函數(shù)數(shù)4.6 4.6 函數(shù)模板函數(shù)模板 template 返回類型 函數(shù)名 (形參表) 函

11、數(shù)體; 函數(shù)模板:函數(shù)模板: 可以用來創(chuàng)建一個通用功能的函數(shù),以支持多種不同形參,進一步簡化重載函數(shù)的函數(shù)體設計。函數(shù)模板的定義形式為:函數(shù)模板的定義形式為: 模板參數(shù)表C+語語言言程程序序設設計計教教程程 第第4章章函函數(shù)數(shù)4.6 4.6 函數(shù)模板函數(shù)模板 F意義:意義: 對于功能完全一樣,只是參數(shù)類型不同函數(shù),能寫一段通用代碼適用于多種不同的數(shù)據(jù)類型,會使代碼的可重用性大大提高,從而提高軟件的開發(fā)效率提高軟件的開發(fā)效率。 template 返回類型 函數(shù)名 (形參表) 函數(shù)體; C+語語言言程程序序設設計計教教程程 第第4章章函函數(shù)數(shù)4.6 4.6 函數(shù)模板函數(shù)模板F注意注意:templa

12、te關鍵字表示聲明的是模板。中是模板的參數(shù)表,可以有一項或多項,其中的類型名稱為參數(shù)化類型參數(shù)化類型,是一種抽象類型或可變類型。class是類型關鍵字,也可以用typename作為關鍵字。函數(shù)返回值類型可以是普通類型,也可以是模板參數(shù)表中指定的類型。模板參數(shù)表中的參數(shù)類型可以是普通類型。 template 返回類型 函數(shù)名 (形參表) 函數(shù)體; C+語語言言程程序序設設計計教教程程 第第4章章函函數(shù)數(shù)4.6 4.6 函數(shù)模板函數(shù)模板 template 返回類型 函數(shù)名 (形參表) 函數(shù)體; template T add(T x, T y) return x+y; template T sum(

13、) 第五章第五章C+語語言言程程序序設設計計教教程程 復復習習課課5.2.5 字符數(shù)組與字符串字符數(shù)組與字符串 存放字符型數(shù)據(jù)的數(shù)組稱為字符數(shù)組字符數(shù)組。字符數(shù)組也分為一維數(shù)組和多維數(shù)組。前述的數(shù)組的定義及初始化同樣適用于字符數(shù)組,除此以外,C+對字符數(shù)組的初始化還可以使用字符串形式。 1.用字符進行初始化用字符進行初始化 例如: char s1 =C,h,i,n,a; char s2 4=H,o,w,a,r,e,y,o,u; 2.用字符串進行初始化用字符串進行初始化 例如: char s3 =China; char s4 4=how, are, you; C+語語言言程程序序設設計計教教程程

14、 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型3. 字符數(shù)組的使用字符數(shù)組的使用 字符數(shù)組也是數(shù)組,我們同樣可以通過數(shù)組名及下標引用數(shù)組中的元素。 為方便對字符與字符串的處理,C+提供了許多專門處理字符與字符串的函數(shù),這些函數(shù)原型在各自的頭文件中定義。 下表列出了常用的字符與字符串處理函數(shù)的調用方法與功能簡介,函數(shù)原形與詳細的功能可以從C+編譯器的幫助文檔中獲得。C+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型5.2.5 字符數(shù)組與字符串字符數(shù)組與字符串 5.3.6 指針與函數(shù)指針與函數(shù) 1 1、指針作為函數(shù)參數(shù)、指針作為函數(shù)參數(shù)【例【例5-85-8】用傳指針方式實現(xiàn)兩個數(shù)據(jù)交換

15、 分析分析:用傳值的方式無法實現(xiàn)兩個數(shù)據(jù)交換。用指針作為形參,從實參傳入要交換數(shù)據(jù)的地址,在函數(shù)體內將指針指向的兩個數(shù)據(jù)交換存儲位置,這樣通過“釜底抽薪釜底抽薪”的方式實現(xiàn)了數(shù)據(jù)交換。C+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型5.4.2 引用與函數(shù)引用與函數(shù) 1. 1. 引用作為函數(shù)的參數(shù)引用作為函數(shù)的參數(shù) 當引用作為函數(shù)的形參,在進行函數(shù)調用時,進行實參與形參的結合,其結合過程相當于定義了一個形參對實參的引用引用。因此,在函數(shù)體內,對形參進行運算相當于對實參進行運算。與指針相比,引用作為函數(shù)參數(shù)具有兩個優(yōu)點優(yōu)點: 函數(shù)體的實現(xiàn)比指針簡單比指針簡單。用指針作為形參

16、,函數(shù)體內形參要帶著*參加運算;而用引用作為形參,函數(shù)體內參加運算的為形參變量。 調用函數(shù)語法簡單語法簡單。用指針作為形參,實參需要取變量的地址;而用引用作為形參,與簡單傳值傳值調用調用一樣,實參為變量。 C+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型第六章第六章C+語語言言程程序序設設計計教教程程 復復習習課課除了按數(shù)據(jù)類型區(qū)分變量外,根據(jù)變量定義的位置根據(jù)變量定義的位置,可以把變量分成全局變量與局部變量。全局變量全局變量是指定義在函數(shù)體外部的變量,它能被所有函數(shù)使用。局部變量局部變量是指定義在函數(shù)或復合語句中的變量,只能在函數(shù)或復合語句中使用。 int g=100

17、000;int sum(int x, int y) int s=0; for(int i=x;i=y;i+) s=s+i; return s;void main() int x=1,y=100; coutsum(x,y)+gendl;12345678910111213g為全局變量sum()中 x、y為局部變量main()中的 x、y為局部變量C+語語言言程程序序設設計計教教程程 第第6章章C+程程序序的的結結構構 C+中變量有auto 、extern、register、static四種存儲類型。1.auto說明符說明符 auto說明符說明定義的是一個局部變量。局部變量默認存儲類型為auto,

18、所以在程序中很少使用auto說明符說明。2. register說明符說明符 register說明符在定義變量時說明此變量存儲在CPU中的寄存器中,以加快存取速度。一般編譯器自己選擇幾個變量采用寄存器存儲,不需要在程序中聲明。C+語語言言程程序序設設計計教教程程 第第6章章C+程程序序的的結結構構6.1.2 6.1.2 變量的存儲變量的存儲 類類 型型 C+中變量有auto 、extern、register、static四種存儲類型。3. extern說明符說明符 如果一個完整的計算機程序很大,分成多個模塊,放在不同的文件中,分開編譯成目標文件,最后連接成一個完整的可執(zhí)行代碼。對于所有模塊共對于

19、所有模塊共同使用的全局變量同使用的全局變量,如果在所有的模塊中都定義,在連接時就會出錯。 解決辦法是只在一個模塊中定義全局變量只在一個模塊中定義全局變量,在其他模塊中用其他模塊中用extern說明說明這是一個“外來外來”的全局變量。C+語語言言程程序序設設計計教教程程 第第6章章C+程程序序的的結結構構6.1.2 6.1.2 變量的存儲變量的存儲 類類 型型6.1.2 6.1.2 變量的存儲變量的存儲 類類 型型4. static說明符說明符static說明符用于在定義變量時將變量聲明為成static(靜態(tài))變量。 其格式為: static 數(shù)據(jù)類型數(shù)據(jù)類型 變量名變量名=初值;初值; F注意

20、注意: 當一個局部變量聲明為static變量,它既具有局部變量的性質:只能在函數(shù)體局部存取;又具有全局變量的性質:函數(shù)多次進入,變量的值只初始化一次。因此靜態(tài)局部變量實實質是一個供函數(shù)局部存取的全局變量質是一個供函數(shù)局部存取的全局變量。 C+語語言言程程序序設設計計教教程程 第第6章章C+程程序序的的結結構構6.1.3 6.1.3 變量在內存中的存儲變量在內存中的存儲 全局變量、靜態(tài)變量、字符串常量、常變量存放在全局數(shù)據(jù)區(qū)全局數(shù)據(jù)區(qū);所有的函數(shù)和代碼存放在代碼區(qū)代碼區(qū);為運行函數(shù)而分配的函數(shù)參數(shù)、局部變量、返回地址存放在棧區(qū)棧區(qū);堆區(qū)堆區(qū)用于動態(tài)內存分配。 變量的生存期變量的生存期為從產(chǎn)生到消

21、失的時期。全局變量、靜態(tài)變量、常變量生存周期為整個程序的生存周期,因此稱為靜態(tài)生存期靜態(tài)生存期;局部變量的生存周期起于函數(shù)調用,結束于函數(shù)調用結束,其生存期是動態(tài)的,因此稱為動態(tài)生存期動態(tài)生存期。C+語語言言程程序序設設計計教教程程 第第6章章C+程程序序的的結結構構6.3 6.3 程序的文件結構與編譯預處理命令程序的文件結構與編譯預處理命令 一個高級語言源程序在計算機上運行,必須先用編譯程序將其翻譯為機器語言。在編譯之前還要做某些預處理工作,如去掉注釋,變換格式等。C+源程序中以#開頭、以換行符結尾的行稱為預預處理命令處理命令。預處理命令不是不是C+語言的語法成分,在編譯前由預處理器執(zhí)行,在

22、目標程序中,不含不含預處理指令對應的機器碼。因此,預處理命令不以分號結尾。許多預處理命令更適合程序員,但為了處理C遺留的代碼,C+編程者也應該熟悉預處理命令。 C+語語言言程程序序設設計計教教程程 第第6章章C+程程序序的的結結構構6.4 6.4 名字空間名字空間 一個軟件往往由多個模塊(組件)組成,這些模塊由不同程序員(軟件商)提供,不同模塊可能使用了相同的標識符。簡單說就是同一個名字在不同模塊中代表不同的事物。當這些模塊用到同一個程序中,同名標識符就引起沖突。C+提供名字空間(namespace) 將相同的名字放在不同空間中來防止命名沖突。 定義一個名字空間的格式如下: 其中:namesp

23、ace 為關鍵字。名稱為名字空間標識符。成員為函數(shù)、變量、常量、自定義類型等。 namespace 名稱 成員; C+語語言言程程序序設設計計教教程程 第第6章章C+程程序序的的結結構構第七章第七章C+語語言言程程序序設設計計教教程程 復復習習課課在面向對象的程序設計中,程序模塊是由類構成的。類是對邏輯上相關的函數(shù)與數(shù)據(jù)的封裝封裝,它是對問題的抽象描述。數(shù)據(jù)封裝封裝就是將一組數(shù)據(jù)和與這組數(shù)據(jù)有關操作組裝在一起,形成一個實體,這實體也就是類。類類與對象對象是C+程序設計中最重要的概念。 C+語語言言程程序序設設計計教教程程 第第7章章類類與與對對象象void main(void) Clock M

24、yClock; MyClock.ShowTime(); MyClock.SetTime(8,30,30); MyClock.ShowTime();* p7_1_b.cpp * 面向對象的時鐘程序 */#include using namespace std;class Clock private: int H,M,S; public: void SetTime(int h,int m,int s) H=(h=0&h=0&m=0&s60)?s:0; void ShowTime() coutH:M:Sendl; ;123456789101112131415161718192

25、021222324252627時鐘程序時鐘程序B時鐘程序時鐘程序BC+語語言言程程序序設設計計教教程程 第第7章章類類與與對對象象例如:例7-1中定義了一個時鐘類Clock。 C+語語言言程程序序設設計計教教程程 第第7章章類類與與對對象象 1. 數(shù)據(jù)成員數(shù)據(jù)成員 類定義中的數(shù)據(jù)成員描述了類對象所包含的數(shù)據(jù)類型,數(shù)據(jù)成員的類型可以是C+基本數(shù)據(jù)類型,也可以是構造數(shù)據(jù)類型。C+語語言言程程序序設設計計教教程程 第第7章章類類與與對對象象 class Team; /已定義的類class Grade Team a; / 使用了已定義的類類型 Grade *p; / 使用正在定義的類類型定義指針成員

26、Grade &r; / 使用正在定義的類類型定義引用成員 Grade b; / 錯誤! 使用了未定義完的類Record 定義變量; F注意注意: 因為類只是一種類型,類中的數(shù)據(jù)成員不占內存空間,因此在定義數(shù)據(jù)成員時不能給數(shù)據(jù)成員賦初值。 類的數(shù)據(jù)成員除了可以使用前面講述的C+類型外,還可以使用已定義完整的類類型。 在正在定義的類中,由于該類型沒有定義完整,所以不能定義該類類型的變量,只能定義該類類型的指針成員以及該類類型的引用成員。 C+語語言言程程序序設設計計教教程程 第第7章章類類與與對對象象 2. 成員函數(shù)成員函數(shù) 作為類成員的成員函數(shù)描述了對類中的數(shù)據(jù)成員實施的操作。成員函數(shù)的

27、定義、聲明格式與非成員函數(shù)(全局函數(shù))的格式相同。成員函數(shù)可以放在類中定義,也可以放在類外。放在類中定義的成員函數(shù)為內聯(lián)(inline)函數(shù)。 Clock類中的成員函數(shù)就是放在類內定義的。C+語語言言程程序序設設計計教教程程 第第7章章類類與與對對象象 2. 成員函數(shù)成員函數(shù) C+可以在類內聲明成員函數(shù)的原型,在類外定義函數(shù)體。這樣做的好處是相當于在類內列了一個函數(shù)功能表,使我們對類的成員函數(shù)的功能一目了然,避免了在各個函數(shù)實現(xiàn)的大堆代碼中查找函數(shù)的定義。在類中聲明函數(shù)原型的方法與一般函數(shù)原型的聲明一樣,在類外定義函數(shù)體的格式如下: :是類的作用域分辨符作用域分辨符,用在此處,放在類名后成員函

28、數(shù)前,表明后面的成員函數(shù)屬于前面的那個類。返回值類型 類名 : 成員函數(shù)名(形參表) 函數(shù)體;C+語語言言程程序序設設計計教教程程 第第7章章類類與與對對象象 3. 類作用域類作用域 類是一組數(shù)據(jù)成員和函數(shù)成員的集合,類作用域作用于類中定義的特定的成員,包括數(shù)據(jù)成員與成員函數(shù),類內的每一個成員都具有類作用域類作用域。實際上,類的封裝作用也就是限制類的成員其訪問范圍局限于類的作用域之內。 C+語語言言程程序序設設計計教教程程 第第7章章類類與與對對象象 類相當于一種包含函數(shù)的自定義數(shù)據(jù)類型,它不占內存,是一個抽象的“虛”體,使用已定義的類建立對象就像用數(shù)據(jù)類型定義變量一樣。對象建立后,對象占據(jù)內

29、存,變成了一個“實”體。類與對象的關系就像數(shù)據(jù)類型與變量的關系一樣。其實,一個變量就是一個簡單的不含成員函數(shù)的數(shù)據(jù)對象。建立對象的格式如下:其中,對象名可以是簡單的標識符,也可以是數(shù)組。在例7-1中,使用:Clock MyClock; 建立了一個Clock型的對象MyClock。C+語語言言程程序序設設計計教教程程 第第7章章類類與與對對象象類名 對象名; 通過設置成員的存取控制屬性, 使對類成員的存取得到控制,從而達到了信息隱藏信息隱藏的目的。C+的存取控制屬性有:公有類型(public)、私有類型(private)和保護類型(protected)。三者的意義如下:表表7-1 存取控制屬性表

30、存取控制屬性表 C+語語言言程程序序設設計計教教程程 第第7章章類類與與對對象象存取屬性存取屬性意意 義義可存取對象可存取對象public 公開(公有)級 該類成員以及所有對象protected 保護級 該類及其子類成員 private 私有級該類的成員 類中定義為public等級的成員,可以被該類的任何對象存取,適用于完全公開的數(shù)據(jù)。而private等級的成員只可被類內的成員存取,適用于不公開的數(shù)據(jù)。至于protected等級,屬于半公開性質的數(shù)據(jù),定義為protected等級的成員,可以被該類及其子類存取。關于子類的概念,在以后的章節(jié)中講述。 在定義一個對象的同時,希望能給它的數(shù)據(jù)成員賦初

31、值對象的初始化。在特定對象使用結束時,還經(jīng)常需要進行一些清理工作。C+程序中類的初始化和清理工作分別由兩個特殊的成員函數(shù)來完成,它們就是構造函數(shù)和析構函數(shù)。C+語語言言程程序序設設計計教教程程 第第7章章類類與與對對象象7.2 7.2 構造函數(shù)與析構函數(shù)構造函數(shù)與析構函數(shù)構造函數(shù)構造函數(shù)(constructor)構造函數(shù)構造函數(shù)是與類名相同的,在建立對象時自動調用的函數(shù)。如果在定義類時,沒有為類定義構造函數(shù),編譯系統(tǒng)就生成一個默認形式默認形式的隱含的隱含的的構造函數(shù),這個構造函數(shù)的函數(shù)體是空的,因此默認構造函數(shù)不具備任何功能。如果用戶至少為類定義了一個構造函數(shù),C+就不會生成任何默認的構造函數(shù)

32、,而是根據(jù)對象的參數(shù)類型和個數(shù)從用戶定義的構造函數(shù)中選擇最合適的構造函數(shù)完成對該對象的初始化。C+語語言言程程序序設設計計教教程程 第第7章章類類與與對對象象7.2.1 7.2.1 構造函數(shù)構造函數(shù)構造函數(shù)構造函數(shù)(constructor)作為類的成員函數(shù),構造函數(shù)可以直接訪問類的所有數(shù)據(jù)成員,可以是內聯(lián)函數(shù),可以不帶任何參數(shù),可以帶有參數(shù)表以及默認形參值,還可以重載,用戶可以根據(jù)不同問題的具體需要,有針對性地設計合適的構造函數(shù)將對象初始化為特定的狀態(tài)。 C+語語言言程程序序設設計計教教程程 第第7章章類類與與對對象象7.2.1 7.2.1 構造函數(shù)構造函數(shù)構造函數(shù)是類的一個成員函數(shù),除了具有

33、一般成員函數(shù)的特征之外,還歸納出如下特殊的性質:構造函數(shù)的函數(shù)名必須與定義它的類同名。構造函數(shù)沒有返回值。如果在構造函數(shù)前加void是錯誤的。構造函數(shù)被聲明定義為公有函數(shù)。構造函數(shù)在建立對象時由系統(tǒng)自動調用由系統(tǒng)自動調用。C+語語言言程程序序設設計計教教程程 第第7章章類類與與對對象象7.2.1 7.2.1 構造函數(shù)構造函數(shù)自然界萬物都是有生有滅,程序中的對象也是一樣。對象在定義時誕生,不同生存期的對象在不同的時期消失。在對象要消失時,通常有一些善后工作需要做, 例如:構造對象時,通過構造函數(shù)動態(tài)申請了一些內存單元,在對象消失之前就要釋放這些內存單元。C+用什么來保證這些善后清除工作的執(zhí)行呢?

34、答案是:析構函數(shù)析構函數(shù)。C+語語言言程程序序設設計計教教程程 第第7章章類類與與對對象象7.2.2 7.2.2 析構函數(shù)析構函數(shù)拷貝構造函數(shù)拷貝構造函數(shù)是與類名相同,形參是本類的對象的引用的函數(shù),在用已存在對象初始化新建立對象時調用。類的拷貝構造函數(shù)一般由用戶定義,如果用戶沒有定義拷貝構造函數(shù),系統(tǒng)就會自動生成一個默認函數(shù),這個默認拷貝構造函數(shù)的功能是把初始值對象的每個數(shù)據(jù)成員的值依次復制到新建立的對象中。因此,也可以說是完成了同類對象的克隆(Clone)。這樣得到的對象和原對象具有完全相同的數(shù)據(jù)成員,即完全相同的屬性。 C+語語言言程程序序設設計計教教程程 第第7章章類類與與對對象象7.2

35、.3 7.2.3 拷貝構造函數(shù)拷貝構造函數(shù)( (復制構造函數(shù)復制構造函數(shù)) )淺拷貝淺拷貝,即直接將原對象的數(shù)據(jù)成員值依次拷貝給新對象中對應的數(shù)據(jù)成員,并沒有為新對象另外分配內存資源。這樣,如果對象的數(shù)據(jù)成員是指針,兩個兩個指針對象實際上指向的是同一塊內存空間指針對象實際上指向的是同一塊內存空間。當類的數(shù)據(jù)成員中有指針類型時,我們就必須定義一個特定的拷貝構造函數(shù),該拷貝構造函數(shù)不僅可以實現(xiàn)原對象和新對象之間數(shù)據(jù)成員的拷貝,而且可以為新的對象分配單獨的內存資源分配單獨的內存資源,這就是深拷貝構深拷貝構造函數(shù)造函數(shù)。C+語語言言程程序序設設計計教教程程 第第7章章類類與與對對象象7.2.4 7.2

36、.4 淺拷貝與深拷貝淺拷貝與深拷貝對象數(shù)組對象數(shù)組是以對象為元素的數(shù)組。對象數(shù)組的定義、賦值、引用與普通數(shù)組一樣,只是數(shù)組元素與普通數(shù)組的數(shù)組元素不同。對象數(shù)組定義格式如下: 其中,類名指出該數(shù)組元素所屬的類,常量表達式給出某一維元素的個數(shù)。C+語語言言程程序序設設計計教教程程 第第7章章類類與與對對象象類名類名 對象數(shù)組名常量表達式n,.,常量表達式1; 7.3.3 7.3.3 對象數(shù)組對象數(shù)組與結構數(shù)組不同,對象數(shù)組初始化需要使用構造函數(shù)完成,以一個大小為n的一維數(shù)組一維數(shù)組為例,對象數(shù)組的初始化初始化格式如下:C+語語言言程程序序設設計計教教程程 第第7章章類類與與對對象象數(shù)組名n= 構

37、造函數(shù)(數(shù)據(jù)成員1初值,數(shù)據(jù)成員2初值,), 構造函數(shù)(數(shù)據(jù)成員1初值,數(shù)據(jù)成員2初值,), 構造函數(shù)(數(shù)據(jù)成員1初值,數(shù)據(jù)成員2初值,);F注意:注意:不帶初始化表的對象數(shù)組,其初始化靠調用不帶參數(shù)的構造函數(shù)完成。 7.3.3 7.3.3 對象數(shù)組對象數(shù)組一個類對象的public成員可被本類的其他對象存取,即可供所有對象使用,但是此類的每個對象都各自擁有一份,不存在真正意義上的共享成員。所以,C+提供了靜態(tài)成員,用以解決同一個類的不同對象之間數(shù)據(jù)成員和函數(shù)的共享問題。靜態(tài)成員的特點是:不管這個類創(chuàng)建了多少個對象,其靜態(tài)成員在內存中只保留一份拷貝,這個拷貝為該類的所有對象所共享。類的靜態(tài)成員有

38、兩種:靜態(tài)數(shù)據(jù)成員和靜態(tài)函數(shù)成員,下面分別對它們進行討論 C+語語言言程程序序設設計計教教程程 第第7章章類類與與對對象象7.4 7.4 靜態(tài)成員靜態(tài)成員C+語語言言程程序序設設計計教教程程 第第7章章類類與與對對象象數(shù)據(jù)隱藏給不同類和對象的成員函數(shù)之間,類的成員函數(shù)和類外的一般函數(shù)之間進行屬性共享帶來障礙,必須尋求一種方法使得類外的對象能夠訪問類中的私有成員,提高程序的效率。為了解決這個問題,C+提出了使用友元友元作為實現(xiàn)這一要求的輔助手段。友元不是類的成員,但它可以訪問類的任何成員(包括私有成員)。聲明為友元的外界對象既可以是另一個類的成員函數(shù),也可以是不屬于任何類的一般的函數(shù),稱之為友元

39、函數(shù)友元函數(shù);友元也可以是整個的一個類,稱之為友元類友元類。7.5 7.5 友元友元第八章第八章C+語語言言程程序序設設計計教教程程 復復習習課課8.1 8.1 繼承與派生繼承與派生 在C+中,可以利用已有的類來定義新的類,新類將擁有原有類的全部特性,原有類被稱為基類基類(Base class)或父類(Super class),新產(chǎn)生的類被稱為派派生類生類(Derived class)或子類(Sub class)。派生類擁有基類的特性稱作繼承繼承,由基類產(chǎn)生派生類的過程稱為派派生生。 8.1.1 繼承的概念繼承的概念C+語語言言程程序序設設計計教教程程 第第8章章繼繼承承與與派派生生8.1 8

40、.1 繼承與派生繼承與派生 8.1.1 繼承的概念繼承的概念如果每一個派生類都有且僅有一個基類,派生類可以看作是基類的特例,它增加了某些基類所沒有的性質。這種繼承方式,稱為單繼承單繼承或單向繼承?,F(xiàn)實生活中,子女的外貌、血型往往不是僅僅繼承自父親或母親,而是將父母親的特點都繼承下來。與之相類似,如果一個派生類有兩個或兩個以上的基類,則稱為多繼承多繼承或多重繼承。 派生類又作為基類,繼續(xù)派生新的類, 這樣的派生方式稱為多層派生多層派生,從繼承的角度看稱為多層繼多層繼承承。C+語語言言程程序序設設計計教教程程 第第8章章繼繼承承與與派派生生C+語語言言程程序序設設計計教教程程 第第8章章繼繼承承與

41、與派派生生 8.1.1 繼承的概念繼承的概念8.1 8.1 繼承與派生繼承與派生 class Clock private: int H,M,S; public: void SetTime(int H=0,int M=0,int S=0); void ShowTime(); Clock(int H=0,int M=0,int S=0); Clock();class AlarmClock: public Clockprivate: int AH,AM; /響鈴的時間響鈴的時間 bool OpenAlarm; /是否關閉鬧鐘是否關閉鬧鐘public: SetAlarm(int AH, int AM)

42、; /設置響鈴時間設置響鈴時間 SwitchAlarm(bool Open=true); /打開打開/關閉鬧鈴關閉鬧鈴 ShowTime(); /顯示當前時間與鬧鈴時間顯示當前時間與鬧鈴時間C+語語言言程程序序設設計計教教程程 第第8章章繼繼承承與與派派生生【例如】在普通的時鐘類Clock基礎上派生出鬧鐘類AlarmClock:類 名成 員 名AlarmClock:Clock:H, M, SSetTime()ShowTime()AH, AM, OpenAlarmSetAlarm()SwitchAlarm()ShowTime()AlarmClock()派生類派生類AlarmClock的成員構成圖

43、的成員構成圖(表表) 8.1 8.1 繼承與派生繼承與派生 8.1.2 派生類實現(xiàn)派生類實現(xiàn)C+語語言言程程序序設設計計教教程程 第第8章章繼繼承承與與派派生生 繼承描述的是一般類與特殊類的關系,類與類之間體現(xiàn)的是“is a kind of”,即如果在邏輯上A是B的一種(is a kind of),則允許A繼承B的功能和屬性。例如汽車(automobile)是交通工具(vehicle)的一種,小汽車(car)是汽車的一種。那么類automobile可以從類vehicle派生,類car可以從類automobile派生得到。8.1 8.1 繼承與派生繼承與派生 8.1.3 繼承與組合繼承與組合C+

44、語語言言程程序序設設計計教教程程 第第8章章繼繼承承與與派派生生 組合描述的是整體與部分的關系,類與類之間體現(xiàn)的是“is a part of”,即如果在邏輯上A是B的一部分(is a part of),則允許A和其他數(shù)據(jù)成員組合為B。例如:發(fā)動機、車輪、電池、車門、方向盤、底盤都是小汽車的一部分,它們組合成汽車。而不能說發(fā)動機是汽車的一種。8.1 8.1 繼承與派生繼承與派生 8.1.3 繼承與組合繼承與組合C+語語言言程程序序設設計計教教程程 第第8章章繼繼承承與與派派生生 基類的公有成員在派生類中仍然為公有成員,可以由派生類對象和派生類成員函數(shù)直接訪問。 基類的私有成員在派生類中,無論是派

45、生類的成員還是派生類的對象都無法直接訪問。 保護成員在派生類中仍是保護成員,可以通過派生類的成員函數(shù)訪問,但不能由派生類的對象直接訪問。公有方式繼承的特點:公有方式繼承的特點: F注意注意:對基類成員的訪問,一定要分清是通過派生類對象訪問還是通過派生類成員函數(shù)訪問。 8.2 8.2 繼承的方式繼承的方式 8.2.1 公有繼承公有繼承C+語語言言程程序序設設計計教教程程 第第8章章繼繼承承與與派派生生基類的公有成員和保護成員被繼承后作為派生類的私有成員,即基類的公有成員和保護成員被派生類吸收后,派生類的其他成員函數(shù)可以直接訪問它們,但是在類外部,不能通過派生類的對象訪問它們。 基類的私有成員在派

46、生類中不能被直接訪問。無論是派生類的成員還是通過派生類的對象,都無法訪問從基類繼承來的私有成員。 8.2 8.2 繼承的方式繼承的方式 8.2.2 私有繼承私有繼承私有方式繼承的特點:私有方式繼承的特點: C+語語言言程程序序設設計計教教程程 第第8章章繼繼承承與與派派生生經(jīng)過私有繼承之后,所有基類的成員都成為了派生類的私有成員或不可訪問的成員,如果進一步派生的話,基類的全部成員將無法在新的派生類中被訪問。因此,私有繼承之后,基類的成員再也無法在以后的派生類中發(fā)揮作用,實際是相當于中止了基類的繼續(xù)派生,出于這種原因,一般情況下私有繼承的使用比較少。 8.2 8.2 繼承的方式繼承的方式 8.2

47、.2 私有繼承私有繼承私有方式繼承的特點:私有方式繼承的特點: C+語語言言程程序序設設計計教教程程 第第8章章繼繼承承與與派派生生8.2 8.2 繼承的方式繼承的方式 8.2.3 保護繼承保護繼承保護成員的特點:保護成員的特點: 基類中基類中protected的成員的成員1、類內部:可以訪問2、類的使用者:不能訪問3、類的派生類成員:可以訪問保護成員的示例保護成員的示例 C+語語言言程程序序設設計計教教程程 第第8章章繼繼承承與與派派生生基類的公有成員和保護成員被繼承后作為派生類的保護成員。 基類的私有成員在派生類中不能被直接訪問。 8.2 8.2 繼承的方式繼承的方式 8.2.3 保護繼承

48、保護繼承保護方式繼承的特點:保護方式繼承的特點: 1.派生類構造函數(shù)的定義派生類構造函數(shù)的定義C+語語言言程程序序設設計計教教程程 第第8章章繼繼承承與與派派生生派生類名派生類名(參數(shù)總表參數(shù)總表): 基類名基類名1(參數(shù)表參數(shù)表1),.,基類名基類名m (參數(shù)表參數(shù)表m),成員對象名成員對象名1(成員對象參數(shù)表成員對象參數(shù)表1),.,成員對象名成員對象名n(成員對象參數(shù)成員對象參數(shù)表表n) 派生類新增成員的初始化;派生類新增成員的初始化; 基類名1(參數(shù)表1),.,基類名m (參數(shù)表m)稱為基類成員的初始基類成員的初始化表化表。 成員對象名1(成員對象參數(shù)表1),.,成員對象名n(成員對象參

49、數(shù)表n) 為成員對象的初始化表成員對象的初始化表?;惓蓡T的初始化表與成員對象的初始化表構成派生類構造函數(shù)的初始化表初始化表。8.3 8.3 派生類的構造與析構派生類的構造與析構 C+語語言言程程序序設設計計教教程程 第第8章章繼繼承承與與派派生生在派生類構造函數(shù)的參數(shù)總表參數(shù)總表中,需要給出基類數(shù)據(jù)成員的初值、成員對象數(shù)據(jù)成員的初值、新增一般數(shù)據(jù)成員的初值。在參數(shù)總表之后,列出需要使用參數(shù)進行初始化的基類名、成員對象名及各自的參數(shù)表,各項之間使用逗號分隔。8.3 8.3 派生類的構造與析構派生類的構造與析構 1.派生類構造函數(shù)的定義派生類構造函數(shù)的定義派生類名派生類名(參數(shù)總表參數(shù)總表):

50、基類名基類名1(參數(shù)表參數(shù)表1),.,基類名基類名m (參數(shù)表參數(shù)表m),成員對象名成員對象名1(成員對象參數(shù)表成員對象參數(shù)表1),.,成員對象名成員對象名n(成員對象參數(shù)成員對象參數(shù)表表n) 派生類新增成員的初始化;派生類新增成員的初始化; C+語語言言程程序序設設計計教教程程 第第8章章繼繼承承與與派派生生基類名、對象名之間的次序無關緊要,它們各自出現(xiàn)的順序可以是任意的。在生成派生類對象時,程序首先會使用這里列出的參數(shù),調用基類和成員對象的構造函數(shù)。8.3 8.3 派生類的構造與析構派生類的構造與析構 1.派生類構造函數(shù)的定義派生類構造函數(shù)的定義派生類名派生類名(參數(shù)總表參數(shù)總表): 基類

51、名基類名1(參數(shù)表參數(shù)表1),.,基類名基類名m (參數(shù)表參數(shù)表m),成員對象名成員對象名1(成員對象參數(shù)表成員對象參數(shù)表1),.,成員對象名成員對象名n(成員對象參數(shù)成員對象參數(shù)表表n) 派生類新增成員的初始化;派生類新增成員的初始化; C+語語言言程程序序設設計計教教程程 第第8章章繼繼承承與與派派生生 調用基類構造函數(shù); 調用內嵌成員對象的構造函數(shù),調用順序按照它們在類中定義的順序 。 派生類自己的構造函數(shù)。 單繼承時,派生類構造函數(shù)調用的一般次序如下: 當派生類對象析構時,各析構函數(shù)的調用順序正好相反。首先調用派生類析構函數(shù)(清理派生類新增成員);然后調用派生類成員對象析構函數(shù)(清理派

52、生類新增的成員對象);最后調用基類析構函數(shù)(清理從基類繼承來的基類子對象)。 8.3 8.3 派生類的構造與析構派生類的構造與析構 2.單繼承的構造與析構單繼承的構造與析構C+語語言言程程序序設設計計教教程程 第第8章章繼繼承承與與派派生生多繼承時派生類構造函數(shù)執(zhí)行的一般次序如下: 調用各基類構造函數(shù);各基類構造函數(shù)調用順序按照基類被繼承時聲明的順序,從左向右依次進行。 調用內嵌成員對象的構造函數(shù);成員對象的構造函數(shù)調用順序按照它們在類中定義的順序依次進行。 調用派生類的構造函數(shù);8.5.1 多繼承的構造與析構多繼承的構造與析構F注意注意:在繼承層次圖中,處于同一層次的各基類構造函數(shù)的調用順序取決于定義該派生類時所指定的各基類的先后順序,與派生類構造函數(shù)定義時初始化表中

溫馨提示

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

評論

0/150

提交評論