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