內容簡介
本書以面向對象的程式設計思想為主線,以通俗易懂的方法介紹C++語言,引導讀者以最自然的方式,將人類習慣的面向對象的思維方法運用到程式設計中。主要內容包括程式設計基礎知識、類與對象的基本概念、繼承與多態、輸入輸出流,以及泛型程式設計。此外,本教材還介紹了一些常用數據結構基礎知識,使得讀者學習本書後,能夠解決一些簡單的實際問題。整套教材語言生動、流暢,深入淺出。適用於各類學校的C++語言程式設計課程。
目錄
第1章緒論1
1.1電腦程式設計語言的發展1
1.1.1機器語言與彙編語言1
1.1.2高級語言2
1.1.3面向對象的語言2
1.2面向對象的方法2
1.2.1面向對象方法的由來2
1.2.2面向對象的基本概念3
1.3面向對象的軟體開發5
1.3.1分析5
1.3.2設計5
1.3.3編程5
1.3.4測試6
1.3.5維護6
1.4信息的表示與存儲6
1.4.1計算機的數字系統6
1.4.2幾種進位記數制之間的轉換8
1.4.3信息的存儲單位10
1.4.4二進制數的編碼表示11
1.4.5定點數和浮點數14
1.4.6數的表示範圍14
1.4.7非數值信息的表示15
1.5程式開發的基本概念15
1.5.1基本術語15
1.5.2完整的程式過程16
1.6小結17
習題17
第2章C++語言簡單程式設計18
2.1C++語言概述18
2.1.1C++語言的產生18
2.1.2C++語言的特點19
2.1.3C++語言程式實例19
2.1.4字元集20
2.1.5詞法記號20
2.2基本數據類型和表達式22
2.2.1基本數據類型23
2.2.2常量24
2.2.3變數26
2.2.4符號常量28
2.2.5constexpr與常量表達式28
2.2.6運算符與表達式29
2.2.7語句38
2.3數據的輸入與輸出38
2.3.1I/O流38
2.3.2預定義的插入符和提取符38
2.3.3簡單的I/O格式控制39
2.4算法的基本控制結構40
2.4.1用if語句實現選擇結構40
2.4.2多重選擇結構42
2.4.3循環結構45
2.4.4循環結構與選擇結構的嵌套51
2.4.5其他控制語句53
2.5類型別名與類型推斷53
2.5.1類型別名53
2.5.2auto類型與decltype類型54
2.6深度探索55
2.6.1變數的實現機制55
2.6.2C++語言表達式的執行原理58
2.7小結59
習題60
第3章函式64
3.1函式的定義與使用64
3.1.1函式的定義64
3.1.2函式的調用65
3.1.3函式的參數傳遞77
3.2內聯函式82
3.3constexpr函式83
3.4帶默認形參值的函式84
3.5函式重載86
3.6使用C++語言系統函式88
3.7深度探索90
3.7.1運行棧與函式調用的執行90
3.7.2函式聲明與類型安全94
3.8小結95
習題96
第4章類與對象98
4.1面向對象程式設計的基本特點98
4.1.1抽象98
4.1.2封裝99
4.1.3繼承99
4.1.4多態100
4.2類和對象100
4.2.1類的定義101
4.2.2類成員的訪問控制102
4.2.3對象103
4.2.4類的成員函式104
4.2.5程式實例105
4.3構造函式和析構函式107
4.3.1構造函式107
4.3.2默認構造函式109
4.3.3委託構造函式110
4.3.4複製構造函式110
4.3.5析構函式114
4.3.6移動構造函式115
4.3.7default、delete函式116
4.3.8程式實例117
4.4類的組合119
4.4.1組合119
4.4.2前向引用聲明123
4.5UML圖形標識124
4.5.1UML簡介125
4.5.2UML類圖125
4.6結構體和聯合體131
4.6.1結構體131
4.6.2聯合體132
4.7枚舉類型——enum135
4.8綜合實例——個人銀行賬戶管理程式138
4.8.1類的設計138
4.8.2源程式及說明139
4.9深度探索141
4.9.1位域141
4.9.2用構造函式定義類型轉換144
4.9.3對象作為函式參數和返回值的傳遞方式145
4.10小結148
習題148
第5章數據的共享與保護150
5.1標識符的作用域與可見性150
5.1.1作用域150
5.1.2可見性153
5.2對象的生存期153
5.2.1靜態生存期153
5.2.2動態生存期154
5.3類的靜態成員156
5.3.1靜態數據成員157
5.3.2靜態函式成員159
5.4類的友元161
5.4.1友元函式163
5.4.2友元類164
5.5共享數據的保護165
5.5.1常對象165
5.5.2用const修飾的類成員166
5.5.3常引用169
5.6多檔案結構和編譯預處理命令170
5.6.1C++程式的一般組織結構170
5.6.2外部變數與外部函式173
5.6.3標準C++庫174
5.6.4編譯預處理175
5.7綜合實例——個人銀行賬戶管理程式179
5.8深度探索182
5.8.1常成員函式的聲明原則182
5.8.2代碼的編譯、連線與執行過程184
5.9小結187
習題187
第6章數組、指針與字元串189
6.1數組189
6.1.1數組的聲明與使用189
6.1.2數組的存儲與初始化191
6.1.3數組作為函式參數194
6.1.4對象數組195
6.1.5程式實例197
6.2指針200
6.2.1記憶體空間的訪問方式200
6.2.2指針變數的聲明201
6.2.3與地址相關的運算——“”和“&”201
6.2.4指針的賦值202
6.2.5指針運算204
6.2.6用指針處理數組元素206
6.2.7指針數組208
6.2.8用指針作為函式參數210
6.2.9指針型函式211
6.2.10指向函式的指針213
6.2.11對象指針215
6.3動態記憶體分配220
6.4用vector創建數組對象226
6.5深層複製與淺層複製228
6.6字元串231
6.6.1用字元數組存儲和處理字元串231
6.6.2string類232
6.7綜合實例——個人銀行賬戶管理程式236
6.8深度探索242
6.8.1指針與引用242
6.8.2指針的安全性隱患及其應對方案244
6.8.3const_cast的套用247
6.9小結249
習題250
第7章類的繼承252
7.1基類與派生類252
7.1.1繼承關係舉例252
7.1.2派生類的定義253
7.1.3派生類生成過程255
7.2訪問控制256
7.2.1公有繼承257
7.2.2私有繼承259
7.2.3保護繼承261
7.3類型兼容規則263
7.4派生類的構造和析構函式265
7.4.1構造函式265
7.4.2複製構造函式269
7.4.3析構函式269
7.4.4刪除delete構造函式271
7.5派生類成員的標識與訪問271
7.5.1作用域分辨符272
7.5.2虛基類277
7.5.3虛基類及其派生類構造函式279
7.6程式實例——用高斯消去法解線性方程組280
7.6.1算法基本原理281
7.6.2程式設計分析282
7.6.3源程式及說明282
7.6.4運行結果與分析287
7.7綜合實例——個人銀行賬戶管理程式288
7.7.1問題的提出289
7.7.2類設計289
7.7.3源程式及說明290
7.7.4運行結果與分析295
7.8深度探索296
7.8.1組合與繼承296
7.8.2派生類對象的記憶體布局298
7.8.3基類向派生類的轉換及其安全性問題302
7.9小結303
習題304
第8章多態性306
8.1多態性概述306
8.1.1多態的類型306
8.1.2多態的實現306
8.2運算符重載307
8.2.1運算符重載的規則307
8.2.2運算符重載為成員函式308
8.2.3運算符重載為非成員函式312
8.3虛函式315
8.3.1一般虛函式成員316
8.3.2虛析構函式320
8.4純虛函式與抽象類321
8.4.1純虛函式322
8.4.2抽象類322
8.5程式實例——變步長梯形積分算法求解函式的定積分324
8.5.1算法基本原理324
8.5.2程式設計分析326
8.5.3源程式及說明327
8.5.4運行結果與分析329
8.6綜合實例——對個人銀行賬戶管理程式的改進329
8.7深度探索336
8.7.1多態類型與非多態類型336
8.7.2運行時類型識別337
8.7.3虛函式動態綁定的實現原理340
8.8小結343
習題344
第9章模板與群體數據345
9.1函式模板與類模板346
9.1.1函式模板346
9.1.2類模板349
9.2線性群體353
9.2.1線性群體的概念353
9.2.2直接訪問群體——數組類353
9.2.3順序訪問群體——鍊表類362
9.2.4棧類367
9.2.5佇列類373
9.3群體數據的組織376
9.3.1插入排序376
9.3.2選擇排序377
9.3.3交換排序378
9.3.4順序查找380
9.3.5折半查找380
9.4綜合實例——對個人銀行賬戶管理程式的改進381
9.5深度探索384
9.5.1模板的實例化機制384
9.5.2為模板定義特殊的實現387
9.5.3模板元編程簡介392
9.5.4可變參數模板簡介394
9.6小結396
習題396
第10章泛型程式設計與C++語言標準模板庫399
10.1泛型程式設計及STL的結構399
10.1.1泛型程式設計的基本概念399
10.1.2STL簡介400
10.2疊代器403
10.2.1輸入流疊代器和輸出流疊代器404
10.2.2疊代器的分類406
10.2.3疊代器的區間408
10.2.4疊代器的輔助函式410
習題148
第5章數據的共享與保護150
5.1標識符的作用域與可見性150
5.1.1作用域150
5.1.2可見性153
5.2對象的生存期153
5.2.1靜態生存期153
5.2.2動態生存期154
5.3類的靜態成員156
5.3.1靜態數據成員157
5.3.2靜態函式成員159
5.4類的友元161
5.4.1友元函式163
5.4.2友元類164
5.5共享數據的保護165
5.5.1常對象165
5.5.2用const修飾的類成員166
5.5.3常引用169
5.6多檔案結構和編譯預處理命令170
5.6.1C++程式的一般組織結構170
5.6.2外部變數與外部函式173
5.6.3標準C++庫174
5.6.4編譯預處理175
5.7綜合實例——個人銀行賬戶管理程式179
5.8深度探索182
5.8.1常成員函式的聲明原則182
5.8.2代碼的編譯、連線與執行過程184
5.9小結187
習題187
第6章數組、指針與字元串189
6.1數組189
6.1.1數組的聲明與使用189
6.1.2數組的存儲與初始化191
6.1.3數組作為函式參數194
6.1.4對象數組195
6.1.5程式實例197
6.2指針200
6.2.1記憶體空間的訪問方式200
6.2.2指針變數的聲明201
6.2.3與地址相關的運算——“”和“&”201
6.2.4指針的賦值202
6.2.5指針運算204
6.2.6用指針處理數組元素206
6.2.7指針數組208
6.2.8用指針作為函式參數210
6.2.9指針型函式211
6.2.10指向函式的指針213
6.2.11對象指針215
6.3動態記憶體分配220
6.4用vector創建數組對象226
6.5深層複製與淺層複製228
6.6字元串231
6.6.1用字元數組存儲和處理字元串231
6.6.2string類232
6.7綜合實例——個人銀行賬戶管理程式236
6.8深度探索242
6.8.1指針與引用242
6.8.2指針的安全性隱患及其應對方案244
6.8.3const_cast的套用247
6.9小結249
習題250
第7章類的繼承252
7.1基類與派生類252
7.1.1繼承關係舉例252
7.1.2派生類的定義253
7.1.3派生類生成過程255
7.2訪問控制256
7.2.1公有繼承257
7.2.2私有繼承259
7.2.3保護繼承261
7.3類型兼容規則263
7.4派生類的構造和析構函式265
7.4.1構造函式265
7.4.2複製構造函式269
7.4.3析構函式269
7.4.4刪除delete構造函式271
7.5派生類成員的標識與訪問271
7.5.1作用域分辨符272
7.5.2虛基類277
7.5.3虛基類及其派生類構造函式279
7.6程式實例——用高斯消去法解線性方程組280
7.6.1算法基本原理281
7.6.2程式設計分析282
7.6.3源程式及說明282
7.6.4運行結果與分析287
7.7綜合實例——個人銀行賬戶管理程式288
7.7.1問題的提出289
7.7.2類設計289
7.7.3源程式及說明290
7.7.4運行結果與分析295
7.8深度探索296
7.8.1組合與繼承296
7.8.2派生類對象的記憶體布局298
7.8.3基類向派生類的轉換及其安全性問題302
7.9小結303
習題304
第8章多態性306
8.1多態性概述306
8.1.1多態的類型306
8.1.2多態的實現306
8.2運算符重載307
8.2.1運算符重載的規則307
8.2.2運算符重載為成員函式308
8.2.3運算符重載為非成員函式312
8.3虛函式315
8.3.1一般虛函式成員316
8.3.2虛析構函式320
8.4純虛函式與抽象類321
8.4.1純虛函式322
8.4.2抽象類322
8.5程式實例——變步長梯形積分算法求解函式的定積分324
8.5.1算法基本原理324
8.5.2程式設計分析326
8.5.3源程式及說明327
8.5.4運行結果與分析329
8.6綜合實例——對個人銀行賬戶管理程式的改進329
8.7深度探索336
8.7.1多態類型與非多態類型336
8.7.2運行時類型識別337
8.7.3虛函式動態綁定的實現原理340
8.8小結343
習題344
第9章模板與群體數據345
9.1函式模板與類模板346
9.1.1函式模板346
9.1.2類模板349
9.2線性群體353
9.2.1線性群體的概念353
9.2.2直接訪問群體——數組類353
9.2.3順序訪問群體——鍊表類362
9.2.4棧類367
9.2.5佇列類373
9.3群體數據的組織376
9.3.1插入排序376
9.3.2選擇排序377
9.3.3交換排序378
9.3.4順序查找380
9.3.5折半查找380
9.4綜合實例——對個人銀行賬戶管理程式的改進381
9.5深度探索384
9.5.1模板的實例化機制384
9.5.2為模板定義特殊的實現387
9.5.3模板元編程簡介392
9.5.4可變參數模板簡介394
9.6小結396
習題396
第10章泛型程式設計與C++語言標準模板庫399
10.1泛型程式設計及STL的結構399
10.1.1泛型程式設計的基本概念399
10.1.2STL簡介400
10.2疊代器403
10.2.1輸入流疊代器和輸出流疊代器404
10.2.2疊代器的分類406
10.2.3疊代器的區間408
10.2.4疊代器的輔助函式410
10.3容器的基本功能與分類410
10.4順序容器413
10.4.1順序容器的基本功能413
10.4.25種順序容器的特性417
10.4.3順序容器的插入疊代器424
10.4.4順序容器的適配器425
10.5關聯容器429
10.5.1關聯容器的分類及基本功能429
10.5.2集合432
10.5.3映射433
10.5.4多重集合與多重映射436
10.5.5無序容器437
10.6函式對象438
10.6.1函式對象的概念438
10.6.2lambda表達式442
10.6.3函式對象參數綁定444
10.7算法445
10.7.1STL算法基礎446
10.7.2不可變序列算法447
10.7.3可變序列算法449
10.7.4排序和搜尋算法452
10.7.5數值算法457
10.8綜合實例——對個人銀行賬戶管理程式的改進459
10.9深度探索464
10.9.1swap464
10.9.2STL組件的類型特徵與STL的擴展466
10.9.3Boost簡介471
10.10小結474
習題474
第11章流類庫與輸入輸出477
11.1I/O流的概念及流類庫結構477
11.2輸出流479
11.2.1構造輸出流對象479
11.2.2使用插入運算符和操縱符480
11.2.3檔案輸出流成員函式484
11.2.4二進制輸出檔案486
11.2.5字元串輸出流487
11.3輸入流488
11.3.1構造輸入流對象488
11.3.2使用提取運算符489
11.3.3輸入流操縱符489
11.3.4輸入流相關函式489
11.3.5字元串輸入流492
11.4輸入輸出流493
11.5綜合實例——對個人銀行賬戶管理程式的改進494
11.6深度探索499
11.6.1寬字元、寬字元串與寬流499
11.6.2對象的串列化502
11.7小結505
習題505
第12章異常處理507
12.1異常處理的基本思想507
12.2C++異常處理的實現508
12.2.1異常處理的語法508
12.2.2異常接口聲明510
12.3異常處理中的構造與析構510
12.4標準程式庫異常處理512
12.5綜合實例——對個人銀行賬戶管理程式的改進515
12.6深度探索518
12.6.1異常安全性問題518
12.6.2避免異常發生時的資源泄露520
12.6.3noexcept異常說明523
12.7小結523
習題524
參考文獻525
作者簡介
鄭莉,清華大學計算機科學與技術系教授;主講MOOC“C++語言程式設計”、“Java程式設計”;國家精品資源共享課負責人;全國高等學校計算機教育研究會副理事長;全國高等院校計算機基礎教育研究會副會長;全國信息技術標準化技術委員會教育技術分技術委員會秘書長。主要研究方向:計算機教育、教育信息化、軟體工程,主持和參加多項國家863、支撐計畫課題和教育部課題。
主編出版教材20餘部,其中《C++語言程式設計》獲教育部自然科學獎和國家級精品教材稱號。《C++語言程式設計》、《Java語言程式設計》(本MOOC配套教材)為“十二五”普通高等教育本科國家級規劃教材
起草教育信息化相關國家標準5部、國際標準1部。
獲國家級教學成果獎、北京市教學成果獎、教育部自然科學獎、教育部科技進步獎、北京市科技進步獎、電子學會科技進步獎等9項國家級、教育部、北京市獎勵。