清華大學數據結構課件(考研必備)C++基礎復習_第1頁
清華大學數據結構課件(考研必備)C++基礎復習_第2頁
清華大學數據結構課件(考研必備)C++基礎復習_第3頁
清華大學數據結構課件(考研必備)C++基礎復習_第4頁
清華大學數據結構課件(考研必備)C++基礎復習_第5頁
已閱讀5頁,還剩83頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

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

2、設計的C+語言1980 年,AT&T 貝爾實驗室的Bjarne Stroustrup博士開始對C 語言進行改進和擴充,創建了一個新的語言“帶類的C”,1983 年正式取名為C+4C語言的特點和局限特點語言簡潔、方便、靈活提供了豐富的運算符和數據結構比匯編語言更具有良好的可讀性和可移植性程序運行效率高局限類型檢查機制較弱代碼可重用性差開發大型應用復雜、可維護性差5C+語言的特點與C語言完全兼容保持了C語言的強大功能從C到C+是一個平緩的過渡增加了面向對象的概念代碼可重用性好適合編寫大型應用6C+程序執行過程7源文件、目標文件和可執行文件源文件即源代碼文件(*.c,*.cpp),本質就是文

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

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

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

6、103cout PI * 7 * 7 endl;14預處理指令帶參數的宏格式#define 宏名(參數表) 字符串示例#define PI 3.1415926#define S(r) PI * r * rcout S(7) endl;15預處理指令帶參數的宏宏的替換是一種字符串整體替換,宏本身不具備計算功能#define MULTIPLY(x, y) x*ycout MULTIPLY(4 + 7, 7) endl;運行的結果是53,而不是77因為宏先完整替換成4+7*7,再按C+的標準運算順序進行計算16預處理指令條件編譯格式#if !defined 常量名#define 常量名 表達式#en

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

8、in i j k;功能從鍵盤為變量輸入數據,數據之間可以換行或空格作為分隔類似C語言中的scanf()函數20目錄目錄基礎知識基礎知識函數與參數傳遞函數與參數傳遞數據類型數據類型類類模板模板21函數的參數傳遞傳值22/* 本程序達不到交換兩個變量值的目的本程序達不到交換兩個變量值的目的 ,輸出結果,輸出結果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;函數的參數傳

9、遞傳地址23/* 本程序可以達到交換兩個變量值的目的,輸出結果本程序可以達到交換兩個變量值的目的,輸出結果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;函數的參數傳遞傳地址24/* 本程序不能達到交換兩個變量值的目的!本程序不能達到交換兩個變量值的目的!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+中針對變量的一種別名機制引用不能單獨存在,它存在的前提是它所代表的變量首先存在定義格式:類型 &引用名 = 變量名;例如:int a;int &b = a;25引用的定義與使用26/* 引用引用b的值隨變量的值隨變量a的值的改變而改變,輸出結果的值的改變而改變,輸出結果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;引用注意事項引用必須進行初始化int &a;/錯誤,沒有進行初始化引用的對象只能是變量 引用近似于指針常量引用近似于指針常量const int a;int &b = a;/錯誤,a是常量不能引用引用與所引用的變量必須具有相同的數據類型int a;float &b = a;/錯誤,引用與變量類型不一致引用不是變量,因此無法對引用進行引用int a; int &b = a; int &c = b;/無錯誤,但c引用的是a可以對

12、指針進行引用,因為指針也是變量int a; int* b = &a; int* &c= b; /c引用的是指針變量b27函數的參數傳遞傳引用28/* 本程序也可以達到交換兩個變量值的目的,輸出結果本程序也可以達到交換兩個變量值的目的,輸出結果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;缺省參數函數缺省參數函數在函數聲明時可以預

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

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

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

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

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

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

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

20、 指針變量delete 指針變量/釋放數組注意事項new與delete必須一一對應,成對出現在循環分支等情況下需要注意是否配對否則就會出現程序崩潰或內存泄漏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;目錄目錄基礎知識基礎知識函數與參數傳遞函數與參數傳遞數據類型數據類型類類模板模板46類把事物編寫成一個個“類”。

21、在類中,用數據表示事物的狀態,用函數實現事物的行為,這樣就使編程方式和人的思維方式保持一致,極大的降低了思維難度。格式class 類名private:私有成員變量與成員函數protected:保護成員變量與成員函數public:公有成員變量與成員函數;/結末的分號不可省略,千萬注意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、;成員函數的類外定義49class Studentprivate:int id;bool gender;int age;public:void init();void print() cout name gender age 數據成員名對象指針-成員函數名(實參列表)50面向對象的源程序結構三個組成部分類的聲明類的定義類的使用文件存儲和管理方式類的聲明文件(.h)包括數據成員和成員函數的聲明類的定義文件(.cpp)成員函數的實現類的使用文件主函數51構造函數構造函數一種特殊的成員函數,它主要用于為對象分配存儲空間并對其成員進行初始化構造函數的特點構造函數的名稱必須與類名相同構造函數沒有返回值,

23、可以有參數,可以重載類中未定義構造函數,系統會自動生成默認的無參構造函數,該構造函數的函數體為空如果重載了類的構造函數則系統不會自動生成默認的無參構造函數52構造函數示例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;/錯誤,類中沒有無參數構造函數錯誤,

24、類中沒有無參數構造函數析構函數析構函數析構函數執行與構造函數相反的操作,通常用于執行一些清理任務,如釋放分配給對象的內存空間等析構函數的特點析構函數的名稱與類名相同,前面加上“”析構函數沒有返回值,沒有參數,不能重載析構函數不能被顯式調用當對象被撤銷時,系統自動調用析構函數類中未定義析構函數,系統會自動生成默認的函數體為空的析構函數構造函數與析構函數也均可以在類內聲明,在類外進行定義54析構函數示例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;類成員是其它類的對象一個類的成員可以是另外一個類的對象類本身就是一種自定義數據類型,所以可以像其他自定義數據類型一樣使用例如:class Teacherprivate:char *name;class Studentprivate:int id;char *name;bool gender;int age;Teacher t

26、eacher;56拷貝構造函數示例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; ;淺拷貝上頁的拷貝構造函數(包括系統默認的拷貝構造函數)均采用“淺拷貝淺拷貝”可以理解成簡單復制所有成員的

27、值“淺拷貝”對指針變量會出現嚴重問題會造成多個對象的相應指針變量指向同一個地址析構時會自然要求對該地址多次釋放,從而產生錯誤同時,數據操作中也極易出現嚴重的混亂解決方法:“深拷貝深拷貝”58深拷貝類體內的成員需要動態開辟內存時,我們應自定義進行“深拷貝”的拷貝構造函數示例:Student(Student &student)id = student.id;gender = student.gender;age = student.age;name = new charstrlen()+1;strcpy(name, );通過如上變化,即保證了

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

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論