c++學習要點+各章要點導讀+課文精講串講文字材料_第1頁
c++學習要點+各章要點導讀+課文精講串講文字材料_第2頁
c++學習要點+各章要點導讀+課文精講串講文字材料_第3頁
c++學習要點+各章要點導讀+課文精講串講文字材料_第4頁
c++學習要點+各章要點導讀+課文精講串講文字材料_第5頁
已閱讀5頁,還剩53頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

1、c+學習要點1.傳指針時,我們可以通過指針來修改它在外部所指向的內容。但如果要修改外部指針所指向的對象是不可能的。例如傳遞外部指針到函數內來分配空間,必須傳遞指針的指針或指針的引用。2.charcarry10=0;編譯器會將其后所有的東西都置0;3.函數返回值為const時,返回的東西付給一個類型相同的標示后其不能為左值;4.constint*i;intconst*i;int*consti;前兩個功能相同,說明i所指向的內容不變;最后一個說明指針指向的地址不變,但內容可變。5.類中的const成員函數。定義為在原型后加const。常量函數不能修改類中的任何屬性。但有兩種方法可以修改。a)(my

2、class*)this-member1=values;b)將一個成員定義成mutable即可被常量函數修改。6.類中的常量const類型的,不能在類中被用來定義數組。而enumone=100;two=2;定義的one、two卻可以。通常的enum定義的置分配問題:enumal=9,z;此時z的值為10。7.用const定義的int可用來開辟數組,但const定義的常量數組中的元素,不能用來定義數組。8.用sizeof計算變量的空間,如果是數組,按實際空間返回;常量字符串(實際上是在靜態內存區開辟的變量)sizeof返回比實際長度加一。如果是指針則不考慮它指向的空間大小,僅僅返回指針類型的大小。

3、如果用sizeof計算函數的行參,即使是屬組也僅僅返回一個相關類型指針的大小。9.形如intiarray=12,124,433;編譯器會自動給iarray分配3個元素的長度。元素長度的個數計算公式為sizeof(iarray)/sizeof(*iarray)。10.拷貝構造函數:當行參和實參結合時,如果是復雜對象的傳值類型,則調用拷貝構造函數生成一個臨時對象作為實參,退出函數時,臨時對象被調用析構函數釋放。當返回值是復雜對象是,也是調用拷貝構造函數來賦值。這就出現構造函數和析構函數被調用次數不相等的情況。拷貝構造函數的原型為a(a&),我們可在類中重載。(缺省的拷貝構造函數是使用位(bit)拷

4、貝方法:淺層拷貝,不拷貝指針指向的內容)。11.volatile類型的變量告訴編譯器,本變量不需要進行代碼優化。在多線程的應用中,我們如果讀入一個變量到寄存器,此時時間片到期,去處理其他線程了,在重新獲得處理機時,volatile類型告訴處理機,重新從變量讀取數據到寄存器,而不是用寄存器數據直接處理,這樣可以防止臟數據。12.class和struct在一定程度上有相同的功能,只不過前者缺省的成員是私有的,后者在缺省時成員為共有的。故而class不是c+必需的保留字13.c和c+編譯器,對相同的函數名編譯后生成的相同的標示不同,故而在引用c的庫文件時必須使用extern“c”告訴編譯器,它是c的

5、函數,按c的規則編譯。通常我們使用的標準頭文件已被處理過。14.#include“filename”;#include,前者先在當前目錄下尋找文件,如果找不到再到系統規定的路徑下找,后者直接到系統規定的路徑下找。15.任何地方分配的靜態變量(static),其生命周期和主進程相同。第二次定義一個已存在的static變量,對變量的內用無影響,但它的可見范圍只在定義的范圍內。(考研曾作錯!)(從靜態變量的特性不難理解,類中的static類型是所有對象共享的)16.內聯函數(inline)在實現上實際和宏類似,在內聯函數出現的地方將函數展開來避免函數調用時的出棧、如棧,提高效率。但內聯函數的代價是:

6、代碼增大。inline函數適合成員函數和自由函數。在類中實現的函數自動為內聯函數。inline必須定義到函數的實現上,例如:inline intplusone(int)是無效的。友元函數在類的體內被實現自動變為內聯函數。17.#include #definedebug(x)cout#x=xendl 其中的#x表示x被當作字符串輸出。18.assert(0!=0); 如果assert中的條件為假,則運行期間回退出程序,且報告出錯代碼的行號。(#include )19.靜態對象在main結束或exit()被調用時才調用自身的析構函數。這意味著,在對象的析構函數中調用exit()是很危險的,有可能進

7、入一個死循環中。調用abort()來退出函數,靜態對象的析構函數并不會被調用。我們可以用atexit()來指定跳出main或調用exit時要執行的操作,用atexit注冊的函數,可以在所有對象的析構函數之前調用。voidexit_fn2(void)printf(exitfunction#2calledn);/處理函數atexit(exit_fn2);20.全局變量實際上用的是靜態存儲。靜態變量的構造是在進入main之前調用的,在main結束時調用它的析構函數。變量的名字由小范圍(c+而言):/*.cppinta;/靜態變量,但為externinta;即它是全局的,外部可見的staticintb

8、;/靜態變量,static和extern相反,只在*.cpp中有效,對其他單元(文件)是不可見的。函數的定義和上面相同。main()類的靜態成員變量可以如下賦值:intx:s=23;(在*.cpp中,無論公私都可以)21.名字空間(namespace):定義一個名字空間,然后使用unsing就可以將當前的類型上下文轉換名字空間所定地的.namespacemathenumsignpositive,negative;classintegerinti;signs;public:interger(inti=0):i(i)signsign().;/endclassintergera,b,c;interg

9、erdivide(interger,interger);/no;voidq()usingnamespacemath;intergera;/hidesmath:aa.sign(negative);math:a.sign(positive);22.一般對于函數flaotf(inta,intb); 某些c+編譯器編譯后生成_f_int_int的名字,有些c編譯器則生成_f的名字。故在c+中鏈接c的庫函數時要用extern“c”告訴編譯器,按c的規則來編譯函數。類似的還有extern“c”#include “myhead.h”,c+還支持extern“c+”.23.在函數調用時,傳引用也是將指針壓棧。

10、24.構造函數、析構函數、賦值構造函數、重載的=,四者的調用順序:(三種函數都已實現)a)xx;xa=x;result:x:constructx:copy_structb)xx;xa;a=x;result:x:constructx:constructx:copy_struoperator=x:destruct如果沒有賦值構造函數則結果:x:constructx:constructoperator=x:destruct(如果直接xa=x;這不掉用一般的構造函數,調用復制構造函數)指向類的成員函數的指針:設intx:a(void)xx;int(x:*pf)(void)=&x:a;(x.*pf)()

11、;指向成員變量的指針:設inti;是x的成員變量intx:*pm=&x:i;xx; 各章要點導讀第 1 章 緒論本章作為全書的開篇,旨在使讀者初步了解面向對象的程序設計語言之由來,初步了解面向對象的程序設計思想之基本特點,概要性地了解面向對象的軟件開發方法,為后續章節的學習奠定基礎。為什么需要首先有一個初步和概要性的了解呢?一方面,這是為了在以后的學習中具體接觸到每一個新的概念、語法時都能夠清楚地認識到,它在面向對象的方法中、在c+語言中的地位和作用是什么。另一方面,是希望讀者在一開始就能夠認識到,面向對象的思想與人類所習慣的思維方式是一致的,雖然c+語言比起面向過程的語言(如c語言)來要復雜

12、許多,但是c+設計者的目的是為了使事情變得更簡單,而不是故弄玄虛將事情搞得更復雜。事實上,正是由于c+語法的復雜性,使得它的表現能力更強,程序員用c+來寫程序的時候能夠更容易、更靈活地實現各種功能。讀者在閱讀本章1.1-1.3時會感覺很多問題理解不透,這是正常的。因為需要學完本教材的全部內容,才能對c+語言和面向對象的方法有一個全面的認識。而本章在一開始就給出了一個全面介紹,雖然盡量使用通俗的語言,但是肯定仍有一些問題是讀者先現在不能完全理解的。對此讀者不必深究,對1.1-1.3的內容閱讀后有個大致的了解就行。1.4節介紹了信息的表示與存儲,這是程序設計的基本知識,是必須掌握的基礎。建議讀者認

13、真學習、完全掌握。不過有些讀者可能會覺得這些知識在編程中并沒有直接使用,不學這一節好像也不影響學習編程。但是沒有這些基礎知識,會影響你對程序理解。當然,如果覺得枯燥,也可以先略過這一節,待以后遇到疑問時,再來學習。因此有的教師在講課時也略過這一節,留給學生自學,我本人就是這樣做的。1.5節簡單介紹了程序的開發過程和一些術語,不必死記硬背,最好結合實驗來體會。本章的主要實驗任務是學會使用一種c+開發工具,本書的實驗用的是vc+6.0開發環境。認真完成這一實驗很重要,了解開發環境的基本功能,使完成以后各章實驗的基礎。第 2 章 c+簡單程序設計本章內容是程序設計的基礎,學習的目標是掌握c+語言的基

14、本概念和基本語句,能夠編寫簡單的程序段。這是初學程序設計者遇到的第一個難點:將解決問題的步驟用c+語言描述清楚。理解本章的簡單例題不難,但是自己編寫第一個程序卻有點難以下手。學習編寫程序可以從修改例題程序開始,也就是在原有例題程序的基礎上,嘗試自己增加或改變一些功能,或者用不同的方法來解決問題。如果你使用vc+開發環境編譯、運行簡單程序還有困難,應該首先復習一下實驗一。本章的例題都是一些比較簡單的問題,但是這些簡單的例題給出了一些常見問題的典型解決方法,既是做軟件開發必須掌握的基本功也是各種考試中經常出現的題目,讀者應該達到熟練掌握,并能夠舉一反三。例如:例2-3是典型的比較問題,例2-4是情

15、況分支,例2-5是累加問題,也可以用for語句實現,要注意累加和的初始值一般是0,例2-10是簡單的統計問題。當你開始改編例題程序時,首先遇到的阻力就是編譯時和運行時出現的錯誤。如果程序中存在語法錯誤,編譯時編譯器就會指出錯誤的位置和錯誤原因(請參考實驗二)。不過遺憾的是,編譯器給出的信息常常不是很精確,而且多數編譯器給出的錯誤信息是英文的,這就給初學者帶來一定的困難。有時候編譯一個十幾行的小程序,就會出現幾十個語法錯誤,這時不必感到茫然,只要仔細查看程序,參照編譯器給出的錯誤信息一一改正就行了(有時候改正了一個錯誤,另外幾十個錯誤也就迎刃而解了)。如果看不懂編譯器給出的錯誤信息,可以借助于編

16、譯器的幫助功能,當然一開始還經常需要借助于英文字典。建議讀者準備一個筆記本,記下遇到的每一條錯誤信息、中文意思、導致這一錯誤的真正原因、解決方法。這樣做一開始似乎很麻煩,但是經過一段時間,你會感到受益匪淺。一旦你熟悉了一種編譯器給出的錯誤信息,當你再換用別的編譯器時會發現他們對錯誤的描述都是類似的,你很快就可以適應。這個辦法是我上大學時我的老師教我的,我自己覺得很有效,我做老師以后,也這樣告訴學生,但愿意這樣做的學生很少,大家都嫌麻煩。結果呢,隨著學習的深入,作業越來越難、程序越來越大,也就有越來越多的學生抱怨實驗課時間不夠用。究其原因,很大程度上是因為不熟悉錯誤信息,改正語法錯誤花了太多時間

17、。改正語法錯誤的能力是編程的基本功,也是相對比較簡單的事情(畢竟編譯器會直接指出錯誤)。較難以發現和改正的錯誤,是運行時的錯誤。也就是說,編譯時沒有語法錯誤,但是運行的結果卻不對,這往往是因為你的算法(就是解決問題的方法)設計有問題。這樣的錯誤是比較難以定位和改正的,查找這種錯誤的位置和原因叫做“程序調試”,調試程序的能力和經驗需要在長期的編程實踐中積累,大多數編譯器都提供了輔助調試的功能(debug),實驗二將引導你學會使用vc+6.0的debug功能。第 3 章 函數本章的主要目標是學會將一段功能相對獨立的程序寫成一個函數,為下一章學習類和對象打好必要的基礎。掌握函數定義和調用的語法形式并

18、不難,但是要有效地應用函數,必須對函數調用的執行過程和參數的傳遞有深刻的認識,這也正是初學時的難點。要很好地理解函數的調用和參數傳遞,尤其是嵌套調用和遞歸調用的執行過程,比較有效方法是利用編譯器的調試功能,跟蹤函數調用的執行過程、觀察參數和變量的值,實驗三會引導你進行跟蹤和觀察。利用引用傳遞參數,是函數間數據共享的一個重要方法,但是一部分讀者對引用類型的理解會有困難,其實只要簡單地將引用理解為一個別名就可以了。在介紹函數的同時,本章也介紹了一些有用的算法。例3-6介紹了產生隨機數序列的方法,例3-8、3-9、3-10介紹了遞歸算法。本章的例題程序與第2章相比顯然復雜了一些,需要仔細閱讀并上機調

19、試才能完全理解。對于較復雜的程序,書中都以注釋的形式給出了詳細說明,請讀者在閱讀程序的時候務必認真閱讀注釋文字。遞歸算法是一種非常簡潔高效的算法,用途很廣泛,但理解起來有一定的難度,自己編寫遞歸程序更不是件容易的事。作為初學者,對此不必著急。學習是一個循序漸進的過程,本章介紹遞歸算法主要是為了說明c+語言允許函數的遞歸調用,如果要完全理解和熟練編寫遞歸程序,還需要學習“數據結構”課程,一般的“數據結構”書中都會詳細介紹遞歸算法及其應用。當然,喜歡鉆研的讀者不妨準備一張大紙,在利用調試功能跟蹤遞歸程序的執行過程時,記錄下遞歸過程中各個變量的值,會有助于對遞歸算法的理解。第 4 章 類與對象前面介

20、紹的只是一般程序設計的基礎知識,從本章開始才真正接觸到面向對象的程序設計。類是面向對象程序設計中最重要、最基本的概念,也是學習面向對象方法時遇到的第一個難點。類是對邏輯上相關的函數與數據的封裝,是對問題的抽象描述。要理解類與對象必須結合實例來學習,讀者一邊讀書可以一邊思考:除了書中列出的例子,現實世界中還有哪些有形或無形的事務可以被抽象為程序中的類,每個類又存在哪些對象(實體)。這樣對類的概念就會理解得快一些。在學習類成員的訪問控制、構造函數、析構函數時,讀者自然會有這樣的疑問:這些語法有什么用呢?難道寫個小程序也必須搞得這么麻煩嗎?應該說c+是適合寫大型程序的,c+語言的設計師bjarne

21、stroustup在c+語言的設計和演化一書中指出:“c+是作為一種系統編程語言、作為一種為開發由大的系統部件組成的應用而進行設計的”。因此,在初學者編寫小型程序時很難看到c+的優越性。雖然我在書中盡量結合實例來講,但限于本書定位于初學讀者,例題不可能很復雜、龐大,所以讀者總感到例題只是驗證性的,有點牽強。從學習這一章開始,學生就會經常問我,語法為什么是這樣、規定為什么這么多?進而將語法規定作為討厭的東西,在內心抵觸。我在書中已經談了很多關于c+和面向對象方法的特點、用途,但在編寫小程序時很難看到面向對象方法的優點。對于初學者來說,我建議換一種思維方式,如果目前還看不到某些語法規定的意義,先不

22、要鉆牛角尖。比如構造函數、拷貝構造函數和析構函數,在本章的例題中,還體現不出它們的用途,那就先不理會它們,待以后用到的時候,再去體會其中的妙處,這一章里,就先了解一下這些語法規定。這樣想,學習的時候心情是否會輕松些呢?從這一章開始每章的最后一節都是一個實例人員信息管理系統,這個例子貫穿后續各章節,利用每章介紹的知識不斷豐富程序的功能,建議讀者仔細閱讀、體會,并嘗試修改、補充程序的功能。本章中還介紹了利用uml語言表示類與對象的方法,以后各章還將進一步介紹用uml語言表示類之間的關系,但這遠不是uml語言的全部,這方面的內容也不是初學時的重點,讀者可以不必深究,了解一下就可以了。如果有需要,可以

23、另外學習軟件工程課程。第 5 章 c+程序的結構本章主要是介紹與程序的結構、模塊間的關系、數據共享相關的內容。讀者學習這一章時的主要問題可能是感覺到與其它章節相比,這一章顯得有些蕪雜,語法規定很多。不過只要尋著程序結構和數據共享這兩條主線,思路就會比較清晰。標識符的作用域和對象的生存期問題,是研究程序模塊之間數據傳遞、數據共享的基礎。靜態成員是類的對象之間共享數據和代碼的手段。友元是不同的類之間、類與類外的函數之間共享數據的機制。而常引用、常對象、常成員為共享的數據提供了保護機制。使用多文件結構,有利于大型項目的分工合作、分別開發。如果要在一個項目的不同程序文件之間共享數據和代碼,就要用到外部

24、變量和外部函數。本章內容語法規定較多,有的讀者對這些語法規定不太理解,總想找個老師問問:能不能這樣寫?是不是會有那樣的效果?如果周圍沒有人可以請教,常常感到束手無策。有的讀者逐一理解這些語法規定到也不難,但是會覺得記不住,還會混淆,其實根本原因還是沒有將每一個問題理解透徹。我建議讀者要自己驗證每一個語法規定,用反證的方法更有助于理解和加深印象。比如,語法規定當程序流程離開了一個變量的作用域,就不能使用該變量,那么你可以編一段程序,嘗試在變量的作用域之外使用這個變量,看看后果是什么。還可以嘗試用普通的成員函數去處理常對象,看看會是什么情況。這樣驗證以后,很多疑問就解開了。以后學習后續章節時也是這

25、樣的,如果有些問題反復看都不能理解、反復想都想不清楚,那就不是看和想能解決的了,這時就需要自己動手編一些程序來試驗,效果往往不錯。第 6 章 數組、指針與字符串本章介紹了數組、指針與字符串。學習數組時首先要清楚它的用途,數組是用來存儲和處理群體數據的一種數據結構。使用數組類型,需要清楚數組元素的存儲方式、數組名、下標等概念。數組是由相同類型元素組成的,其元素在內存中是連續存放的,數組名就是數組元素的首地址,是一個常量,而下標標志著元素在數組中的位置序號。需要注意的是數組下標從0開始,不是從1開始。由于數組的這種特性,訪問數組元素時只要寫出數組名和下標,系統就可以計算出該元素在內存中的位置,從而

26、操作該元素。所以借助于數組可以通過循環語句按照某種規律依次處理大量數據。c+的基本數據類型中沒有字符串類型,本章介紹了用字符數組處理字符串的方法。這是從c語言延續過來的方法,但并不是一個好的方案,在c+程序中建議使用c+標準庫的string類。指針是c/c+的一個重要特點,也是學習的一個難點。要很好地理解和使用指針,首先需要對計算機的內存和內存地址等概念有所了解,要知道執行中的程序代碼和當前使用的數據都是存放在內存中的。指向對象的指針是對象的地址,指向函數的指針是函數代碼的地址。指向類的非靜態成員的指針使用起來與一般指針略有不同,因為非靜態成員是屬于對象的,所以必須通過對象名來訪問。有了指針,

27、使程序員有了更多的靈活性,同時也帶來一些不安全因素,增加了程序出錯的機會,因此除了在十分必要的情況下,程序中一般盡量不要使用指針。比如,訪問數組元素既可以借助于下標也可以利用指針,通常用下標是比較好的選擇。但是當需要進行動態內存分配時,就必須使用指針來存放內存地址了。應用動態內存分配技術,使程序可以有效地使用內存空間,但是當對象的成員指向動態分配的內存空間時,就需要為這個類編寫具有深拷貝功能的拷貝構造函數,還要在析構函數中記得釋放動態分配的空間。使用指針時,要特別注意避免空指針操作,也就是指針一定要先初始化再使用。使用數組時,要注意數組名是常量不能被賦值。下面是初學者很容易犯的錯誤:char

28、a4, *p1, *p2;cinp1; /錯誤,p1沒有被初始化p2=a; cinp2; /正確a=abc; /錯誤,數組名不能被賦值p1=abc; /正確,將字符串常量abc的首地址賦給p1學習這一章時,要善于利用編譯器的debug功能觀察指針變量中的地址值和該地址中的數據,觀察數組中元素的排列,以及動態分配的內存空間中的數據。第 7 章 繼承與派生本章介紹類的繼承關系,與類的組合關系相似類的繼承也是為了代碼重用。使用繼承首先要理解繼承關系的含義,當需要重用一個類的代碼時要區別該問題應該使用類的組合關系還是類的繼承關系來描述,通??梢杂谩笆且环N”來檢驗類之間是否應存在繼承關系。例如,汽車是一

29、種交通工具,因此“汽車”類可以繼承“交通工具”類。雖然在構成“汽車”類時需要利用“車輪”類,但是“汽車”與“車輪”之間不存在上述關系,而存在整體與部件的關系,因此用類的組合為宜。在使用繼承關系的時候,從基類繼承的成員的訪問控制屬性需要特別注意,初學時不太容易記住。首先要明確從基類繼承的成員的訪問控制屬性受兩方面因素影響:一是成員在基類中原來聲明的訪問控制屬性,二是繼承方式。很多讀者學習本章時都有這樣的疑問:分別在什么情況下使用公有繼承、保護繼承、私有繼承?簡單來說,如果希望基類的成員被繼承過來以后與派生類的成員一樣,就用公有繼承。如果只希望派生類的成員及其子類能方便的訪問從基類繼承的成員,不希

30、望類外的函數訪問這些成員,可以用保護繼承。如果希望基類的成員被繼承以后都變成私有的,就用私有繼承。無論用哪種繼承方式,基類的私有成員被繼承以后都不能被直接訪問。對待比較簡單的問題,像這樣選擇就可以了,對于復雜系統的開發,需要有更多的考慮,那是系統設計的任務。運用繼承關系時,構造函數和析構函數的特性也是一個重要方面。要注意,基類的構造函數和析構函數都不被繼承,但是在建立派生類對象時基類的構造函數會首先被自動調用,派生類對象消亡時,最后會自動調用基類的析構函數。派生類的構造函數要負責為基類的構造函數傳遞參數,否則基類的缺省構造函數會自動被調用。當同時繼承多個基類且有對象成員時,要清楚構造函數的調用

31、次序是先調用基類的構造函數,再調用對象成員所在類的構造函數,最后執行派生類的構造函數體,析構函數的執行次序相反。為了觀察對象的構造、析構過程,可以在構造、析構函數中輸出相應信息,或者利用debug工具跟蹤程序流程。在多繼承的情況下,如果存在公共基類,就會出現成員標識二義性的問題,這時將公共基類作為虛基類繼承是一個比較好的解決方案。本章最后一節的應用實例有助于讀者對類的繼承和虛基類的理解,建議讀者閱讀該程序以后嘗試添加更多的功能。第 8 章 多態性本章介紹多態性,多態是指同樣的消息被不同類型的對象接收時導致不同的行為。首先介紹的運算符重載,是一種靜態多態機制,它與函數重載的道理時一樣的。實際上“

32、將操作表示為函數調用火時將操作表示為運算符之間沒有什么根本差別”,這是bjarne stroustup在c+語言的設計和演化一書中說的。認識到這一點,編寫運算符重載程序也就不是什么難事了。不過要注意的是,重載運算符是一種擴充語言的機制,而不是改變語言的機制。因此我們只能將已有的運算符重載使之作用于新的類,不能增加新的運算符,也不能將重載的運算符作用于基本數據類型,c+的語法對此都有嚴格的限制。動態多態性是面向對象程序設計語言的重要特征,在c+中是通過虛函數來實現的。請讀者不要將虛函數與前一章講的虛基類混淆,二者的作用是不同的。虛基類解決的是類成員標識二義性和信息冗余問題,而虛函數是實現動態多態

33、性的基礎。派生類對象可以初始化基類對象的引用,派生類對象的地址可以賦值給基類的指針,這意味著一個派生類的對象可以當作基類的對象來用。但是如果想要通過基類的指針和引用訪問派生類對象的成員,就要使用虛函數,這便是多態。很多情況下,基類中的虛函數是為了設計的目的而聲名的,沒有實現代碼,這就是純虛函數,其所在的類成為抽象類。抽象類是為后繼所有派生類設計的同一抽象接口。最后一節的應用實例,體現了多態性在實際應用中的作用。第 9 章 群體類和群體數據的組織本章介紹了對線性群體數據的存儲和處理,介紹這些內容的目的有三方面:一是以數組類、鏈表類、棧類、隊列類以及查找、排序算法為綜合例題,對前面章節的內容進行全

34、面復習;二是使讀者掌握一些常用的數據結構和算法,能夠解決一些略復雜的問題,也為下一章學習c+標準模板庫打下基礎。在第六章中曾經介紹過一個動態數組類,但是其結構和功能都比較簡單。本章介紹的安全數組類運用了動態內存分配和運算符重載,使得該類對象既具有可變的大小、安全的訪問機制,又有基本數組的訪問形式。鏈表是一種存儲順序訪問的線性群體的數據結構,本章介紹的單鏈表由一組具有數據成員和后繼指針的結點構成。與數組相比,鏈表有著更靈活的動態內存分配機制,插入和刪除結點時也無須移動其它元素。以數組類和鏈表類為基礎,對數據元素的訪問加以限制,便構成了棧類和隊列類。棧具有后進先出的特性,也就是數據元素的插入和刪除

35、都只能在棧頂進行。隊列具有先進先出的特性,元素只能從隊尾入隊,從隊頭出隊。另外本章還介紹了幾種數據查找和排序算法。在對上述數據結構和算法的介紹中,綜合運用了前面章節講過的知識,學習這一章的同時也起到了復習的作用。為了使數組類與基本數組的訪問形式一樣,定義了一系列運算符重載函數。在數組類的拷貝構造函數和=運算符函數中,可以看到深拷貝與淺拷貝的區別。本章中的數組、鏈表、棧、隊列都是以類模板的形式聲明和實現的,查找和排序算法也都是以函數模板形式定義的,這是c+獨特的類型參數化機制。通過這些類模板和函數模板的應用,讀者可以很容易的體會到模板的作用,而這正是下一章要將的泛形程序設計的基礎。本章對類模版的

36、介紹比較簡單,沒有涉及類模板的繼承關系。對初學者來說重點是理解模板的作用,學會簡單的應用,對于較復雜的語法問題,可以先不考慮。有些讀者可能會感覺本章的例題比起以前的章節來難度明顯增大了許多,不過本章的教學目標并不是要使讀者僅僅學了這一章就能夠設計、實現同樣難度的類模板、函數模板。而是通過這些例題復習以前的知識、學會模板的聲明和應用,同時初步了解幾個常用的數據結構和算法,并能夠應用已經編寫好的模板來解決問題。這也是為下一章打基礎。要深入學習有關數據結構的內容,還需要專門的數據結構教材。第 10 章 泛型程序設計與c+標準模板庫這一章的目標主要是初步了解泛形程序設計的概念,學會c+標準模板庫(st

37、l)的使用方法,為此本章介紹了一些與之有關的基本概念、術語和簡單的應用舉例。stl是最新的c+標準函數庫中的一個子集,這個龐大的子集占據了整個庫的大約80%的分量。要很好地理解stl,不僅需要相關的數據結構知識,而且需要有一定的編程經驗。因此本章旨在使讀者對stl有一個基本了解,為進一步學習使用stl打下一個基礎。讀者只要能看懂本章的例題,并能夠模仿著編寫類似的簡單程序就可以了。要完全掌握stl不是一朝一夕的事,需要參考stl手冊,并在長期編程實踐中積累經驗。ansi/iso c+文檔中的stl是一個僅被描述在紙上的標準,對于諸多c+編譯器而言,需要有各自實際的stl,它們或多或少的實現了標準

38、中所描述的內容,這樣才能夠為我們所用。之所以有不同的實現版本,則存在諸多原因,有歷史的原因,也有各自編譯器生產廠商的原因。stl網站(本書的附錄c給出了stl中通用算法函數原型及說明。第 11 章 流類庫與輸入/輸出i/o流類庫是一個提供輸入/輸出功能的,面向對象的類庫。流是對輸入/輸出的一個抽象表述,程序通過從流中提取字符和向流中插入字符來實現輸入和輸出。一般來說,流是與實際的字符源或目標相關的,例如磁盤文件、鍵盤或顯示器,所以對流進行的提取或插入操作實際上就是對物理設備的操作。標準輸入/輸出流對象是連接程序與標準輸入/輸出設備的。常用的標準輸出流有:cout、cerr、clog,標準輸入流

39、有:cin。標準流對象都是在中預先聲明好的。除了標準輸入/輸出流以外,使用其它的流之前都要首先聲明流對象,因此對于i/o流類庫的結構需要十分清楚。輸入/輸出流類有許多成員函數,除了主教材中介紹的以外,讀者如果需要詳細了解更多的信息,請查閱關于標準c+庫的書籍和手冊。ttp:/ 有i/o流類庫的詳細說明及例題,使用vc+6.0開發環境的讀者,可以查閱msdn聯機幫助系統,獲得標準c+庫的說明。第 12 章 異常處理在大型面向對象應用程序中,經常涉及到異常處理。使用異常處理使得應用方案的設計更方便、具體。c提供了一個非常好的異常處理方法。通過這種方法,被調函數可以告知調用函數:有某種錯誤出現。c中

40、的異常處理可以涵蓋到對任何錯誤的處理,不論是內存分配失敗還是程序運行過程中類型轉換錯誤。異常處理提供了一種將控制和信息從錯誤發生點轉移到異常處理點的方法。當一個函數中出現錯誤而它自身不能解決時,這個函數可以拋出(throw)一個異常,通知它的直接或間接調用者處理這個錯誤。一個函數可以通過捕獲(catch)以常來表明它希望處理這種異常。c提供了三個關鍵字來對例外進行處理。 try:可能拋出異常的段程序必須以try開始。緊跟著try的是一段包含在大括號中的程序,這段程序有可能拋出異常。throw:異常要通過關鍵字throw來拋出。異常對象的類型決定了哪一個catch語句可以捕獲這一異常。catch

41、:處理異常的程序必須以catch開始。跟隨在catch后面的是一段包含在大括號中的程序。第 13 章 mfc庫與windows程序開發概述編寫windows環境下的圖形用戶界面程序,只是c+語言的眾多應用領域之一,mfc庫是一種c+基礎庫,為windows這一特定的操作系統環境下的圖形用戶界面程序提供了強大的支持。本章的目的在于使讀者對windows環境下的應用開發有一個初步了解,以此作為c+語言的應用實例,并不期望讀者通過本章學習能夠自如地編寫windows程序。對于初學編程的讀者,可以將本章作為一般只是瀏覽,不必追求完全理解。有興趣的話,應該按照例13-1的說明,自己上機實踐一下,對win

42、dows程序的開發就有一個概要性理解了。 面向對象程序設計課文精講串講文字材料 一、面向對象及c+基礎知識 (一)面向對象程序設計基礎 (1)面向對象的優點 (2)面向對象程序的結構 (3)面向對象程序語言的關鍵要素 (4)數據封裝 (5)c+ 語言的來龍去脈 (二)c+ 基本程序結構 (1)作用域與作用域運算符: (2)const修飾符 (3)函數 (4)new 和 delete 運算符 (5)引用 二、類和對象 (一)類 (1)類的聲明 (2)類的成員 (3)類中成員的訪問屬性 (4) 類的作用域 (5)類的兩種聲明方式 (6)空類 (7)嵌套類 (8)類的實例化 (二)數據成員 (1)數

43、據成員的類型 (2)數據成員的修飾符 (3)數據成員的初始化 (三)成員函數 (1)成員函數的定義 (2)內聯成員函數 (3)重載成員函數 (4)帶缺省參數的成員函數 (5)this 指針 (四)對象 (1)對象的定義 (2)對象的引用 (3)對象的生命周期 (4)對象的相互賦值 (5)對象可以作為數組的元素 (6)可以說明指向對象的指針 (7)對象可以用作函數參數 (8)一個對象可以用作另一個對象的成員 (五)結構和聯合 (1)使用結構定義類 (2)使用聯合定義類 三、構造函數與析構函數 (一)構造函數 (1)構造函數的作用 (2)構造函數的定義 (3)構造函數的性質 (4)構造函數的種類

44、(5)構造函數與運算符new (6)構造函數用作類型轉換函數 (7)構造函數的構成 (8)構造函數的調用 (二)析構函數 (1)析構函數的作用 (2)析構函數的定義 (3)析構函數的性質 (4)缺省析構函數 (5)析構函數與運算符delete (6)析構函數的調用 (7)析構函數的特別事項 (三)構造函數和析構函數與對象 (1)對象的初始化 (2)對象賦值 (3)對象成員 (4)對象數組 四、繼承和派生類 (一)基本概念 (1)什么是派生? (2)派生的性質 (3)派生后的變化 (4)派生類的類型 (5)派生的目的 (6)保護成員的作用 (二)派生類的聲明格式 (1)單一繼承 (2)多重繼承

45、(3)派生方式 (三)訪問權限 (1)公有派生的訪問權限 (2)私有派生的訪問權限 (四)賦值兼容規則 (1)適應范圍 (2)含義 (3)規則 (五)派生類的構造函數 (1)一般格式 (2)構造規則 (3)調用順序 (六)派生類的析構函數 (1)格式 (2)調用順序 (七)二義性及其解決 (1)二義性的產生及作用域運算符 (2)支配規則解決二義性 (八)重復繼承 (1)何為重復繼承? (2)c+對重復繼承的限制 (九)虛基類 (1)問題的提出 (2)虛基類的定義 (3)虛基類的作用 (4)帶虛基類的派生類的聲明 (5)帶虛基類的構造函數的構造 (6)帶虛基類的構造函數的調用順序 (7)帶虛基類

46、的析構函數的調用順序 五、多態性與虛函數 (一)多態性 (1)何為多態性? (2)聯編的概念 (3)多態性與聯編 (4)重載 (5)引入派生類后的指針 (二)虛函數 (1)函數的作用 (2)虛函數的定義和說明 (3)虛函數的訪問權限 (4)成員函數與虛函數 (5)構造函數、析構函數與虛函數 (6)空虛函數 (7)重載函數與虛函數 (8)多重繼承與虛函數 (三)純虛函數與抽象類 (1)何為純虛函數? (2)純虛函數的定義 (3)何為抽象類? (4)抽象類的性質 (四)虛析構函數 六、進一步使用成員函數 (一)靜態成員 (1)靜態數據成員 (2)靜態成員函數 (二)友元 (1)友元函數 (2)友元

47、成員 (3)友元類 (4)友元和派生類 (三)const 對象和volatile 對象 (1)返回對象 (2)使用帶有this指針的函數 (3)同時定義const和volatile成員函數 (4)注意事項 (四)轉換函數 (五)指向類成員的指針 (1)指向數據成員的指針 (2)指向成員函數的指針 (六)數組與類 七、運算符重載及流庫類 (一)運算符重載 (1)重載方法 (2)運算符重載的方式 (3)運算符重載的說明 (4)對運算符重載的調用 (5)+ 與 - 運算符的重載 (6)對運算符“()”的重載 (7)對運算符“”的重載 (二)運算重載與類型轉換 (三)c+ 的流與流庫類 (1)c+ 的

48、流 (2)streambuf類 (3)ios 類 (四)輸入輸出格式控制 (1)用ios的成員函數進行格式控制 (2)用操縱符進行格式控制 (3)自定義操縱符 (五)運算符“”和“”的重載 (1)重載輸出運算符“” (六)文件的輸入輸出 (1)文件的打開與關閉 (2)文本文件的輸入輸出 (3)二進制文件的輸入輸出 (4)流的錯誤處理 八、模板 (一)模板的概念 (二)函數模板與模板函數 (1)函數模板的聲明和模板函數的生成 (2)函數模板的異常處理 (三)類模板與模板類 (1)類模板 (2)定義模板類與它的成員函數 (3)類模板的派生 九、進一步掌握面向對象程序設計 (一)面向對象的設計 (1

49、)類的確定 (2)面向對象的設計方法 (3)類群和類樹 (4)類群和類樹 (二)設計中的幾個問題 (1)整體認識 (2)類的組織 (3)類和函數的設計與說明 (4)繼承和面向程序設計 十、試題分析 (一)關于各種試題類型的分析 (1)自考試題的出題特點 (2)各種試題類型的特點及答題中應注意的事項 單項選擇題 填空題 改錯題 完成程序題 程序分析題 面向對象程序設計第一章內容提要 一、面向對象程序設計基礎 (1)面向過程與面向對象 1)面向過程及其困境 所謂“面向過程”,就是不必了解計算機的內部邏輯,而是把精力主要集中在解題算法的邏輯和過程的描 述上,使用過程語言編寫程序,通過程序把解決問題的

50、執行步驟告訴計算機。 面向過程的程序的可重用性差、維護代價高。也引入了困擾軟件開發的兩大難題,即: 如何超越程序復雜性障礙; 如何在計算機系統中自然地表示客觀世界,即對象模型。 2)面向對象及其優點 面向對象的觀點認為,客觀世界是由各種各樣的實體,也就是對象組成的。每種對象都有自己的內部狀態 和運動規律,不同對象之間的相互聯系和相互作用就構成了各種不同的系統,并且進而構成整個客觀世界 。按照這樣的思想設計程序,就是面向對象的程序設計。 面向對象程序設計方法是軟件系統的設計與實現的新方法。這種新方法是增加軟件的可擴充性和可重用性 ,來改善并提高程序員的生產能力,并能控制軟件的復雜性和軟件的維護開

51、銷。 “面向對象”的優點是: 第一,有希望解決軟件工程的兩個主要問題軟件復雜性控制和軟件產生率的提高; 第二,符合人們的思維習慣,即能夠自然地表現現實世界的實體和問題,這對軟件開發過程有著重要的意 義。 (2) 面向對象程序設計方法 1)面向對象的程序設計中的對象 面向對象的程序設計,是通過為數據和代碼建立分塊的內存區域,以便提供對程序進行模塊化的一種程序 設計方法,這些模塊可用作樣板,在需要時再建立其副本。所以對象是計算機內存中的一塊區域,通過將 內存分塊,每個模塊(即對象)在功能上相互之間保持相對獨立。并且: 這些內存塊中不但存儲數據,而且也存儲代碼; 這些內存塊的結構可被用作樣板產生對象的更多副本。 在面向對象的程序中,對象之間只能通過函數調用實現相互通信。一個對象可以調用另一個對象的函數, 這樣,對象之間的相互作用方式是仔細控制的,處于一個對象外部的代碼就沒有機會通過直接修改對象的 內存區域妨礙對象發揮其功能。 對象的這一特點導致了模擬現實世界的一種新型方法:面向對象就是將世界看成是由一組彼此相關并且能 相互通信的實體即對象組成

溫馨提示

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

評論

0/150

提交評論