全書共分為8章,闡述了C 的特點和開發過程、面向對象程序設計技術、類的定義、對象的創建及訪問、友元與靜態成員、模板編程方法、運算符重載、C 的繼承機制及虛基類、多態性、輸入輸出流,以及C 中的其他主題。
本書取材新穎,內容豐富,可讀性強,教學資源豐富,在充分考慮了學習者對書中部分內容的心理適應的基礎上,對于一些容易讓人產生畏懼心理的內容作了適當的處理。本書所有程序都在Visual C 6.0、Visual C 2022和DevC 5.11開發環境中進行了嚴格的測試。
本書可作為高等院校計算機及相關專業C 面向對象程序設計課程的教材,也適合作為初學程序設計或有一定編程實踐基礎、希望突破編程難點的讀者的自學教材。此外,相關軟件開發人員也可通過本書的學習,迅速提高C 面向對象程序設計的能力。
作者使用過數本C 面向對象程序設計的教材,發現不少問題。C 教學的普遍結果是,學生學完了C ,卻不會使用目前流行的C 開發工具編寫程序。此外,不少教材也存在錯誤,例如某C 語言經典教材在關于打開文件的代碼中出現了類似如下的代碼:ofstream outFile; //定義文件變量
if (outFile.open("test.txt",ios::app)) //以追加方式打開文件
{//打開文件失敗
cout<<"打開文件失敗!"< exit(1); //退出程序
}上面代碼并不能通過編譯,原因是文件流類的成員函數open()返回值類型為void,出現這些錯誤的原因是作者想當然地按照C語言的類似函數fopen()編寫代碼,沒有上機測試,使學生看完書后不能上機實踐或上機實踐非常困難,實際上只要上機運行很容易就能發現類似的錯誤及錯誤的原因,可按如下方式進行修改:ofstream outFile; //定義文件變量
outFile.open("test.txt",ios::app); //以追加方式打開文件
if (outFile.fail())
{//打開文件失敗
cout<<"打開文件失敗!"< exit(1); //退出程序
}雖然圖書中存在錯誤在所難免,但是這種潛在錯誤對讀者的影響是難以估量的。因為這類教材的讀者面太大,而且讀者很難有機會發現這種錯誤,并會一直延續這種錯誤的觀念,這類問題在一些教材中存在多年。
傳統的C 教學都過于注重解釋C 語言本身,而忽視了其在具體環境中的使用指導,例如對于如下的類聲明及相關代碼:#include //編譯預處理命令
using namespace std; //使用命名空間std
//聲明復數數
class Complex
{
private:
//數據成員
double real; //實部
double image; //虛部
public:
//公有函數
Complex(double r=0,double i=0): real(r),image(i){} //構造函數
friend Complex operator (const Complex &z1, const Complex &z2) //復數加法
{ return Complex(z1.real z2.real,z1.image z2.image); }
…
};上面的類聲明及相關代碼在Visual C 2022和DevC 5.11中都能正常通過運行,但在Visual C 6.0中會出現編譯時錯誤,是Visual C 6.0的一個缺陷(Bug),在Visual C 6.0中將#include //編譯預處理命令
using namespace std; //使用命名空間std 改為#include //編譯預處理命令后才可正常運行。又如,對于輸入運算符>>和輸出運算符<<重載為類的友元函數時,采用標準頭文件iostream,在Visual C 6.0、Visual C 2022和DevC 5.11中都不能通過編譯,只能在Visual C 6.0中采用傳統的頭文件iostream.h才能通過編譯,但將輸入運算符>>和輸出運算符<<重載為普通函數時無任何編譯問題。
可惜的是,鮮有教材對具體的編程環境進行詳細指導,無形中增加了學生掌握C 的難度。
作者在經過二十多年教學和查閱大量參考資料后編寫本書,將全書分為8章。第1章闡述C 的主要特點及C 程序開發過程,詳細介紹C 在非面向對象方面的常用新特性。第2章介紹面向對象程序設計技術、C 類的定義、對象的創建以及對象成員的訪問、友元與靜態成員等基本內容。第3章介紹模板編程方法,并對模板容易出現的編程問題進行詳細的討論。第4章介紹運算符重載,重點對不同C 編譯器使用運算符重載時的兼容性問題進行了具體指導。第5章著重介紹C 的繼承機制及虛基類。第6章介紹多態性,重點介紹虛函數和抽象類。第7章介紹輸入輸出流,重點討論標準輸入輸出流類、文件操作與文件流類。第8章對C 中的其他主題進行深入闡述,這些主題都是難點,但都不是重點。如果這些內容在前面的章節中加以討論,對于讀者就會因難度過大而較難進入面向對象的思維模式,當讀者已具備面向對象的思維習慣以后,再來介紹這些典型問題應該比較合適。
對于初學者,考試時往往會感到茫然而不知所措,因此本書習題包括了選擇題、填空題和編譯題。這些題目選自于考試題,可供學生期末復習,也可供教師編寫試題時參考。
本書在部分章節中還提供了實例研究,主要提供給那些精力充沛的學生深入學習與研究,這些實例包括對正文內容的應用(例如6.4節中棧的實現實際上就是抽象類的一個典型應用)、讀者深入學習時可能會遇到的算法(例如3.4節中的快速排序)以及應用所學知識解決實際問題(例如7.5節中的簡單工資管理系統就是文件操作實現簡單信息管理系統),讀者通過對實例研究的學習,可提高實際應用C 面向對象程序設計的能力,雖然有一定的難度,但應比讀者的想象更易學習與掌握。
為了盡快提高讀者的實際編程能力,本書各章提供了程序陷阱,包括在實際編程時容易出現的問題,也包括正文內容的深入討論,還包括對C 編譯環境中存在的兼容性問題進行實用而具體的指導,這部分內容不管對初學者還是長期編程的人都很有用。
關于C 編譯器的問題,在C 之外的任何編程語言中,編譯器都沒有受到過如此的重視。這是因為C 是一門非常復雜的語言,以至于編譯器也難以構造,我們常用的編譯器都不能完全符合C 標準,如下介紹一些常用且優秀的C 編譯器。
(1) Visual C 編譯器。該編譯器由微軟公司開發,現在流行的是Visual C 6.0、Visual C 2022以及更新版本的Visual C ,特點是集成開發環境用戶界面友好,信息提示準確,調試方便,對模板支持最完善。Visual C 6.0對硬件環境要求低,現在安裝的計算機最多,但對標準C 兼容只有83.43%。Visual C 2022與更新版本的Visual C 在軟件提示信息上做了優化與改進,使其對標準C 的兼容達到了98%以上,但對硬件的要求較高。
(2) GCC編譯器。這是一款著名的開源C 編譯器,類UNIX操作系統(例如Linux)下編寫C 程序的首選,有非常好的可移植性,可以在非常廣泛的平臺上使用,也是編寫跨平臺、嵌入式程序很好的選擇。GCC 3.3與標準C 的兼容性可達96.15%。現已有一些移植在Windows環境下使用GCC編譯器的IDE(集成開發環境),例如DevC 是能夠讓GCC在Windows下運行的集成開發環境,提供了與專業IDE相媲美的語法高亮、代碼提示和調試等功能;根據作者的實際使用,感覺使用GCC編譯器的IDE錯誤信息提示的智能較低,錯誤提示不太準確,對模板支持較差,但對語法檢查較嚴格,在Visual C 編譯器中編譯通過的程序可能在GCC編譯器的IDE還會顯示有錯誤信息。
本書所有程序都同時在Visual C 6.0、Visual C 2022和DevC 5.11中通過測試。讀者可根據實際情況選擇適當的編譯器。
教師可采取多種方式使用本書講授C 面向對象程序設計,并可根據讀者的背景知識以及課程的學時數進行內容的取舍。為滿足不同層次的教學需求,本教材使用了分層的思想,分層方法如下: 沒有加*及的部分是基本內容,適合所有讀者學習;加有*的部分適合計算機專業的讀者作為深入學習的選學部分;加有的部分適合于感興趣的讀者研究。
作者為本書提供了全面的教學支持,除了向專業教師提供教學資源外,普通讀者可在清華大學出版社官方網站上下載如下教學參考內容:
(1) 提供書中所有例題在Visual C 6.0、Visual C 2022和DevC 5.11開發環境中的測試程序。
(2) 提供教學用PowerPoint課件。
(3) 提供教材中所有習題的參考答案。
(4) 提供至少6套C 語言程序設計模擬試題及其解答,以供學生期末復習,也可供教師出考題時參考。
(5) 提供C程序設計相關的其他資料(例如DevC 軟件,流行、免費的C/C 編譯器下載網址)。
(6) 線上實訓項目與線上習題使用指導。
通過掃描二維碼可觀看全書所有例題的程序演示視頻,其中第一個二維碼對應于Visual C 6.0開發環境的程序演示視頻,第二個二維碼對應于Visual C 2022開發環境的程序演示視頻,第三個二維碼對應于DevC 5.11開發環境的程序演示視頻。
在附錄A中介紹Visual C 6.0、Visual C 2022和DevC 5.11開發環境建立工程的步驟,可通過掃描二維碼觀看具體操作視頻。
提供大量的線上實訓項目與線上習題。其中,線上實訓項目可用于實驗項目或課程設計項目,線上習題可用于布置課后習題,所有線上實訓項目與線上習題都采用通關方式完成任務,具體包括任務描述和相關知識,編程實踐項目還包括編程要求及測試說明,線上習題包括了單項選題關卡、填空題關卡、判斷題關卡及編程實踐題關卡,不但可用于學生練習,也可供教師出考試題時參考。線上實訓項目與線上習題都由線上平臺自動測評與打分,學生所得分值可用于過程化考核成績。
本書第1章和第2章由羅佳編寫,第4章、第7章由劉群編寫, 第5章和第6章由丁曉峰編寫,第3章和第8章及附錄由游洪躍編寫,全書由游洪躍統稿。作者還要感謝為本書提供直接或間接幫助的每一個朋友,由于你們熱情的幫助或鼓勵激發了作者寫好本書的信心以及寫作熱情。
本書的出版要感謝清華大學出版社相關編校人員,由于他們為本書的出版傾注了大量熱情,也由于他們具有前瞻性的眼光才讓讀者有機會看到本書。
盡管作者有良好而負責任的嚴格態度,并盡了最大努力,但限于作者水平,書中難免有不妥之處,因此敬請各位讀者不吝賜教,以便作者有一個提高的機會,并在再版時盡力采用你們的意見,盡快提高本書的質量。
作者2024年9月
第1章C 程序設計基礎1
1.1C 的發展和主要特點1
1.1.1C 的發展1
1.1.2C 的特點1
1.2第一個C 程序以及C 程序開發過程1
1.2.1第一個C 程序1
1.2.2C 程序開發過程4
1.3C 的常用新特性5
1.3.1C 的輸入輸出5
1.3.2const定義常量6
1.3.3函數重載7
1.3.4有默認參數的函數9
1.3.5變量的引用11
1.3.6動態分配和釋放內存的運算符new和delete16
1.3.7布爾類型18
1.4實例研究: 破解數字謎語19
1.5程序陷阱21
習題122第2章類和對象24
2.1由結構到類的發展24
2.1.1帶函數的結構24
2.1.2從結構到類的演化26
2.2面向對象程序設計技術27
2.2.1對象27
2.2.2抽象和類27
2.2.3封裝28
2.2.4繼承28
2.2.5多態性28
2.3C 類的聲明與對象的定義28
2.3.1類的聲明28
2.3.2在類體外定義成員函數30
2.3.3定義對象的方法31
2.3.4對象成員的引用33
2.4構造函數34
2.4.1構造函數的定義34
2.4.2用初始化表對數據成員進行初始化和使用默認參數36
2.5析構函數37
2.6構造函數和析構函數的一般執行順序39
2.7復制構造函數41
2.8用const保護數據46
2.8.1常對象成員46
2.8.2常對象49
2.8.3對象的常引用52
2.9字符串53
2.10友元55
2.10.1友元函數55
2.10.2友元類58
2.11靜態成員59
2.11.1靜態數據成員59
2.11.2靜態成員函數61
2.12this指針63
2.13程序陷阱65
習題266第3章模板75
3.1模板的概念75
3.2函數模板及模板函數77
3.2.1函數模板的聲明及生成模板函數77
3.2.2重載函數模板79
3.3類模板及模板類81
3.3.1類模板的聲明及生成模板類82
3.3.2在類型形參表中包含常規參數的類模板84
3.4實例研究: 快速排序86
3.5程序陷阱88
習題390第4章運算符重載93
4.1運算符重載的概念93
4.2運算符重載方式96
4.2.1運算符重載為類的成員函數97
4.2.2運算符重載為類的友元函數99
4.2.3運算符重載為普通函數102
4.3典型運算符重載104
4.3.1重載賦值運算符(=)104
4.3.2重載自增1運算符( )和自減1運算符()108
4.3.3重載下標運算符([])111
4.3.4重載函數調用運算符(())112
4.3.5重載輸入運算符(>>)和輸出運算符(<<)113
4.4程序陷阱116
習題4116第5章繼承118
5.1繼承與派生118
5.1.1繼承與派生的概念118
5.1.2派生類的聲明119
5.1.3派生類與基類中的同名成員123
5.2繼承方式125
5.2.1公有繼承125
5.2.2私有繼承128
5.2.3保護成員和保護繼承130
5.3派生類的構造函數和析構函數136
5.3.1構造函數136
5.3.2析構函數140
5.4多繼承與虛基類142
5.4.1多繼承142
5.4.2多繼承引起的多義性問題144
5.4.3虛基類146
5.5程序陷阱151
習題5152第6章多態性159
6.1多態性的概念159
6.2虛函數160
6.2.1虛函數的概念160
6.2.2虛析構函數166
6.3純虛函數和抽象類168
6.4實例研究: 棧的實現172
6.5程序陷阱179
習題6180第7章輸入輸出流185
7.1C 的輸入輸出185
7.1.1輸入輸出的概念185
7.1.2C 的輸入輸出流185
7.2標準輸出流對象cout186
7.2.1cout186
7.2.2格式輸出186
7.2.3輸出流類成員函數put()190
7.3標準輸入流對象cin191
7.3.1cin191
7.3.2輸入流類的常用字符輸入的成員函數191
7.3.3輸入流類的其他常用成員函數193
7.4文件操作與文件流196
7.4.1文件和文件流的概念196
7.4.2文件的打開與關閉操作197
7.4.3對文本文件的操作199
7.4.4對二進制文件的操作204
7.5實例研究: 簡單工資管理系統208
7.6程序陷阱219
習題7221第8章C 的其他主題225
8.1類型轉換225
8.1.1標準類型之間的轉換225
8.1.2類類型的轉換226
8.2內置函數228
8.3異常處理232
8.4命令空間239
8.5程序陷阱242
習題8244參考文獻246附錄A常用C 編譯器使用方法247