本書是供已學過C語言的讀者學習C 面向物件程序設計的教材。
C 是國內外廣泛學習和使用的支持面向物件程序設計的現代計算機高級語言,國內許多高校已陸續開設了C 程序設計課程。但是,由於C 涉及的概念很多,語法比較複雜,內容十分廣泛,不少人感到學習難度很大,難以入門。針對這種情況,作者深入研究了C 的內容和初學者的認知規律,專門為已學習過C語言的讀者構建了便於學習的教材體系,編寫了這本C 面向物件程序設計入門教材。
本書對面向物件程序設計的基本概念和C 語言的基本內容作了全面、通俗而詳盡的說明,並且把這兩方面有機地結合起來。第1章介紹在面向過程程序設計領域中C 對C的擴充,第2章初步介紹面向物件程序設計的基本知識,第3~8章由淺入深地介紹怎樣利用C 編寫程序,在此過程中自然地介紹了面向物件程序設計方法的應用。
本書內容全面,概念清晰,例題豐富,通俗易懂,易於學習,可作為大學各專業學習C 面向物件程序設計的基礎教材,也適於C 的初學者自學。即使沒有教師講授,讀者也基本能看懂本書的大部分內容。
本書配有兩本輔導教材:《C 面向物件程序設計(第4版)學習輔導》和《C 程序設計實踐指導》,供教學參考。
本書為普通高等教育“十一五”國家級規劃教材,獲全國高校出版社優秀暢銷書一等獎。本書內容全面,概念清晰,例題豐富,通俗易懂,深入淺出,易於學習,可作為大學各專業學習C 面向物件程序設計的基礎教材,也適於C 的初學者自學。本書內容包括面向物件程序設計的基本理論概念和C 語言的基本內容,並且把這兩方面有機地結合起來。第一章介紹面向過程程序設計領域中C 對C的擴充,第二章簡要而通俗清晰地介紹了面向物件程序設計的基本知識,在後續各章中由淺入深地介紹怎樣編寫C 程序,在這過程中自然地具體地介紹了面向物件程序設計方法的應用。
本書是一本介紹C 面向物件程序設計的入門基礎教材。
目前的主流計算機的指令執行是過程導向的,每個步驟(計算機指令)是依次執行的。因此早期的編程語言也是面向過程的,設計者必須充分地考慮程序的每個細節,要指定程序在每一環節應執行的動作。
C語言是面向過程的結構化和模塊化的語言,C語言是編寫UNIX操作系統的語言,功能強大,使用靈活。它在處理小型問題時得心應手,但在處理大型複雜問題時就顯得力不從心了。現代計算機應用已經遠遠超出了科學計算和控制計算機操作的層面,而是更多地去解決各種各樣現實生活與工作中的複雜問題,如模擬氣象現象,製作文字、圖形、視頻作品等。為了處理複雜應用程序,計算機科學家提出了面向物件程序設計的理論,並於20世紀末期在C語言的基礎上推出支持面向物件的C 語言,為處理複雜應用程序提供了有力的工具。
近年來,國內許多大學的計算機類專業都開設了C 程序設計課程,一些大學的非計算機專業也開設了C 面向物件程序設計課程,許多學過C語言程序設計的人也想了解和學習C 和面向物件程序設計的有關知識。但是,由於C 涉及概念很多,語法比較複雜,內容十分廣泛,使不少人感到學習難度較大,難以入門。
應讀者的要求,作者在十多年前編著了《C 程序設計》一書,由清華大學出版社出版並向全國發行。該書以未學過C語言的讀者為物件,從面向過程入手介紹程序設計的基本知識和方法,然後介紹用C 進行面向物件程序設計的方法。由於內容全面,概念清晰,通俗易懂,該書出版後,受到各校師生的歡迎和好評。
目前在大學理工類專業,普遍開設了C語言程序設計的課程,許多學生在學習C語言後希望對C 面向物件程序設計有所了解,以便日後在需要時能較快地進入該領域。很多師生希望我能編寫一本以C語言為起點的C 教材。
為此,幾年前我在清華大學出版社出版了《C 面向物件程序設計》一書。該書是在《C 程序設計》一書的基礎上編寫而成的,已學習過C語言程序設計的讀者,不必再重新學習面向過程程序設計的部分,而可以直接從面向物件程序設計入手。作者將《C 程序設計》一書中介紹面向物件程序設計的內容抽出來改寫後單獨成書,並且重新寫了第1章“從C到C ”,介紹C 面向物件程序設計的初步知識以及C 對C語言在面向過程程序設計方面的擴展,為以後各章的學習打下基礎。這樣的安排使內容更集中,篇幅更緊湊。該書仍然保持了通俗易懂、貼近讀者、容易入門的特點。希望有助於大學生學習C 課程,初步掌握面向物件程序設計的方法。
幾年前,作者曾對該書進行過修訂,出版了《C 面向物件程序設計》(第3版),最近根據教學實踐的情況,又進行一次全面的修訂。這次修訂,在保留原書內容全面、概念清晰的優點的基礎上,從章節標題到正文都進行了不少修改和補充,使之更加通俗易懂,容易學習。現在出版《C 面向物件程序設計》(第4版),即本書。
在此,對本書的指導思想作以下的說明。
1. 教材要準確定位
首先要明確教材是為什麼人寫的,他們學習C 的目的是什麼,要學到什麼程度,不能無的放矢。推出C 的初衷是解決大型複雜應用軟件開發中遇到的問題,提高軟件的開發效率。只有參加過研制相對大型軟件的人才會真正體驗到C 的優越性。應當說明,本書的主要物件不是C 的專業開發人員,而是高校各專業的大學生和自學現代編程語言的讀者,本書不是程序員培訓班教材。本書的讀者一般並無實際程序開發的經驗,將來多數人也不一定成為專業的編程人員。
不可奢望,通過幾十小時的學習,就能使一個沒有C 程序設計基礎的初學者變成一個熟練的C 開發人員。應當有實事求是的分析和估計。
本書的定位是“入門”與“基礎”。用有效的方法使讀者順利入門,通過學習,打好基礎。通過學習本書,多數讀者會有以下收獲:①清晰地了解面向物件程序設計的方法以及C 的主要功能與特點;②能夠用C 編寫簡單的面向物件的程序;③能看懂別人編寫的規模比較小的C 程序; ④奠定進一步學習和應用的良好基礎。也就是從“不知”到“初知”,從“不會”到“初會”。入了門,有了良好的基礎,以後提高和應用就不困難了。
2. 要設計合適的教材體系,合理取舍內容
學習C 面向物件程序設計,應當對面向物件的方法和C 的基本特點有基本的了解。
C 面向物件程序設計涉及面向物件程序設計的理論和C 語言的語法兩方面,都很重要。本書主要介紹C 處理問題的面向物件的思維方式和C 語言的基本內容。我們不是抽象地介紹面向物件程序設計的理論,也不是枯燥地介紹C 的語法,而是以程序設計為中心把這兩方面有機地結合起來。在介紹用C 語言編程的過程中,自然而然地引出面向物件程序設計的有關概念,通過C 編程過程理解面向物件程序設計方法,二者緊密結合,相得益彰。
本書內容系統而全面。面向物件程序設計有4個主要特點:抽象、封裝、繼承和多態性,在C 語言中都有相應的機制來實現它們。作為教材,不能忽略C 的主要內容,本書的內容全面涵蓋了以上4方面,提供了詳細而通俗的介紹和編程舉例。
我們努力使讀者通過較短時間的學習,能對面向物件方法和C 有基本和全面的了解,而不是陷於煩瑣的細節之中。教材不同於使用手冊。手冊的任務是提供無所不包的使用細節以備查詢,而教材的任務是用容易理解的方法講清楚有關的基本概念和基本方法。不能把教材寫成包羅萬象的手冊,否則將會使篇幅過大,而且會衝淡重點,主次不分,使讀者感到枯燥無味。
本書的做法是:從應用出發,對編程所用到的最基本內容和注意的問題都作了詳細的說明,但是並不羅列C 語法中過多的細節,需要時把一些細節列出成表,供用時查閱。希望讀者在學習時“多理解,勿死記”,以把主要精力放在基本概念和基本方法上。
要深入了解和掌握面向物件程序設計的概念和方法,是一個學習—實踐—再學習—再實踐的過程,不可能一蹴而就。在初學階段,要引導讀者初步理解面向物件的概念,並由簡到繁地學會編寫C 程序。奠定了C 編程的初步基礎,以後再進一步提高。這樣的方法可能符合大多數學習者的情況,降低了學習難度。
3. 概念清晰,深入淺出,化難難點,容易學習
C 不容易學,也不容易教。作者在寫作過程中花了很大的精力考慮怎樣使讀者接受和理解。作者一貫認為:教材編著者應當與讀者將心比心,換位思考,要站在讀者的角度思考和提出問題,幫助他們解除學習中的困難。要善於把複雜的問題簡單化,而不應當把簡單的問題複雜化,要善於化解難點,深入淺出。
作者著力使讀者對於面向物件的方法和C 的特點有清晰、準確和全面的認識。有一些面向物件的概念,名詞很抽象,理論很難懂,有的初學者會被唬住,感到高深莫測。作者用通俗易懂的方法和語言敘述清楚複雜的概念,化解學習中的困難。讀者可以看到,在本書中,幾乎對每一個新出現的概念,都會用日常生活中的例子加以通俗地說明,一看就懂,很容易理解和入門。
希望讀者不要被一大堆高深莫測的名詞術語嚇住,有些問題看起來很深奧,其實換一個角度去解釋就很容易理解,一個通俗的例子就把問題說清楚了。
C 的名詞術語很多,一般C 的教材的章節標題都是一些陌生的、深奧莫測的專業詞匯,往往使人摸不著頭腦,不知道要學的是什麼,難以引發學習的興趣和欲望。作者經過反復思考,改變了標題的寫法,不是簡單地列出一個名詞術語,而是著重說明它是解決什麼問題的。例如,原來有一節的標題是“帶參的構造函數”,這次作者把它改為“用帶參的構造函數對不同物件進行初始化”,讀者從標題就可以知道帶參的構造函數是為了物件初始化的,從前一節到下一節,前後連貫,承上啟下,讀者就會想看看究竟是怎樣處理的。又如,有一節的標題是“友元”,讀者第一次聽到這個術語,往往不知所云,這次作者把標題改為“可以訪問私有數據的‘朋友’”,通俗易懂,具有目的性和啟發性,使讀者想去了解和學習。學習的過程不應該是“教師講什麼,學生學什麼”的被動式學習,應當形成學生主動思考問題、主動學習的局面。
在各章的敘述中,本書不是先給出一個新概念或新術語,再去解釋它,而是先提出需要解決的問題,然後討論用什麼方法去處理它,從而引出新的概念和新的方法。傳統的教學三部曲是:“提出概念—解釋概念—舉例說明”,作者在多年的計算機教學實踐中,採用了新的教學三部曲:“提出問題—分析和解決問題—歸納分析”。 在引入每個程序時,都按照以下幾個步驟展開:提出問題—編寫程序—運行結果—程序分析。由淺入深,逐步展開。不是先理論後實際,先抽象後具體,先一般後個別,而是從具體到抽象,從實際到理論,從個別到一般,從零散到系統。這樣做,符合初學者的認知規律。
4. 教學過程要采取“容易入門,逐步提高”的方法
(1) 精心選擇例子。教材中的例題是基礎性質的,是為了幫助讀者更好地理解某一方面的教學內容而專門編寫的,相對簡單,容易理解。
作者認為,在初學階段的例題不宜太複雜,更不宜把一些比較複雜的實際應用的程序直接搬到課堂當作例題。一個實用的C 程序需要考慮許多因素,綜合各部分知識,有許多注釋行,而且一般是多文件的程序包,讀懂這類大型程序往往需要一定的經驗。作為教學程序要對問題進行簡化,盡量壓縮不必要的語句。
本書中的例題的選擇原則是:①通過例題能更深入地理解有關的概念和編程方法。②篇幅一般不太長,絕大多數讀者能獨立讀懂程序。③通過程序舉例使讀者掌握編程的方法和技巧。
(2) 在初步掌握C 編程方法後,後續階段學習的例題程序會逐漸複雜一些。各章例題的難度是循序漸進的,每一個臺階都不大,讀者能在原來的基礎上逐步提高。
(3) C 面向物件程序設計的概念較多,語法複雜。有的讀者往往把精力放在弄清楚一個個具體問題上,而在學完一章後對全章的內容缺乏整體的概念。建議讀者對於教材每一章的內容至少認真讀兩遍,第一遍弄清楚各個部分的內容,不留死角。然後在學完全章後再從頭到尾認真看一遍,把各個知識點串成一條線,建立一個整體的概念,知道本章講了什麼,重點在哪裡,難點在哪裡,在編程中怎樣使用它們。在開始學習時是化整為零,各個擊破,然後再化零為整,形成整體的認識。這樣做的讀者都會有很大收獲。
(4) 不要滿足於能看懂例題程序,而應當在學完每一章後自己獨立編寫比例題難度大一點的程序。在各章最後的習題中,有些題的難度比教材中的例題稍大一些,希望教師能從中選擇一些指定學生完成,並通過上機實踐,進一步掌握C 的調試與運行的方法。
(5) 在學完本教材各章後,最好學習一些綜合的程序實例,以鞏固收獲,提高編程能力。本書的參考用書《C 程序設計實踐指導》,提供了約50個實用或接近實用的程序,教師可以從中選擇一些在課堂講授,或者指定學生自己閱讀參考。
(6) 本書便於自學,即使沒有老師講解,讀者也能看懂本書的大部分內容。老師可以要求學生先自學,然後在課堂上選擇重點內容講授。有些語法中的具體的規定可以不必講授,由學生自學。
5. C 教材應當體現C 標準
C 是從C語言發展而來的。多數編譯器同時兼容C語言與C 。C 中有很多語法是繼承了C語言的(當然也有不少改進)。熟悉C語言編程的人往往會沿用某些C語言的傳統用法,例如,頭文件帶後綴.h;使用系統庫時不使用命名空間;早期的C語言允許主函數為void類型、主函數可以無返回值等。但是,ANSI C 標準在一些方面有新的規定。例如,要求主函數為int類型,如果程序正常執行,則返回0值;系統頭文件不帶後綴.h;使用系統庫時使用命名空間std;增加了字符串類型string等。
雖然C 編譯器仍然允許使用從C語言繼承來的一些傳統用法,但作者認為,作為教材,應當提倡C 的標準用法。引導讀者從一開始就按照C 標準編寫程序,養成C 的編程習慣和風格。本書各章都是依據C 標準介紹的,同時也說明允許使用的C語言的傳統用法。在本書中,程序的形式大致如下:#include
#include
using namespace std;//使用系統庫時使用命名空間std
int main() //主函數為int類型
{string str; //可以定義字符串變量str
…
return 0; //程序正常執行則返回0
}6. 提供配套的教學資源,滿足教學需要
考慮不同學校、不同專業、不同讀者對學習C 有不同的要求,我們提供了配套的教學資源,供選用。
除了主教材外,推薦使用以下兩本教學參考書:
(1) 《C 面向物件程序設計(第4版)學習輔導》,譚浩強編著,清華大學出版社出版。該書提供主教材各章中的全部習題的解答。由於教材篇幅有限,有些很好的例子無法在教材中列出,因此把它們作為習題,希望讀者自己完成,教師也可以從中選擇一些習題作為例題講授。學生除了完成教師指定的習題外,最好把習題解答中的程序看一遍,以更好地理解C 程序,擴大眼界,啟迪思路,豐富知識,增長能力。
程序設計是一門實踐性很強的課程,只靠聽課和看書是學不好的。衡量學習好壞的標準不是“懂不懂”,而是“會不會幹”。因此必須強調多編程,多上機實踐。在《C 面向物件程序設計(第4版)學習輔導》中,還介紹了運行C 程序的方法。此外,書中還給出上機實踐任務,要求學生完成若干上機實踐。
(2) 《C 程序設計實踐指導》,陳清華、朱紅編著,清華大學出版社出版。該書提供了50多個具有實用價值的C 應用程序。這是為學習教材後進一步深入學習的讀者準備的,目的是提高編程能力。該書內容包括: 怎樣編寫C 應用程序;提供若干不同規模的實際的C 應用程序供分析閱讀;安排並指導學生完成1~2個C 應用程序。經過這樣的訓練,學生的實際能力將會有較大的提高。
此外,本書還提供教材中全部例題的源程序,以便於教師上機和講授,也便於學生在此基礎上調試和修改程序,需要者可在清華大學出版社官網下載。同時,還向使用本書的教師免費提供講課的電子演示文稿(PPT的素材),以節省教師的備課時間。
本書由譚浩強教授編寫,譚亦峰也參加了部分編寫工作。全國高等院校計算機基礎教育研究會和浩強工作室的各位專家以及全國各高校老師多年來對作者始終給予了熱情的支持和鼓勵。清華大學出版社對本書的出版十分重視並作了周到的安排,使本書得以在短時間內出版。對於曾經鼓勵、支持和幫助過我的朋友,謹表示真摯的謝意。
本書肯定會有不妥之處,誠盼專家和廣大讀者不吝指正。
謹識
2023年9月於清華園
第1章C1
1.1從C到C 1
1.2最簡單的C 程序2
1.3C 對C的擴充8
1.3.1C 的輸入輸出8
1.3.2用const定義常變量11
1.3.3函數原型聲明11
1.3.4函數的重載12
1.3.5函數模板14
1.3.6有默認參數的函數16
1.3.7變量的引用17
1.3.8內置函數24
1.3.9作用域運算符25
1.3.10字符串變量26
1.3.11動態分配/撤銷內存的運算符new和delete29
1.3.12C 對C功能擴展的小結31
1.4C 程序的編寫和實現31
1.5關於C 上機實踐33
習題33
第2章類和物件的特性37
2.1面向物件程序設計方法概述37
2.1.1什麼是面向物件的程序設計37
2.1.2面向物件程序設計的特點41
2.1.3類和物件的作用42
2.1.4面向物件的軟件開發43
2.2類的聲明和物件的定義44
2.2.1類和物件的關係44
2.2.2聲明類的類型45
2.2.3定義物件的方法47
2.2.4類和結構體類型的異同48
2.3類的成員函數49
2.3.1成員函數的性質49
2.3.2在類外定義成員函數50
2.3.3內置成員函數(inline成員函數)51
2.3.4成員函數的存儲方式52
2.4怎樣訪問物件的成員54
2.4.1通過物件名和成員運算符訪問物件中的成員54
2.4.2通過指向物件的指針訪問物件中的成員55
2.4.3通過物件的引用來訪問物件中的成員55
2.5類和物件的簡單應用舉例55
2.6類的封裝性和信息隱蔽64
2.6.1公用接口與私有實現的分離64
2.6.2類聲明和成員函數定義的分離65
2.6.3面向物件程序設計中的幾個名詞68
習題68
第3章怎樣使用類和物件71
3.1類物件的初始化71
3.1.1需要對類物件進行初始化71
3.1.2用構造函數實現數據成員的初始化72
3.1.3用帶參數的構造函數對不同物件初始化74
3.1.4在構造函數中用參數初始化表對數據成員初始化76
3.1.5可以對構造函數進行重載77
3.1.6構造函數可以使用默認參數79
3.1.7用構造函數實現初始化方法的歸納82
3.1.8利用析構函數進行清理工作83
3.1.9調用構造函數和析構函數的順序85
3.2物件數組87
3.3物件指針89
3.3.1指向物件的指針89
3.3.2指向物件成員的指針90
3.3.3指向當前物件的this指針93
3.4共享數據的保護94
3.4.1定義常物件95
3.4.2定義常物件成員96
3.4.3指向物件的常指針97
3.4.4指向常物件的指針變量98
3.4.5物件的常引用101
3.4.6const型數據的小結102
3.5物件的動態建立和釋放102
3.6物件的賦值和復制104
3.6.1物件的賦值104
3.6.2物件的復制105
3.7不同物件間實現數據共享108
3.7.1把數據成員定義為靜態108
3.7.2用靜態成員函數訪問靜態數據成員110
3.8允許訪問私有數據的“朋友”113
3.8.1可以訪問私有數據的友元函數113
3.8.2可以訪問私有數據的友元類117
3.9類模板118
習題122
第4章對運算符進行重載126
4.1為什麼要對運算符重載126
4.2對運算符重載的方法128
4.3重載運算符的規則131
4.4運算符重載函數作為類成員函數和友元函數133
4.5重載雙目運算符136
4.6重載單目運算符141
4.7重載流插入運算符和流提取運算符143
4.7.1重載流插入運算符“<<”144
4.7.2重載流提取運算符“>>”146
4.8有關運算符重載的歸納148
4.9不同類型數據間的轉換149
4.9.1標準類型數據間的轉換149
4.9.2把其他類型數據轉換為類物件——用轉換構造函數150
4.9.3將類物件轉換為其他類型數據——用類型轉換函數151
習題157
第5章類的繼承158
5.1繼承與派生158
5.2派生類的聲明方式161
5.3派生類的構成161
5.4派生類成員的訪問屬性163
5.4.1公用繼承164
5.4.2私有繼承166
5.4.3保護成員和保護繼承169
5.4.4多級派生時的訪問屬性173
5.5派生類的構造函數和析構函數174
5.5.1簡單的派生類的構造函數175
5.5.2有子物件的派生類的構造函數178
5.5.3多層派生時的構造函數181
5.5.4派生類構造函數的特殊形式183
5.5.5派生類的析構函數184
5.6多重繼承184
5.6.1聲明多重繼承的方法185
5.6.2多重繼承派生類的構造函數185
5.6.3多重繼承引起的二義性問題188
5.6.4在繼承間接共同基類時減少數據冗余——用虛基類191
5.7基類與派生類的轉換196
5.8繼承與組合199
5.9繼承在軟件開發中的重要意義201
習題202
第6章C 的多態性207
6.1什麼是多態性207
6.2一個典型的例子208
6.3利用虛函數實現動態多態性214
6.3.1虛函數的作用214
6.3.2靜態關聯與動態關聯218
6.3.3在什麼情況下應當聲明虛函數219
6.3.4虛析構函數220
6.4純虛函數與抽象類221
6.4.1沒有函數體的純虛函數221
6.4.2不能用來定義物件的類——抽象類222
6.4.3應用實例223
習題229
第7章輸入輸出流230
7.1C 的輸入和輸出230
7.1.1輸入輸出的含義230
7.1.2C 的I/O對C的發展——類型安全和可擴展性230
7.1.3C 的輸入輸出流231
7.2標準輸出流236
7.2.1cout,cerr和clog流236
7.2.2標準類型數據的格式輸出238
7.2.3用流成員函數put輸出字符243
7.3標準輸入流244
7.3.1cin流244
7.3.2用於字符輸入的流成員函數246
7.3.3istream類的其他成員函數250
7.4對數據文件的操作與文件流253
7.4.1文件的概念253
7.4.2文件流類與文件流物件255
7.4.3文件的打開與關閉255
7.4.4對ASCII文件的操作258
7.4.5對二進制文件的操作263
7.5字符串流268
習題273
第8章善於使用C274
8.1對出現異常情況的處理274
8.1.1異常處理的任務274
8.1.2異常處理的方法275
8.1.3在函數聲明中進行異常情況指定282
8.1.4在異常處理中處理析構函數283
8.2用命名空間避免同名衝突285
8.2.1同名衝突285
8.2.2什麼是命名空間288
8.2.3使用命名空間解決名字衝突290
8.2.4使用命名空間中的成員的方法292
8.2.5使用無名的命名空間294
8.2.6使用標準命名空間std295
8.3使用早期的函數庫296
習題297
附錄A常用字符與ASCII碼對照表299
附錄B運算符與結合性300
參考文獻302
大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。
特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。
無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。
為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。
若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。