清華大學(xué)數(shù)據(jù)結(jié)構(gòu)課件(考研必備)C++基礎(chǔ)復(fù)習(xí)_第1頁
清華大學(xué)數(shù)據(jù)結(jié)構(gòu)課件(考研必備)C++基礎(chǔ)復(fù)習(xí)_第2頁
清華大學(xué)數(shù)據(jù)結(jié)構(gòu)課件(考研必備)C++基礎(chǔ)復(fù)習(xí)_第3頁
清華大學(xué)數(shù)據(jù)結(jié)構(gòu)課件(考研必備)C++基礎(chǔ)復(fù)習(xí)_第4頁
清華大學(xué)數(shù)據(jù)結(jié)構(gòu)課件(考研必備)C++基礎(chǔ)復(fù)習(xí)_第5頁
已閱讀5頁,還剩83頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、C+基礎(chǔ)復(fù)習(xí)1陳蓓陳蓓 136 9364 9407 FIT樓4-504 文曦文曦 little_ 150 0121 9726 FIT樓1-508目錄目錄基礎(chǔ)知識(shí)基礎(chǔ)知識(shí)函數(shù)與參數(shù)傳遞函數(shù)與參數(shù)傳遞數(shù)據(jù)類型數(shù)據(jù)類型類:抽象、封裝、繼承、多態(tài)類:抽象、封裝、繼承、多態(tài)模板模板2計(jì)算機(jī)語言機(jī)器語言(0,1)匯編語言(依賴于特定機(jī)器或環(huán)境)高級語言CC+C#JavaPython3C/C+發(fā)展歷史C語言由貝爾實(shí)驗(yàn)室的Dennis Ritchie 在B 語言的基礎(chǔ)上開發(fā)而來的,1972 年在一臺(tái)DEC PDP11 計(jì)算機(jī)上實(shí)現(xiàn)了最初的C 語言最初的C語言只是為了描述和實(shí)現(xiàn)UNIX操作系統(tǒng)提供一種工作語言而

2、設(shè)計(jì)的C+語言1980 年,AT&T 貝爾實(shí)驗(yàn)室的Bjarne Stroustrup博士開始對C 語言進(jìn)行改進(jìn)和擴(kuò)充,創(chuàng)建了一個(gè)新的語言“帶類的C”,1983 年正式取名為C+4C語言的特點(diǎn)和局限特點(diǎn)語言簡潔、方便、靈活提供了豐富的運(yùn)算符和數(shù)據(jù)結(jié)構(gòu)比匯編語言更具有良好的可讀性和可移植性程序運(yùn)行效率高局限類型檢查機(jī)制較弱代碼可重用性差開發(fā)大型應(yīng)用復(fù)雜、可維護(hù)性差5C+語言的特點(diǎn)與C語言完全兼容保持了C語言的強(qiáng)大功能從C到C+是一個(gè)平緩的過渡增加了面向?qū)ο蟮母拍畲a可重用性好適合編寫大型應(yīng)用6C+程序執(zhí)行過程7源文件、目標(biāo)文件和可執(zhí)行文件源文件即源代碼文件(*.c,*.cpp),本質(zhì)就是文

3、本文件目標(biāo)文件編譯器根據(jù)源文件創(chuàng)建的機(jī)器語言指令成為目標(biāo)代碼,目標(biāo)文件即包含目標(biāo)代碼的文件。一般為(*.obj)文件,Linux下為(*.o)文件8源文件、目標(biāo)文件和可執(zhí)行文件可執(zhí)行文件編譯完源代碼后生成的目標(biāo)文件并不能直接執(zhí)行一般程序都會(huì)引用基本的庫函數(shù),因此在運(yùn)行程序之前還要把庫函數(shù)用定義好的目標(biāo)代碼替換,這個(gè)過程稱為鏈接,就是把自己寫的源代碼的目標(biāo)文件與庫函數(shù)的目標(biāo)文件組合起來,生成最終的可執(zhí)行文件鏈接由鏈接器完成9C+程序示例Hello World程序功能:在控制臺(tái)輸出字符串”Hello, World!”10#include using namespace std;int main()

4、cout “Hello, World!” endl;return 0;示例程序分析#include 預(yù)處理命令“#”預(yù)處理過程掃描源代碼,對其進(jìn)行初步的轉(zhuǎn)換,產(chǎn)生新的源代碼提供給編譯器using namespace std;使用std命名空間(標(biāo)示符的可見范圍)命名空間可以使各個(gè)開發(fā)者或開發(fā)團(tuán)體的庫文件即使重名也不致產(chǎn)生混亂11示例程序分析int main()主函數(shù),程序入口點(diǎn)按C+標(biāo)準(zhǔn),主函數(shù)類型為intcout “Hello, World!” endl;cout:標(biāo)準(zhǔn)輸出流對象,作用相當(dāng)于C語言中的printf()endl:輸出一個(gè)換行,并清空流return 0;返回語句:為整型的主函數(shù)返

5、回一個(gè)整型值12預(yù)處理指令文件包含#include 格式#include 例如:#include (不使用using時(shí))#include (使用using時(shí)) 一般用于包含標(biāo)準(zhǔn)頭文件#include “文件名”例如:#include “MyMatrix.h”“ ”一般用于包含自定義頭文件,該文件一般放在程序當(dāng)前目錄功能通過預(yù)處理,將頭文件的一份副本取代該命令組成新的源代碼交給編譯器13預(yù)處理指令宏定義格式#define 標(biāo)識(shí)符 替換字符串功能用于定義符號常量和宏,程序中出現(xiàn)的所有該標(biāo)識(shí)符在編譯前自動(dòng)使用替換字符串代替例如#define PI 3.1415926#define LOG2 0.30

6、103cout PI * 7 * 7 endl;14預(yù)處理指令帶參數(shù)的宏格式#define 宏名(參數(shù)表) 字符串示例#define PI 3.1415926#define S(r) PI * r * rcout S(7) endl;15預(yù)處理指令帶參數(shù)的宏宏的替換是一種字符串整體替換,宏本身不具備計(jì)算功能#define MULTIPLY(x, y) x*ycout MULTIPLY(4 + 7, 7) endl;運(yùn)行的結(jié)果是53,而不是77因?yàn)楹晗韧暾鎿Q成4+7*7,再按C+的標(biāo)準(zhǔn)運(yùn)算順序進(jìn)行計(jì)算16預(yù)處理指令條件編譯格式#if !defined 常量名#define 常量名 表達(dá)式#en

7、dif注意#if與#endif一一對應(yīng),配對出現(xiàn)#ifdef和#ifndef分別相當(dāng)于#if defined和#if !defined分支采用#elseif和#else17預(yù)處理指令條件編譯條件編譯示例18#include using namespace std;#define DEBUGint main()#ifdef DEBUGcout “Debug version!” endl;#elsecout “Release version!” endl;#endifreturn 0;C+標(biāo)準(zhǔn)輸出流cout流輸出格式cout 表達(dá)式 表達(dá)式 ;例如:cout a b c 變量名 變量名 ;例如:c

8、in i j k;功能從鍵盤為變量輸入數(shù)據(jù),數(shù)據(jù)之間可以換行或空格作為分隔類似C語言中的scanf()函數(shù)20目錄目錄基礎(chǔ)知識(shí)基礎(chǔ)知識(shí)函數(shù)與參數(shù)傳遞函數(shù)與參數(shù)傳遞數(shù)據(jù)類型數(shù)據(jù)類型類類模板模板21函數(shù)的參數(shù)傳遞傳值22/* 本程序達(dá)不到交換兩個(gè)變量值的目的本程序達(dá)不到交換兩個(gè)變量值的目的 ,輸出結(jié)果,輸出結(jié)果m=1 n=2 */void swap(int a, int b)int temp;temp = a; a = b; b = temp;int main()int m = 1, n = 2;swap(m, n);cout “m=“ m “ n=” n endl;return 0;函數(shù)的參數(shù)傳

9、遞傳地址23/* 本程序可以達(dá)到交換兩個(gè)變量值的目的,輸出結(jié)果本程序可以達(dá)到交換兩個(gè)變量值的目的,輸出結(jié)果m=2 n=1 */void swap(int *a, int *b)int temp;temp = *a; *a = *b; *b = temp;int main()int m = 1, n = 2;swap(&m, &n);cout “m=“ m “ n=” n endl;return 0;函數(shù)的參數(shù)傳遞傳地址24/* 本程序不能達(dá)到交換兩個(gè)變量值的目的!本程序不能達(dá)到交換兩個(gè)變量值的目的!void swap(int *a, int *b)int *temp;temp

10、= a; a = b; b = temp;int main()int m = 1, n = 2;swap(&m, &n);cout “m=“ m “ n=” n endl;return 0;引用引用是C+中針對變量的一種別名機(jī)制引用不能單獨(dú)存在,它存在的前提是它所代表的變量首先存在定義格式:類型 &引用名 = 變量名;例如:int a;int &b = a;25引用的定義與使用26/* 引用引用b的值隨變量的值隨變量a的值的改變而改變,輸出結(jié)果的值的改變而改變,輸出結(jié)果a=2 b=2 */#include using namespace std;int main

11、()int a = 1;int &b = a;a = 2;cout “a=“ a “ b=” b endl;return 0;引用注意事項(xiàng)引用必須進(jìn)行初始化int &a;/錯(cuò)誤,沒有進(jìn)行初始化引用的對象只能是變量 引用近似于指針常量引用近似于指針常量const int a;int &b = a;/錯(cuò)誤,a是常量不能引用引用與所引用的變量必須具有相同的數(shù)據(jù)類型int a;float &b = a;/錯(cuò)誤,引用與變量類型不一致引用不是變量,因此無法對引用進(jìn)行引用int a; int &b = a; int &c = b;/無錯(cuò)誤,但c引用的是a可以對

12、指針進(jìn)行引用,因?yàn)橹羔樢彩亲兞縤nt a; int* b = &a; int* &c= b; /c引用的是指針變量b27函數(shù)的參數(shù)傳遞傳引用28/* 本程序也可以達(dá)到交換兩個(gè)變量值的目的,輸出結(jié)果本程序也可以達(dá)到交換兩個(gè)變量值的目的,輸出結(jié)果m=2 n=1 */void swap(int &a, int &b)int temp;temp = a; a = b; b = temp;int main()int m = 1, n = 2;swap(m, n);cout “m=“ m “ n=” n endl;return 0;缺省參數(shù)函數(shù)缺省參數(shù)函數(shù)在函數(shù)聲明時(shí)可以預(yù)

13、先給出部分或全部的形參以默認(rèn)的值(缺省參數(shù)),調(diào)用函數(shù)時(shí)如果傳入實(shí)參則使用實(shí)參的值,否則則使用默認(rèn)形參值注意缺省參數(shù)列表必須放在形參列表的最右端不能與重載函數(shù)相沖突29缺省參數(shù)函數(shù)示例30/* 本程序可以實(shí)現(xiàn)兩個(gè)或三個(gè)數(shù)的相乘,輸出結(jié)果本程序可以實(shí)現(xiàn)兩個(gè)或三個(gè)數(shù)的相乘,輸出結(jié)果6 24 */int multiply(int a, int b, int c=1)/c為缺省參數(shù)為缺省參數(shù)return a * b * c;int main()cout multiply(2, 3) multiply(2, 3, 4) endl;return 0;缺省參數(shù)函數(shù)與重載函數(shù)沖突錯(cuò)誤示例:float fun(

14、float a, float b=1.0) return a*b; float fun(float a) return a*a; /錯(cuò)誤,調(diào)用函數(shù)時(shí)傳入一個(gè)實(shí)參時(shí)程序不知道調(diào)用哪個(gè)重載函數(shù),編譯時(shí)報(bào)錯(cuò)正確示例:float fun(float a, float b=1.0) return a*b; float fun(float a, int b) return a*b;/正確,參數(shù)個(gè)數(shù)與數(shù)據(jù)類型能夠完全區(qū)分兩個(gè)重載函數(shù)31目錄目錄基礎(chǔ)知識(shí)基礎(chǔ)知識(shí)函數(shù)與參數(shù)傳遞函數(shù)與參數(shù)傳遞數(shù)據(jù)類型數(shù)據(jù)類型類類模板模板32結(jié)構(gòu)struct結(jié)構(gòu)是一種用戶自定義類型,結(jié)構(gòu)體中可包含多個(gè)類型不同的數(shù)據(jù)成員定義格式st

15、ruct 結(jié)構(gòu)體名一組成員變量聲明;/結(jié)末的分號不可省略,千萬注意33結(jié)構(gòu)struct結(jié)構(gòu)示例struct Humanchar name10;bool gender;int age;34結(jié)構(gòu)struct結(jié)構(gòu)可以帶有成員函數(shù),并且也支持public,private,protected的屬性定義與類class不同的是,結(jié)構(gòu)的默認(rèn)屬性為public示例:struct Humanchar name10;bool gender;int age;void set_age(int a) age = a; ;35聯(lián)合union聯(lián)合把一系列不同數(shù)據(jù)類型的變量組織在一起,這些變量共同占用同一塊內(nèi)存空間適用于這些不

16、同數(shù)據(jù)類型的變量同時(shí)只有一個(gè)會(huì)被用到的情況格式 union 聯(lián)合體名一組成員變量聲明;/結(jié)末的分號不可省略,千萬注意36聯(lián)合union聯(lián)合示例union Vehicle_Bonusbool police_bell;/警笛float water_power; /水龍壓強(qiáng)double box_capacity;/貨廂容量;共享同一段內(nèi)存, 節(jié)省空間C+語言中聯(lián)合也允許有成員函數(shù)37枚舉enum枚舉類型是將變量的值一一列舉出來,變量的值只限于列舉出來的值的范圍內(nèi)格式enum 標(biāo)識(shí)符 =整型常數(shù),標(biāo)識(shí)符 =整型常數(shù),.標(biāo)識(shí)符 =整型常數(shù);/結(jié)末的分號不可省略,千萬注意如果枚舉沒有初始化,即省掉=整型常

17、數(shù)時(shí),則從第一個(gè)標(biāo)識(shí)符開始,順次賦給標(biāo)識(shí)符0, 1, 2, .。但當(dāng)枚舉中的某個(gè)成員賦值后,其后的成員按依次加1的規(guī)則確定其值。38枚舉enum枚舉示例enum Weekdaysun, mon, tue, wed, thu, fri, sat;enum Weekdaysun = 0, mon, tue, wed, thu, fri, sat =0;39類型定義語句typedef一種給類型起“別名”的方式,可以使相同的類型在不同的位置使用更易于理解的別名,同時(shí),在某些情況下可以起到簡化程序的作用(在C語言里更加明顯)格式typedef 已有數(shù)據(jù)類型名 新數(shù)據(jù)類型名列表; 40類型定義語句type

18、def示例:typedef int number, mark;number a = 4;mark b = 18;/number和mark此后均可完全像int一樣使用,且它們本質(zhì)的數(shù)據(jù)類型就是intchar* pa, pb;typedef char* PCHAR;PCHAR pa, pb; 41類型定義語句typedef在C語言里,自定義數(shù)據(jù)類型聲明變量時(shí),必須在前面加上自定義數(shù)據(jù)類型的關(guān)鍵字,例如:struct Human a;enum Weekday k;使用typedef可以簡化這一點(diǎn):typedef struct Human Hm;Hm a;/以后用Hm即可代替struct Human在

19、C+語言里,取消了這種繁瑣的限制,聲明變量時(shí)加不加關(guān)鍵字均可,例如:struct Human a;Human a;/兩種寫法均正確當(dāng)跨平臺(tái)時(shí),只要改下 typedef 本身就行,不用對其他源碼做任何修改42new運(yùn)算符作用動(dòng)態(tài)開辟內(nèi)存空間格式new 類型名(初值)如果內(nèi)存空間分配成功則返回該類型變量的指針指針,否則返回NULL用new 分配數(shù)組空間時(shí)不能指定初始值示例int *a = new int;int *b = new int(100);/分配一個(gè)初值為100的整數(shù)char *c = new char10;/分配數(shù)組43delete運(yùn)算符作用釋放用new動(dòng)態(tài)分配的內(nèi)存空間格式delete

20、 指針變量delete 指針變量/釋放數(shù)組注意事項(xiàng)new與delete必須一一對應(yīng),成對出現(xiàn)在循環(huán)分支等情況下需要注意是否配對否則就會(huì)出現(xiàn)程序崩潰或內(nèi)存泄漏44new與delete示例45#include struct Humanchar name10; bool gender; int age;int main()Human *p = new Human;strcpy(p-name, “XYZ“);p-gender = 1;p-age = 22;delete p;return 0;目錄目錄基礎(chǔ)知識(shí)基礎(chǔ)知識(shí)函數(shù)與參數(shù)傳遞函數(shù)與參數(shù)傳遞數(shù)據(jù)類型數(shù)據(jù)類型類類模板模板46類把事物編寫成一個(gè)個(gè)“類”。

21、在類中,用數(shù)據(jù)表示事物的狀態(tài),用函數(shù)實(shí)現(xiàn)事物的行為,這樣就使編程方式和人的思維方式保持一致,極大的降低了思維難度。格式class 類名private:私有成員變量與成員函數(shù)protected:保護(hù)成員變量與成員函數(shù)public:公有成員變量與成員函數(shù);/結(jié)末的分號不可省略,千萬注意47類定義示例Student類48class Studentprivate:int id;bool gender;int age;public:void init() id = 20100001; gender = 1; age = 18; void print() cout id gender age endl;

22、;成員函數(shù)的類外定義49class Studentprivate:int id;bool gender;int age;public:void init();void print() cout name gender age 數(shù)據(jù)成員名對象指針-成員函數(shù)名(實(shí)參列表)50面向?qū)ο蟮脑闯绦蚪Y(jié)構(gòu)三個(gè)組成部分類的聲明類的定義類的使用文件存儲(chǔ)和管理方式類的聲明文件(.h)包括數(shù)據(jù)成員和成員函數(shù)的聲明類的定義文件(.cpp)成員函數(shù)的實(shí)現(xiàn)類的使用文件主函數(shù)51構(gòu)造函數(shù)構(gòu)造函數(shù)一種特殊的成員函數(shù),它主要用于為對象分配存儲(chǔ)空間并對其成員進(jìn)行初始化構(gòu)造函數(shù)的特點(diǎn)構(gòu)造函數(shù)的名稱必須與類名相同構(gòu)造函數(shù)沒有返回值,

23、可以有參數(shù),可以重載類中未定義構(gòu)造函數(shù),系統(tǒng)會(huì)自動(dòng)生成默認(rèn)的無參構(gòu)造函數(shù),該構(gòu)造函數(shù)的函數(shù)體為空如果重載了類的構(gòu)造函數(shù)則系統(tǒng)不會(huì)自動(dòng)生成默認(rèn)的無參構(gòu)造函數(shù)52構(gòu)造函數(shù)示例53class Studentprivate:int id;bool gender;int age;public:Student(int _id, bool _gender, int _age) id = _id; gender = _gender; age = _age; ;int main()Student stu1(20100001, 1, 18);/正確正確Student stu2;/錯(cuò)誤,類中沒有無參數(shù)構(gòu)造函數(shù)錯(cuò)誤,

24、類中沒有無參數(shù)構(gòu)造函數(shù)析構(gòu)函數(shù)析構(gòu)函數(shù)析構(gòu)函數(shù)執(zhí)行與構(gòu)造函數(shù)相反的操作,通常用于執(zhí)行一些清理任務(wù),如釋放分配給對象的內(nèi)存空間等析構(gòu)函數(shù)的特點(diǎn)析構(gòu)函數(shù)的名稱與類名相同,前面加上“”析構(gòu)函數(shù)沒有返回值,沒有參數(shù),不能重載析構(gòu)函數(shù)不能被顯式調(diào)用當(dāng)對象被撤銷時(shí),系統(tǒng)自動(dòng)調(diào)用析構(gòu)函數(shù)類中未定義析構(gòu)函數(shù),系統(tǒng)會(huì)自動(dòng)生成默認(rèn)的函數(shù)體為空的析構(gòu)函數(shù)構(gòu)造函數(shù)與析構(gòu)函數(shù)也均可以在類內(nèi)聲明,在類外進(jìn)行定義54析構(gòu)函數(shù)示例55class Studentprivate:int id; char* name; bool gender; int age;public:Student(int _id, char* _name

25、, bool _gender, int _age)id = _id; gender = _gender; age = _age; name = new charstrlen(_name)+1;strcpy(name, _name);Student()delete name;類成員是其它類的對象一個(gè)類的成員可以是另外一個(gè)類的對象類本身就是一種自定義數(shù)據(jù)類型,所以可以像其他自定義數(shù)據(jù)類型一樣使用例如:class Teacherprivate:char *name;class Studentprivate:int id;char *name;bool gender;int age;Teacher t

26、eacher;56拷貝構(gòu)造函數(shù)示例57class Studentprivate:int id; char* name; bool gender; int age;public:Student(Student &student)id = student.id;gender = student.gender;age = student.age;name = ;/此處需要注意,此處需要注意,深拷貝與淺拷貝深拷貝與淺拷貝Student() delete name; ;淺拷貝上頁的拷貝構(gòu)造函數(shù)(包括系統(tǒng)默認(rèn)的拷貝構(gòu)造函數(shù))均采用“淺拷貝淺拷貝”可以理解成簡單復(fù)制所有成員的

27、值“淺拷貝”對指針變量會(huì)出現(xiàn)嚴(yán)重問題會(huì)造成多個(gè)對象的相應(yīng)指針變量指向同一個(gè)地址析構(gòu)時(shí)會(huì)自然要求對該地址多次釋放,從而產(chǎn)生錯(cuò)誤同時(shí),數(shù)據(jù)操作中也極易出現(xiàn)嚴(yán)重的混亂解決方法:“深拷貝深拷貝”58深拷貝類體內(nèi)的成員需要?jiǎng)討B(tài)開辟內(nèi)存時(shí),我們應(yīng)自定義進(jìn)行“深拷貝”的拷貝構(gòu)造函數(shù)示例:Student(Student &student)id = student.id;gender = student.gender;age = student.age;name = new charstrlen()+1;strcpy(name, );通過如上變化,即保證了

28、各個(gè)對象的指針指向各自的區(qū)域,避免了混亂與錯(cuò)誤59繼承和派生類派生類的聲明class 派生類名:派生類名:派生方式派生方式 基類名基類名;派生方式公有派生(public)私有派生(private)保護(hù)派生(protected)60類的派生方式公有派生(public)公有繼承的特點(diǎn)是基類的公有成員和保護(hù)成員作為派生類的成員時(shí),它們都保持原有的狀態(tài),而基類的私有成員仍然是私有的私有派生(private)私有繼承的特點(diǎn)是基類的公有成員和保護(hù)成員都作為派生類的私有成員,基類的私有成員仍然是私有的保護(hù)派生(protected)保護(hù)繼承的特點(diǎn)是基類的所有公有成員和保護(hù)成員都成為派生類的保護(hù)成員,基類的私有

29、成員仍然是私有的61派生類的繼承方式表62派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)派生類構(gòu)造函數(shù)和析構(gòu)函數(shù)的執(zhí)行順序63派生類的自定義構(gòu)造函數(shù)派生類自定義帶參數(shù)的構(gòu)造函數(shù)派生類構(gòu)造函數(shù)派生類構(gòu)造函數(shù)(參數(shù)表參數(shù)表):基類構(gòu)造函數(shù):基類構(gòu)造函數(shù)64多重繼承C+允許為一個(gè)派生類指定多個(gè)基類,這樣的繼承結(jié)構(gòu)稱為多重繼承多重繼承的聲明class 派生類名:派生類名:派生方式派生方式1 基類名基類名1, , 派生派生方式方式n 基類名基類名n65多重繼承的構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)的執(zhí)行順序基類構(gòu)造函數(shù)派生類構(gòu)造函數(shù)在多個(gè)基類之間按照從左到右的順序執(zhí)行析構(gòu)函數(shù)的執(zhí)行順序析構(gòu)函數(shù)的執(zhí)行順序與構(gòu)造函數(shù)相反66多重繼承示例

30、以多重繼承的方式聲明水陸兩用汽車的類67多重繼承存在的問題繼承的模糊性虛擬繼承我們在Car類和Boat類繼承Vehicle類處,在前面加上virtual關(guān)鍵字就可以實(shí)現(xiàn)虛擬繼承使用虛擬繼承后,當(dāng)系統(tǒng)碰到多重繼承的時(shí)候就會(huì)自動(dòng)先加入一個(gè)Vehicle的拷貝,當(dāng)再次請求一個(gè)Vehicle的拷貝的時(shí)候就會(huì)被忽略,保證繼承類成員函數(shù)的唯一性68多態(tài)性多態(tài)性不同對象收到相同消息時(shí)產(chǎn)生不同的動(dòng)作多態(tài)性的實(shí)現(xiàn)與函數(shù)聯(lián)編有關(guān)將一個(gè)函數(shù)的調(diào)用與相應(yīng)的函數(shù)體的代碼相連接稱為函數(shù)聯(lián)編編譯時(shí)的多態(tài)性靜態(tài)聯(lián)編所支持的多態(tài)性稱為編譯時(shí)的多態(tài)性通過函數(shù)重載實(shí)現(xiàn)運(yùn)行時(shí)的多態(tài)性動(dòng)態(tài)聯(lián)編所支持的多態(tài)性稱為運(yùn)行時(shí)的多態(tài)性通過虛函數(shù)

31、的繼承實(shí)現(xiàn)69虛函數(shù)使用虛函數(shù)的注意事項(xiàng)只有類的成員函數(shù)才能說明為虛函數(shù)靜態(tài)(static)成員函數(shù)不能是虛函數(shù)內(nèi)聯(lián)(inline)函數(shù)不能是虛函數(shù)構(gòu)造函數(shù)不能是虛函數(shù)析構(gòu)函數(shù)可以是虛函數(shù)而且通常聲名為虛函數(shù)70多態(tài)示例Vehicle* v1 = new Car();Vehicle* v2 = new Boat();v1-SetWeight(); v2-SetWeight(); 71 virtual 純虛函數(shù)和抽象類純虛函數(shù)純虛函數(shù)只有函數(shù)的聲明,函數(shù)的定義必須在其派生類中完成聲明純虛函數(shù)的類不能實(shí)例化抽象類聲明有純虛函數(shù)的類稱為抽象類純虛函數(shù)的聲明virtual 返回值類型 函數(shù)名(參數(shù)列表

32、) = 0;72友元friend友元為了讓類外的普通函數(shù)和其它類的成員函數(shù)能夠?qū)︻愔械谋Wo(hù)和私有數(shù)據(jù)進(jìn)行操作,C+提供了一種稱為友元的信任機(jī)制友元的分類友元函數(shù)(普通函數(shù))友元成員(類的成員函數(shù))友元類73友元函數(shù)在類里聲明一個(gè)普通函數(shù),在前面加上friend修飾,那么這個(gè)函數(shù)就成了該類的友元,可以訪問該類的一切成員一個(gè)普通函數(shù)可以是多個(gè)類的友元函數(shù)74友元成員一個(gè)類的成員函數(shù)也可以是另一個(gè)類的友元,從而可以使得一個(gè)類的成員函數(shù)可以操作另一個(gè)類的數(shù)據(jù)成員75友元類整個(gè)類也可以是另一個(gè)類的友元,該友元稱為友元類友元類的每個(gè)成員函數(shù)都可以訪問另一個(gè)類的所有成員76友元類示例77class Stud

33、entprivate:int id; char* name; bool gender; int age;public:friend class Teacher;class Teacherprivate:char *name;友元的優(yōu)點(diǎn)和缺點(diǎn)友元的優(yōu)點(diǎn)避免頻繁調(diào)用類內(nèi)的成員函數(shù)造成內(nèi)存??臻g的浪費(fèi)友元的缺點(diǎn)破壞類的封裝性78目錄目錄基礎(chǔ)知識(shí)基礎(chǔ)知識(shí)函數(shù)與參數(shù)傳遞函數(shù)與參數(shù)傳遞數(shù)據(jù)類型數(shù)據(jù)類型類類模板模板79模板模板的含義以所處理的數(shù)據(jù)類型的聲明作為參數(shù)的函數(shù)和類,分別稱為函數(shù)模板函數(shù)模板和類模板類模板一個(gè)模板并非一個(gè)實(shí)實(shí)在在的類或函數(shù),僅僅是一個(gè)類或函數(shù)的描述模板的作用可以實(shí)現(xiàn)邏輯相同,數(shù)據(jù)類型不同的程序代碼的復(fù)制模板機(jī)制可以減輕編程和維護(hù)的工作量和難度80模板函數(shù)和模板類模板函數(shù)定義函數(shù)模板之后可以用類型實(shí)參類型實(shí)參調(diào)用該函數(shù)編譯器

溫馨提示

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

最新文檔

評論

0/150

提交評論