面向對象程序的設計復習ppt課件_第1頁
面向對象程序的設計復習ppt課件_第2頁
面向對象程序的設計復習ppt課件_第3頁
面向對象程序的設計復習ppt課件_第4頁
面向對象程序的設計復習ppt課件_第5頁
已閱讀5頁,還剩86頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、面向對象程序設計面向對象程序設計復習復習C+言言語語程程序序設設計計教教程程 復復習習課課第一章第一章C+言言語語程程序序設設計計教教程程 復復習習課課C+言言語語程程序序設設計計教教程程 第第1章章C+編編程程簡簡介介1.1 計算機程序設計言語自頂向下,逐漸求精; 面向對象的方法將客觀事物描畫成具有屬性和行為的對象; 同一類對象的共同屬性和行為構成類; 封裝對象間經過發送和接受音訊發生聯絡; 類的承繼與多態性可以提供運用現成類的機制,從而實現代碼的重用. 關鍵是定義類,并由類實例化成對象C+言言語語程程序序設設計計教教程程 第第1章章C+編編程程簡簡介介 1 鍵 盤 cin 執 行 cinX

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

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

4、計計教教程程 第第4章章函函數數4.2.3 4.2.3 函數參數的按值傳送函數參數的按值傳送 函數調用過程實踐上執行了一個從參數傳送-執行函數體-前往的過程。其中的函數參數傳送過程的本質是將實參值經過棧空間一一傳送給實參的過程,這種把實參表達式的值傳送給對應的形參變量傳送方式稱為“按值傳送。 函數調用 函數定義 返回類型 函數名 (形參 1, 形參 2, ., 形參 n ) 函數體; 棧內存 函數名 (實參1, 實參 2, ., 實參n ); 實參1 的值 實參2 的值 . 實參n 的值 內聯函數的定義方式如下: C+言言語語程程序序設設計計教教程程 第第4章章函函數數4.3 4.3 內聯函數

5、內聯函數 inline 函數類型 函數名 (方式參數表) 函數體; 內聯函數:內聯函數: 是經過在編譯時將函數體代碼插入到函數調用途,將調用是經過在編譯時將函數體代碼插入到函數調用途,將調用函數的方式改為順序執行方式來節省程序執行的時間開銷,這函數的方式改為順序執行方式來節省程序執行的時間開銷,這一過程叫做內聯函數的擴展。因此,內聯函數實踐上是一種用一過程叫做內聯函數的擴展。因此,內聯函數實踐上是一種用空間換時間的方案。空間換時間的方案。但從用戶的角度看,調用內聯函數和普通函數沒有任何區別。 C+言言語語程程序序設設計計教教程程 第第4章章函函數數4.4 4.4 帶默許形參值的函數帶默許形參值

6、的函數 int sub(int x=8,int y=3) return x-y; void main(void) sub(20,15); /傳送給形參傳送給形參x,y的值分別為的值分別為20和和15 sub(10); /傳送給形參傳送給形參x,y的值分別為的值分別為10和和3 sub(); /傳送給形參傳送給形參x,y的值分別為的值分別為8和和3 C+言語允許在函數闡明或函數定義中為形參預賦一個默許的值,這樣的函數就叫做帶有默許形參值的函數。在調用帶有默許參數值的函數時,假設為相應形參指定了實參,那么形參將運用實參的值;否那么,形參相運用其默許值。這就大大地方便了函數的運用。 C+言言語語程程

7、序序設設計計教教程程 第第4章章函函數數4.5 4.5 函數重載函數重載 int max(int,int);int max(int,int,int);float max(float,float);double max(double,double); 函數重載:函數重載: 就是兩個以上的函數,取一樣的函數名,但是形參的個數就是兩個以上的函數,取一樣的函數名,但是形參的個數和類型不同,編譯器根據實參和形參的類型及個數的最正確匹和類型不同,編譯器根據實參和形參的類型及個數的最正確匹配,自動決議調用哪一個函數。配,自動決議調用哪一個函數。 例如: #includeusing namespace std

8、;int add(int x,int y) cout(int, int)t; return x+y; double add(double x,double y) cout(double, double)t; return x+y; int add(int x,double y) cout(int, double)t; return int(x+y); 123456789101112131415161718192021C+言言語語程程序序設設計計教教程程 第第4章章函函數數函數重載函數重載函數重載函數重載函數重載函數重載double add(double x,int y) cout(double

9、,int)t; return x+y; void main() coutadd(9,8)endl; coutadd(9.0,8.0)endl; coutadd(9,8.0)endl; coutadd(9.0,8)endl; 212223242526272829303132C+言言語語程程序序設設計計教教程程 第第4章章函函數數函數重載函數重載重載函數的調用重載函數的調用C+言言語語程程序序設設計計教教程程 第第4章章函函數數4.5 4.5 函數重載函數重載/ C+無法區分這兩個函數。/由于在沒有確定函數調用是對哪一個重載的函數之前,/前往類型是不知道的。 int add(int i1,int

10、i2); float add(int f1,int f2);F留意留意:F(1) 各個重載函數的前往類型可以一樣,也可以不同。但假各個重載函數的前往類型可以一樣,也可以不同。但假設函數名一樣、形參表也一樣,僅僅是前往類型不同,那么設函數名一樣、形參表也一樣,僅僅是前往類型不同,那么是非法的。在編譯時會以為是語法錯誤。是非法的。在編譯時會以為是語法錯誤。 C+言言語語程程序序設設計計教教程程 第第4章章函函數數4.5 4.5 函數重載函數重載1、首先尋覓一個嚴厲的匹配,假設找到了,就調用這個函數。2、假設無嚴厲匹配的函數,就經過類型的自然轉換尋覓一個匹配,假設找到了,就調用這個函數。3、經過用戶

11、定義的轉換尋覓一個匹配。F留意留意:F(2)確定對重載函數的哪個函數進展調用的過程稱為綁定確定對重載函數的哪個函數進展調用的過程稱為綁定(binding)函數重載中參數匹配的步驟函數重載中參數匹配的步驟(函數重載解析過程函數重載解析過程)C+言言語語程程序序設設計計教教程程 第第4章章函函數數4.6 4.6 函數模板函數模板 template 前往類型 函數名 (形參表) 函數體; 函數模板:函數模板: 可以用來創建一個通用功能的函數,以支持多種不同可以用來創建一個通用功能的函數,以支持多種不同形參,進一步簡化重載函數的函數體設計。形參,進一步簡化重載函數的函數體設計。函數模板的定義方式為:函

12、數模板的定義方式為: 模板參數表C+言言語語程程序序設設計計教教程程 第第4章章函函數數4.6 4.6 函數模板函數模板 F意義:意義:F 對于功能完全一樣,只是參數類型不同函數,能寫一對于功能完全一樣,只是參數類型不同函數,能寫一段通用代碼適用于多種不同的數據類型,會使代碼的可重用段通用代碼適用于多種不同的數據類型,會使代碼的可重用性大大提高,從而提高軟件的開發效率。性大大提高,從而提高軟件的開發效率。 template 前往類型 函數名 (形參表) 函數體; C+言言語語程程序序設設計計教教程程 第第4章章函函數數4.6 4.6 函數模板函數模板F留意留意:Ftemplate關鍵字表示聲明

13、的是模板。關鍵字表示聲明的是模板。F中是模板的參數表,可以有一項或多項,其中的類型稱中是模板的參數表,可以有一項或多項,其中的類型稱號為參數化類型,是一種籠統類型或可變類型。號為參數化類型,是一種籠統類型或可變類型。Fclass是類型關鍵字,也可以用是類型關鍵字,也可以用typename作為關鍵字。作為關鍵字。F函數前往值類型可以是普通類型,也可以是模板參數表中函數前往值類型可以是普通類型,也可以是模板參數表中指定的類型。指定的類型。F模板參數表中的參數類型可以是普通類型。模板參數表中的參數類型可以是普通類型。 template 前往類型 函數名 (形參表) 函數體; C+言言語語程程序序設設

14、計計教教程程 第第4章章函函數數4.6 4.6 函數模板函數模板 template 前往類型 函數名 (形參表) 函數體; template T add(T x, T y) return x+y; template T sum() 第五章第五章C+言言語語程程序序設設計計教教程程 復復習習課課5.2.5 字符數組與字符串字符數組與字符串 存放字符型數據的數組稱為字符數組。字符數組也分為一維數組和多維數組。前述的數組的定義及初始化同樣適用于字符數組,除此以外,C+對字符數組的初始化還可以運用字符串方式。 1.用字符進展初始化 例如: char s1 =C,h,i,n,a; char s2 4=H

15、,o,w,a,r,e,y,o,u; 2.用字符串進展初始化 例如: char s3 =China; char s4 4=how, are, you; C+言言語語程程序序設設計計教教程程 第第5章章構構造造數數據據類類型型3. 字符數組的運用字符數組的運用 字符數組也是數組,我們同樣可以經過數組名及下標援用字符數組也是數組,我們同樣可以經過數組名及下標援用數組中的元素。數組中的元素。 為方便對字符與字符串的處置,為方便對字符與字符串的處置,C+提供了許提供了許多專門處置字符與字符串的函數,這些函數原型在各自的頭文多專門處置字符與字符串的函數,這些函數原型在各自的頭文件中定義。件中定義。 下表列

16、出了常用的字符與字符串處置函數的調用方法與功下表列出了常用的字符與字符串處置函數的調用方法與功能簡介,函數原形與詳細的功能可以從能簡介,函數原形與詳細的功能可以從C+編譯器的協助文檔編譯器的協助文檔中獲得。中獲得。C+言言語語程程序序設設計計教教程程 第第5章章構構造造數數據據類類型型5.2.5 字符數組與字符串字符數組與字符串 5.3.6 指針與函數指針與函數 1 1、指針作為函數參數、指針作為函數參數【例【例5-85-8】用傳指針方式實現兩個數據交換】用傳指針方式實現兩個數據交換 分析:用傳值的方式無法實現兩個數據交換。用分析:用傳值的方式無法實現兩個數據交換。用指針作為形參,從實參傳入要

17、交換數據的地址,在函指針作為形參,從實參傳入要交換數據的地址,在函數體內將指針指向的兩個數據交換存儲位置,這樣經數體內將指針指向的兩個數據交換存儲位置,這樣經過過“釜底抽薪的方式實現了數據交換。釜底抽薪的方式實現了數據交換。C+言言語語程程序序設設計計教教程程 第第5章章構構造造數數據據類類型型5.4.2 援用與函數援用與函數 1. 1. 援用作為函數的參數援用作為函數的參數 當援用作為函數的形參,在進展函數調用時,當援用作為函數的形參,在進展函數調用時,進展實參與形參的結合,其結合過程相當于定義了進展實參與形參的結合,其結合過程相當于定義了一個形參對實參的援用。因此,在函數體內,對形一個形參

18、對實參的援用。因此,在函數體內,對形參進展運算相當于對實參進展運算。與指針相比,參進展運算相當于對實參進展運算。與指針相比,援用作為函數參數具有兩個優點:援用作為函數參數具有兩個優點: 函數體的實現比指針簡單。用指針作為形參,函數體的實現比指針簡單。用指針作為形參,函數體內形參要帶著函數體內形參要帶著* *參與運算;而用援用作為形參,參與運算;而用援用作為形參,函數體內參與運算的為形參變量。函數體內參與運算的為形參變量。 調用函數語法簡單。用指針作為形參,實參調用函數語法簡單。用指針作為形參,實參需求取變量的地址;而用援用作為形參,與簡單傳需求取變量的地址;而用援用作為形參,與簡單傳值調用一樣

19、,實參為變量。值調用一樣,實參為變量。 C+言言語語程程序序設設計計教教程程 第第5章章構構造造數數據據類類型型第六章第六章C+言言語語程程序序設設計計教教程程 復復習習課課除了按數據類型區分變量外,根據變量定義的位置,可以把變量分成全局變量與部分變量。全局變量是指定義在函數體外部的變量,它能被一切函數運用。部分變量是指定義在函數或復合語句中的變量,只能在函數或復合語句中運用。 int g=100000;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; co

20、utsum(x,y)+gendl;12345678910111213g為全局變量sum()中 x、y為部分變量main()中的 x、y為部分變量C+言言語語程程序序設設計計教教程程 第第6章章C+程程序序的的構構造造 C+中變量有auto 、extern、register、static四種存儲類型。1.auto闡明符 auto闡明符闡明定義的是一個部分變量。部分變量默許存儲類型為auto, 所以在程序中很少運用auto闡明符闡明。2. register闡明符 register闡明符在定義變量時闡明此變量存儲在CPU中的存放器中,以加快存取速度。普通編譯器本人選擇幾個變量采用存放器存儲,不需求在

21、程序中聲明。C+言言語語程程序序設設計計教教程程 第第6章章C+程程序序的的構構造造6.1.2 6.1.2 變量的存儲變量的存儲 類類 型型 C+中變量有auto 、extern、register、static四種存儲類型。3. extern闡明符 假設一個完好的計算機程序很大,分成多個模塊,放在不同的文件中,分開編譯成目的文件,最后銜接成一個完好的可執行代碼。對于一切模塊共同運用的全局變量,假設在一切的模塊中都定義,在銜接時就會出錯。 處理方法是只在一個模塊中定義全局變量,在其他模塊中用extern闡明這是一個“外來的全局變量。C+言言語語程程序序設設計計教教程程 第第6章章C+程程序序的的

22、構構造造6.1.2 6.1.2 變量的存儲變量的存儲 類類 型型6.1.2 6.1.2 變量的存儲變量的存儲 類類 型型4. static闡明符闡明符static闡明符用于在定義變量時將變量聲明為成闡明符用于在定義變量時將變量聲明為成static(靜態靜態)變量。變量。 其格式為:其格式為: static 數據類型數據類型 變量名變量名=初值;初值; F留意留意:F 當一個部分變量聲明為當一個部分變量聲明為static變量,它既具有部分變量的變量,它既具有部分變量的性質:只能在函數體部分存取;又具有全局變量的性質:函性質:只能在函數體部分存取;又具有全局變量的性質:函數多次進入,變量的值只初始

23、化一次。因此靜態部分變量本數多次進入,變量的值只初始化一次。因此靜態部分變量本質是一個供函數部分存取的全局變量。質是一個供函數部分存取的全局變量。 C+言言語語程程序序設設計計教教程程 第第6章章C+程程序序的的構構造造6.1.3 6.1.3 變量在內存中的存儲變量在內存中的存儲 全局變量、靜態變量、字符串常量、常變量存放在全局數據區;一切的函數和代碼存放在代碼區;為運轉函數而分配的函數參數、部分變量、前往地址存放在棧區;堆區用于動態內存分配。 變量的生存期為從產生到消逝的時期。全局變量、靜態變量、常變量生存周期為整個程序的生存周期,因此稱為靜態生存期;部分變量的生存周期起于函數調用,終了于函

24、數調用終了,其生存期是動態的,因此稱為動態生存期。C+言言語語程程序序設設計計教教程程 第第6章章C+程程序序的的構構造造6.3 6.3 程序的文件構造與編譯預處置命令程序的文件構造與編譯預處置命令 一個高級言語源程序在計算機上運轉,必需先用編譯程序將其翻譯為機器言語。在編譯之前還要做某些預處置任務,如去掉注釋,變換格式等。C+源程序中以#開頭、以換行符結尾的行稱為預處置命令。預處置命令不是C+言語的語法成分,在編譯前由預處置器執行,在目的程序中,不含預處置指令對應的機器碼。因此,預處置命令不以分號結尾。許多預處置命令更適宜程序員,但為了處置C遺留的代碼,C+編程者也應該熟習預處置命令。 C+

25、言言語語程程序序設設計計教教程程 第第6章章C+程程序序的的構構造造6.4 6.4 名字空間名字空間 一個軟件往往由多個模塊(組件)組成,這些模塊由不同程序員(軟件商)提供,不同模塊能夠運用了一樣的標識符。簡單說就是同一個名字在不同模塊中代表不同的事物。當這些模塊用到同一個程序中,同名標識符就引起沖突。C+提供名字空間(namespace) 將一樣的名字放在不同空間中來防止命名沖突。 定義一個名字空間的格式如下: 其中:namespace 為關鍵字。稱號為名字空間標識符。成員為函數、變量、常量、自定義類型等。 namespace 稱號 成員; C+言言語語程程序序設設計計教教程程 第第6章章C

26、+程程序序的的構構造造第七章第七章C+言言語語程程序序設設計計教教程程 復復習習課課在面向對象的程序設計中,程序模塊是由類構成的。類是對邏輯上相關的函數與數據的封裝,它是對問題的籠統描畫。數據封裝就是將一組數據和與這組數據有關操作組裝在一同,構成一個實體,這實體也就是類。類與對象是C+程序設計中最重要的概念。 C+言言語語程程序序設設計計教教程程 第第7章章類類與與對對象象void main(void) Clock MyClock; MyClock.ShowTime(); MyClock.SetTime(8,30,30); MyClock.ShowTime();* p7_1_b.cpp * 面

27、向對象的時鐘程序 */#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; ;123456789101112131415161718192021222324252627時鐘程序時鐘程序B時鐘程序時鐘程序BC+言言語語程程序序設設計計教教程程 第第7章章類類與與對對象象例如:例7-1中定義了一個時鐘類Clock。 C

28、+言言語語程程序序設設計計教教程程 第第7章章類類與與對對象象1. 數據成員數據成員 類定義中的數據成員描畫了類對象所包含的數類定義中的數據成員描畫了類對象所包含的數據類型,數據成員的類型可以是據類型,數據成員的類型可以是C+根本數據類型,根本數據類型,也可以是構造數據類型。也可以是構造數據類型。C+言言語語程程序序設設計計教教程程 第第7章章類類與與對對象象class Team; /已定義的類class Grade Team a; / 運用了已定義的類類型 Grade *p; / 運用正在定義的類類型定義指針成員 Grade &r; / 運用正在定義的類類型定義援用成員 Grade

29、b; / 錯誤! 運用了未定義完的類Record 定義變量; F留意留意:F 由于類只是一種類型,類中的數據成員不占內存空間,因由于類只是一種類型,類中的數據成員不占內存空間,因此在定義數據成員時不能給數據成員賦初值。此在定義數據成員時不能給數據成員賦初值。F 類的數據成員除了可以運用前面講述的類的數據成員除了可以運用前面講述的C+類型外,還可類型外,還可以運用已定義完好的類類型。以運用已定義完好的類類型。F 在正在定義的類中,由于該類型沒有定義完好,所以不能在正在定義的類中,由于該類型沒有定義完好,所以不能定義該類類型的變量,只能定義該類類型的指針成員以及該定義該類類型的變量,只能定義該類類

30、型的指針成員以及該類類型的援用成員。類類型的援用成員。 C+言言語語程程序序設設計計教教程程 第第7章章類類與與對對象象2. 成員函數成員函數 作為類成員的成員函數描畫了對類中的數據成員實施的作為類成員的成員函數描畫了對類中的數據成員實施的操作。成員函數的定義、聲明格式與非成員函數操作。成員函數的定義、聲明格式與非成員函數(全局函數全局函數)的格式一樣。成員函數可以放在類中定義,也可以放在類外。的格式一樣。成員函數可以放在類中定義,也可以放在類外。放在類中定義的成員函數為內聯放在類中定義的成員函數為內聯(inline)函數。函數。 Clock類中的成員函數就是放在類內定義的。類中的成員函數就是

31、放在類內定義的。C+言言語語程程序序設設計計教教程程 第第7章章類類與與對對象象2. 成員函數成員函數 C+可以在類內聲明成員函數的原型,在類外定義函數可以在類內聲明成員函數的原型,在類外定義函數體。這樣做的益處是相當于在類內列了一個函數功能表,使體。這樣做的益處是相當于在類內列了一個函數功能表,使我們對類的成員函數的功能一目了然,防止了在各個函數實我們對類的成員函數的功能一目了然,防止了在各個函數實現的大堆代碼中查找函數的定義。在類中聲明函數原型的方現的大堆代碼中查找函數的定義。在類中聲明函數原型的方法與普通函數原型的聲明一樣,在類外定義函數體的格式如法與普通函數原型的聲明一樣,在類外定義函

32、數體的格式如下:下: :是類的作用域分辨符,用在此處,放在類名后成員函是類的作用域分辨符,用在此處,放在類名后成員函數前,闡明后面的成員函數屬于前面的那個類。數前,闡明后面的成員函數屬于前面的那個類。前往值類型 類名 : 成員函數名(形參表) 函數體;C+言言語語程程序序設設計計教教程程 第第7章章類類與與對對象象3. 類作用域類作用域 類是一組數據成員和函數成員的集合,類作用域作用于類類是一組數據成員和函數成員的集合,類作用域作用于類中定義的特定的成員,包括數據成員與成員函數,類內的每一中定義的特定的成員,包括數據成員與成員函數,類內的每一個成員都具有類作用域。實踐上,類的封裝作用也就是限制

33、類個成員都具有類作用域。實踐上,類的封裝作用也就是限制類的成員其訪問范圍局限于類的作用域之內。的成員其訪問范圍局限于類的作用域之內。 C+言言語語程程序序設設計計教教程程 第第7章章類類與與對對象象類相當于一種包含函數的自定義數據類型,它不占內存,是一個籠統的“虛體,運用已定義的類建立對象就像用數據類型定義變量一樣。對象建立后,對象占據內存,變成了一個“實體。類與對象的關系就像數據類型與變量的關系一樣。其實,一個變量就是一個簡單的不含成員函數的數據對象。建立對象的格式如下:其中,對象名可以是簡單的標識符,也可以是數組。在例7-1中,運用:Clock MyClock; 建立了一個Clock型的對

34、象MyClock。C+言言語語程程序序設設計計教教程程 第第7章章類類與與對對象象類名 對象名;經過設置成員的存取控制屬性, 使對類成員的存獲得到控制,從而到達了信息隱藏的目的。C+的存取控制屬性有:公有類型(public)、私有類型(private)和維護類型(protected)。三者的意義如下:表7-1 存取控制屬性表 C+言言語語程程序序設設計計教教程程 第第7章章類類與與對對象象存取屬性存取屬性意意 義義可存取對象可存取對象public 公開(公有)級 該類成員以及所有對象protected 保護級 該類及其子類成員 private 私有級該類的成員 類中定義為public等級的成員

35、,可以被該類的任何對象存取,適用于完全公開的數據。而private等級的成員只可被類內的成員存取,適用于不公開的數據。至于protected等級,屬于半公開性質的數據,定義為protected等級的成員,可以被該類及其子類存取。關于子類的概念,在以后的章節中講述。 在定義一個對象的同時,希望能給它的數據成員賦初值對象的初始化。在特定對象運用終了時,還經常需求進展一些清理任務。C+程序中類的初始化和清理任務分別由兩個特殊的成員函數來完成,它們就是構造函數和析構函數。C+言言語語程程序序設設計計教教程程 第第7章章類類與與對對象象7.2 7.2 構造函數與析構函數構造函數與析構函數構造函數構造函數

36、(constructor)構造函數是與類名一樣的,在建立對象時自動調用的函數。構造函數是與類名一樣的,在建立對象時自動調用的函數。假設在定義類時,沒有為類定義構造函數,編譯系統就生成一假設在定義類時,沒有為類定義構造函數,編譯系統就生成一個默許方式的隱含的的構造函數,這個構造函數的函數體是空個默許方式的隱含的的構造函數,這個構造函數的函數體是空的,因此默許構造函數不具備任何功能。的,因此默許構造函數不具備任何功能。假設用戶至少為類定義了一個構造函數,假設用戶至少為類定義了一個構造函數,C+就不會生成就不會生成任何默許的構造函數,而是根據對象的參數類型和個數從用戶任何默許的構造函數,而是根據對象

37、的參數類型和個數從用戶定義的構造函數中選擇最適宜的構造函數完成對該對象的初始定義的構造函數中選擇最適宜的構造函數完成對該對象的初始化。化。C+言言語語程程序序設設計計教教程程 第第7章章類類與與對對象象7.2.1 7.2.1 構造函數構造函數構造函數構造函數(constructor)作為類的成員函數,構造函數可以直接訪問類的一切數據作為類的成員函數,構造函數可以直接訪問類的一切數據成員,可以是內聯函數,可以不帶任何參數,可以帶有參數表成員,可以是內聯函數,可以不帶任何參數,可以帶有參數表以及默許形參值,還可以重載,用戶可以根據不同問題的詳細以及默許形參值,還可以重載,用戶可以根據不同問題的詳細

38、需求,有針對性地設計適宜的構造函數將對象初始化為特定的需求,有針對性地設計適宜的構造函數將對象初始化為特定的形狀。形狀。 C+言言語語程程序序設設計計教教程程 第第7章章類類與與對對象象7.2.1 7.2.1 構造函數構造函數構造函數是類的一個成員函數,除了具有普通成員函數的特征之外,還歸納出如下特殊的性質:構造函數的函數名必需與定義它的類同名。構造函數沒有前往值。假設在構造函數前加void是錯誤的。構造函數被聲明定義為公有函數。構造函數在建立對象時由系統自動調用。C+言言語語程程序序設設計計教教程程 第第7章章類類與與對對象象7.2.1 7.2.1 構造函數構造函數自然界萬物都是有生有滅,程

39、序中的對象也是一樣。對象在定義時誕生,不同生存期的對象在不同的時期消逝。在對象要消逝時,通常有一些善后任務需求做, 例如:構造對象時,經過構造函數動態懇求了一些內存單元,在對象消逝之前就要釋放這些內存單元。C+用什么來保證這些善后去除任務的執行呢?答案是:析構函數。C+言言語語程程序序設設計計教教程程 第第7章章類類與與對對象象7.2.2 7.2.2 析構函數析構函數拷貝構造函數是與類名一樣,形參是本類的對象的援用的拷貝構造函數是與類名一樣,形參是本類的對象的援用的函數,在用已存在對象初始化新建立對象時調用。函數,在用已存在對象初始化新建立對象時調用。類的拷貝構造函數普通由用戶定義,假設用戶沒

40、有定義拷類的拷貝構造函數普通由用戶定義,假設用戶沒有定義拷貝構造函數,系統就會自動生成一個默許函數,這個默許拷貝貝構造函數,系統就會自動生成一個默許函數,這個默許拷貝構造函數的功能是把初始值對象的每個數據成員的值依次復制構造函數的功能是把初始值對象的每個數據成員的值依次復制到新建立的對象中。因此,也可以說是完成了同類對象的克隆到新建立的對象中。因此,也可以說是完成了同類對象的克隆(Clone)。這樣得到的對象和原對象具有完全一樣的數據成員,。這樣得到的對象和原對象具有完全一樣的數據成員,即完全一樣的屬性。即完全一樣的屬性。 C+言言語語程程序序設設計計教教程程 第第7章章類類與與對對象象7.2

41、.3 7.2.3 拷貝構造函數拷貝構造函數( (復制構造函數復制構造函數) )淺拷貝,即直接將原對象的數據成員值依次拷貝淺拷貝,即直接將原對象的數據成員值依次拷貝給新對象中對應的數據成員給新對象中對應的數據成員,并沒有為新對象另外分配并沒有為新對象另外分配內存資源。這樣,假設對象的數據成員是指針,兩個內存資源。這樣,假設對象的數據成員是指針,兩個指針對象實踐上指向的是同一塊內存空間。指針對象實踐上指向的是同一塊內存空間。當類的數據成員中有指針類型時,我們就必需定當類的數據成員中有指針類型時,我們就必需定義一個特定的拷貝構造函數,該拷貝構造函數不僅可義一個特定的拷貝構造函數,該拷貝構造函數不僅可

42、以實現原對象和新對象之間數據成員的拷貝,而且可以實現原對象和新對象之間數據成員的拷貝,而且可以為新的對象分配單獨的內存資源,這就是深拷貝構以為新的對象分配單獨的內存資源,這就是深拷貝構造函數。造函數。C+言言語語程程序序設設計計教教程程 第第7章章類類與與對對象象7.2.4 7.2.4 淺拷貝與深拷貝淺拷貝與深拷貝對象數組是以對象為元素的數組。對象數組的定義、賦對象數組是以對象為元素的數組。對象數組的定義、賦值、援用與普通數組一樣,只是數組元素與普通數組的數組元值、援用與普通數組一樣,只是數組元素與普通數組的數組元素不同。素不同。對象數組定義格式如下:對象數組定義格式如下: 其中,類名指出該數

43、組元素所屬的類,常量表達式給出其中,類名指出該數組元素所屬的類,常量表達式給出某一維元素的個數。某一維元素的個數。C+言言語語程程序序設設計計教教程程 第第7章章類類與與對對象象類名類名 對象數組名對象數組名常量表達式常量表達式n,.,常量表達式常量表達式1; 7.3.3 7.3.3 對象數組對象數組與構造數組不同,對象數組初始化需求運用構造函數完成,以一個大小為n的一維數組為例,對象數組的初始化格式如下:C+言言語語程程序序設設計計教教程程 第第7章章類類與與對對象象數組名n= 構造函數(數據成員1初值,數據成員2初值,), 構造函數(數據成員1初值,數據成員2初值,), 構造函數(數據成員

44、1初值,數據成員2初值,);F留意:不帶初始化表的對象數組,其初始化靠調用不帶參數留意:不帶初始化表的對象數組,其初始化靠調用不帶參數的構造函數完成。的構造函數完成。 7.3.3 7.3.3 對象數組對象數組一個類對象的public成員可被本類的其他對象存取,即可供一切對象運用,但是此類的每個對象都各自擁有一份,不存在真正意義上的共享成員。所以,C+提供了靜態成員,用以處理同一個類的不同對象之間數據成員和函數的共享問題。靜態成員的特點是:不論這個類創建了多少個對象,其靜態成員在內存中只保管一份拷貝,這個拷貝為該類的一切對象所共享。類的靜態成員有兩種:靜態數據成員和靜態函數成員,下面分別對它們進

45、展討論 C+言言語語程程序序設設計計教教程程 第第7章章類類與與對對象象7.4 7.4 靜態成員靜態成員C+言言語語程程序序設設計計教教程程 第第7章章類類與與對對象象數據隱藏給不同類和對象的成員函數之間,類的成員函數和類外的普通函數之間進展屬性共享帶來妨礙,必需尋求一種方法使得類外的對象可以訪問類中的私有成員,提高程序的效率。為理處理這個問題,C+提出了運用友元作為實現這一要求的輔助手段。友元不是類的成員,但它可以訪問類的任何成員包括私有成員。聲明為友元的外界對象既可以是另一個類的成員函數,也可以是不屬于任何類的普通的函數,稱之為友元函數;友元也可以是整個的一個類,稱之為友元類。7.5 7.

46、5 友元友元第八章第八章C+言言語語程程序序設設計計教教程程 復復習習課課8.1 8.1 承繼與派生承繼與派生 在C+中,可以利用已有的類來定義新的類,新類將擁有原有類的全部特性,原有類被稱為基類(Base class)或父類(Super class),新產生的類被稱為派生類(Derived class)或子類(Sub class)。派生類擁有基類的特性稱作承繼,由基類產生派生類的過程稱為派生。 8.1.1 承繼的概念承繼的概念C+言言語語程程序序設設計計教教程程 第第8章章承承繼繼與與派派生生8.1 8.1 承繼與派生承繼與派生 8.1.1 承繼的概念承繼的概念假設每一個派生類都有且僅有一個

47、基類,派生類可以看作是基類的特例,它添加了某些基類所沒有的性質。這種承繼方式,稱為單承繼或單向承繼。現實生活中,子女的外貌、血型往往不是僅僅承繼自父親或母親,而是將父母親的特點都承繼下來。與之相類似,假設一個派生類有兩個或兩個以上的基類,那么稱為多承繼或多重承繼。 派生類又作為基類,繼續派生新的類, 這樣的派生方式稱為多層派生,從承繼的角度看稱為多層承繼。C+言言語語程程序序設設計計教教程程 第第8章章承承繼繼與與派派生生C+言言語語程程序序設設計計教教程程 第第8章章承承繼繼與與派派生生 8.1.1 承繼的概念承繼的概念8.1 8.1 承繼與派生承繼與派生 class Clock priva

48、te: 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); /設置響鈴時間設置響鈴時間 SwitchAlarm(bool Open=true); /打開打開/關閉鬧鈴關閉鬧

49、鈴 ShowTime(); /顯示當前時間與鬧鈴時間顯示當前時間與鬧鈴時間C+言言語語程程序序設設計計教教程程 第第8章章承承繼繼與與派派生生【例如】在普通的時鐘類Clock根底上派生出鬧鐘類AlarmClock:類 名成 員 名AlarmClock:Clock:H, M, SSetTime()ShowTime()AH, AM, OpenAlarmSetAlarm()SwitchAlarm()ShowTime()AlarmClock()派生類派生類AlarmClock的成員構成圖的成員構成圖(表表) 8.1 8.1 承繼與派生承繼與派生 8.1.2 派生類實現派生類實現C+言言語語程程序序設設

50、計計教教程程 第第8章章承承繼繼與與派派生生 承繼描畫的是普通類與特殊類的關系,類與類之間表達的是“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+言言語語程程序序設設計計教教程程 第第8章章承承繼繼與與派派生生 組合描畫的是整體與部分的關系,類與類之間表達的是“is a pa

51、rt of,即假設在邏輯上A是B的一部分is a part of,那么允許A和其他數據成員組合為B。例如:發動機、車輪、電池、車門、方向盤、底盤都是小汽車的一部分,它們組合成汽車。而不能說發動機是汽車的一種。8.1 8.1 承繼與派生承繼與派生 8.1.3 承繼與組合承繼與組合C+言言語語程程序序設設計計教教程程 第第8章章承承繼繼與與派派生生 基類的公有成員在派生類中依然為公有成員,可基類的公有成員在派生類中依然為公有成員,可以由派生類對象和派生類成員函數直接訪問。以由派生類對象和派生類成員函數直接訪問。 基類的私有成員在派生類中,無論是派生類的成基類的私有成員在派生類中,無論是派生類的成員

52、還是派生類的對象都無法直接訪問。員還是派生類的對象都無法直接訪問。 維護成員在派生類中仍是維護成員,可以經過派維護成員在派生類中仍是維護成員,可以經過派生類的成員函數訪問,但不能由派生類的對象直接生類的成員函數訪問,但不能由派生類的對象直接訪問。訪問。公有方式承繼的特點:公有方式承繼的特點: F留意留意:F對基類成員的訪問,一定要分清是經過派生類對象訪問還是對基類成員的訪問,一定要分清是經過派生類對象訪問還是經過派生類成員函數訪問。經過派生類成員函數訪問。 8.2 8.2 承繼的方式承繼的方式 8.2.1 公有承繼公有承繼C+言言語語程程序序設設計計教教程程 第第8章章承承繼繼與與派派生生基類

53、的公有成員和維護成員被承繼后作為派生類的基類的公有成員和維護成員被承繼后作為派生類的私有成員,即基類的公有成員和維護成員被派生類吸私有成員,即基類的公有成員和維護成員被派生類吸收后,派生類的其他成員函數可以直接訪問它們,但收后,派生類的其他成員函數可以直接訪問它們,但是在類外部,不能經過派生類的對象訪問它們。是在類外部,不能經過派生類的對象訪問它們。 基類的私有成員在派生類中不能被直接訪問。無論基類的私有成員在派生類中不能被直接訪問。無論是派生類的成員還是經過派生類的對象,都無法訪問是派生類的成員還是經過派生類的對象,都無法訪問從基類承繼來的私有成員。從基類承繼來的私有成員。 8.2 8.2

54、承繼的方式承繼的方式 8.2.2 私有承繼私有承繼私有方式承繼的特點:私有方式承繼的特點: C+言言語語程程序序設設計計教教程程 第第8章章承承繼繼與與派派生生經過私有承繼之后,一切基類的成員都成為了派生經過私有承繼之后,一切基類的成員都成為了派生類的私有成員或不可訪問的成員,假設進一步派生的類的私有成員或不可訪問的成員,假設進一步派生的話,基類的全部成員將無法在新的派生類中被訪問。話,基類的全部成員將無法在新的派生類中被訪問。因此,私有承繼之后,基類的成員再也無法在以后的因此,私有承繼之后,基類的成員再也無法在以后的派生類中發揚作用,實踐是相當于中止了基類的繼續派生類中發揚作用,實踐是相當于

55、中止了基類的繼續派生,出于這種緣由,普通情況下私有承繼的運用比派生,出于這種緣由,普通情況下私有承繼的運用比較少。較少。 8.2 8.2 承繼的方式承繼的方式 8.2.2 私有承繼私有承繼私有方式承繼的特點:私有方式承繼的特點: C+言言語語程程序序設設計計教教程程 第第8章章承承繼繼與與派派生生8.2 8.2 承繼的方式承繼的方式 8.2.3 維護承繼維護承繼維護成員的特點:維護成員的特點: 基類中基類中protected的成員的成員1、類內部:可以訪問、類內部:可以訪問2、類的運用者:不能訪問、類的運用者:不能訪問3、類的派生類成員:可以訪問、類的派生類成員:可以訪問維護成員的例如維護成員

56、的例如 C+言言語語程程序序設設計計教教程程 第第8章章承承繼繼與與派派生生基類的公有成員和維護成員被承繼后作為派生類基類的公有成員和維護成員被承繼后作為派生類的維護成員。的維護成員。 基類的私有成員在派生類中不能被直接訪問。基類的私有成員在派生類中不能被直接訪問。 8.2 8.2 承繼的方式承繼的方式 8.2.3 維護承繼維護承繼維護方式承繼的特點:維護方式承繼的特點: 1.派生類構造函數的定義派生類構造函數的定義C+言言語語程程序序設設計計教教程程 第第8章章承承繼繼與與派派生生派生類名派生類名(參數總表參數總表): 基類名基類名1(參數表參數表1),.,基類名基類名m (參數表參數表m)

57、,成員對象名成員對象名1(成員對象參數表成員對象參數表1),.,成員對象名成員對象名n(成員對象參數成員對象參數表表n) 派生類新增成員的初始化;派生類新增成員的初始化; 基類名1(參數表1),.,基類名m (參數表m)稱為基類成員的初始化表。 成員對象名1(成員對象參數表1),.,成員對象名n(成員對象參數表n) 為成員對象的初始化表。基類成員的初始化表與成員對象的初始化表構成派生類構造函數的初始化表。8.3 8.3 派生類的構造與析構派生類的構造與析構 C+言言語語程程序序設設計計教教程程 第第8章章承承繼繼與與派派生生在派生類構造函數的參數總表中,需求給出基類數據成員的初值、成員對象數據

58、成員的初值、新增普通數據成員的初值。在參數總表之后,列出需求運用參數進展初始化的基類名、成員對象名及各自的參數表,各項之間運用逗號分隔。8.3 8.3 派生類的構造與析構派生類的構造與析構 1.派生類構造函數的定義派生類構造函數的定義派生類名派生類名(參數總表參數總表): 基類名基類名1(參數表參數表1),.,基類名基類名m (參數表參數表m),成員對象名成員對象名1(成員對象參數表成員對象參數表1),.,成員對象名成員對象名n(成員對象參數成員對象參數表表n) 派生類新增成員的初始化;派生類新增成員的初始化; C+言言語語程程序序設設計計教教程程 第第8章章承承繼繼與與派派生生基類名、對象名

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

60、;調用基類構造函數; 調用內嵌成員對象的構造函數,調用順序按照它們調用內嵌成員對象的構造函數,調用順序按照它們在類中定義的順序在類中定義的順序 。 派生類本人的構造函數。派生類本人的構造函數。 單承繼時,派生類構造函數調用的普通次序如下: 當派生類對象析構時,各析構函數的調用順序正好當派生類對象析構時,各析構函數的調用順序正好相反。首先調用派生類析構函數相反。首先調用派生類析構函數(清理派生類新增成清理派生類新增成員員);然后調用派生類成員對象析構函數;然后調用派生類成員對象析構函數(清理派生類清理派生類新增的成員對象新增的成員對象);最后調用基類析構函數;最后調用基類析構函數(清理從基清理從基類承繼來的基類子對象類承繼來

溫馨提示

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

評論

0/150

提交評論