第1章 引論 1
1.1 C++程序概貌 1
1.1.1 編寫第一個C++程序 2
1.1.2 程序釋義 3
1.2 面向對象的基本概念 5
1.2.1 對象 5
1.2.2 面向對象方法的核心概念 8
1.2.3 面向對象分析、設計和程序設計 8
第2章 C++:一個更好的C 10
2.1 基礎類型 10
2.1.1 增強的字面常量 10
2.1.2 bool類型 12
2.1.3 強類型枚舉 12
2.2 地址類型 14
2.2.1 指針類型 14
2.2.2 引用類型 16
2.3 類型自動推導 19
2.3.1 decltype關鍵字 19
2.3.2 auto關鍵字 20
2.4 運算符和表達式 20
2.4.1 C++特有的運算符 20
2.4.2 lambda表達式 23
2.5 控制結構和語句 25
2.6 異常處理及語句 26
2.6.1 異常以及異常拋出 26
2.6.2 try…catch語句 26
2.7 函數(shù) 30
2.7.1 函數(shù)的類型 30
2.7.2 函數(shù)的參數(shù) 30
2.7.3 函數(shù)的返回值 33
2.7.4 函數(shù)重載 37
2.7.5 回調函數(shù) 38
2.8 復雜類型聲明的簡化 40
2.9 名字空間 41
2.9.1 名字空間的定義 42
2.9.2 using聲明和using指令 42
2.9.3 嵌套的名字空間 43
第3章 類:面向對象的基石 44
3.1 案例—鏈表的實現(xiàn) 44
3.1.1 案例及其實現(xiàn) 44
3.1.2 案例問題分析 49
3.2 類 49
3.2.1 定義類類型和類對象 49
3.2.2 訪問控制和數(shù)據封裝 56
3.2.3 類的靜態(tài)成員 60
3.2.4 struct和union 62
3.2.5 聚集與組合 62
3.3 類對象的構造、初始化和析構 63
3.3.1 類的構造函數(shù) 64
3.3.2 構造函數(shù)重載 67
3.3.3 統(tǒng)一初始化 69
3.3.4 析構函數(shù) 70
3.3.5 默認和被刪除的成員函數(shù) 71
3.4 案例的完整解決方案 72
3.5 面向對象方法的應用 74
3.5.1 面向對象分析 75
3.5.2 面向對象設計 76
3.5.3 編碼實現(xiàn) 77
第4章 類的高級特性 80
4.1 案例—鏈表類的復制問題 80
4.1.1 案例及其實現(xiàn) 80
4.1.2 案例問題分析 84
4.2 復制控制 85
4.2.1 復制 85
4.2.2 賦值 86
4.2.3 淺復制和深復制 87
4.2.4 轉移對象和轉移語義 90
4.2.5 禁止復制 94
4.3 指向類成員的指針 95
4.4 友元 96
4.4.1 友元函數(shù)和友元類 96
4.4.2 友元關系的特性 98
4.5 類的const成員和mutable成員 99
4.5.1 類的const成員 99
4.5.2 類的mutable成員 100
4.6 類中的類型名 100
4.6.1 類中的類類型 100
4.6.2 類中的枚舉類型 101
4.6.3 類中的typedef和using 102
4.6.4 typename關鍵字 102
4.7 案例的完整解決方案 102
第5章 運算符重載 106
5.1 案例分析—complex類及
其常規(guī)運算 106
5.1.1 案例及其實現(xiàn) 106
5.1.2 案例問題分析 107
5.2 運算符函數(shù)重載 108
5.2.1 重載運算符函數(shù)的考慮因素 108
5.2.2 運算符函數(shù)重載的一般性規(guī)則 112
5.3 常用運算符的重載 114
5.3.1 重載賦值運算符 114
5.3.2 重載算術運算符 115
5.3.3 重載關系運算符 119
5.3.4 重載流式輸入運算符>>和
輸出<<運算符 119
5.4 類型轉換 121
5.4.1 標量類型向類類型轉換 121
5.4.2 類類型向標量類型轉換 122
5.4.3 類類型向類類型轉換 123
5.5 重載特殊運算符 124
5.5.1 下標運算符[] 125
5.5.2 指針運算符*和成員選擇
運算符?> 129
5.5.3 函數(shù)調用運算符() 132
第6章 繼承 135
6.1 案例—四邊形家族的類描述 135
6.1.1 案例及其實現(xiàn) 135
6.1.2 案例問題分析 137
6.2 繼承和派生 139
6.2.1 定義基類和派生類 139
6.2.2 繼承的實現(xiàn)機制 141
6.2.3 基類子對象的初始化 142
6.2.4 基類成員的繼承 144
6.2.5 重新定義基類成員 147
6.3 賦值兼容原則 148
6.3.1 派生類和基類對象間的賦值 148
6.3.2 引用作用于派生類和基類對象 148
6.3.3 指針作用于派生類和基類對象 149
6.4 多繼承 150
6.4.1 多繼承的語法 150
6.4.2 虛繼承和虛基類 151
6.4.3 多繼承面臨的其他問題 152
6.5 繼承的前提:正確的分類 153
6.5.1 案例—基于角色的分類 154
6.5.2 案例存在的問題 155
6.5.3 案例的改進方案 156
第7章 多態(tài) 159
7.1 案例分析—賦值兼容原則的
進一步應用 159
7.1.1 案例及其實現(xiàn) 159
7.1.2 案例問題分析 160
7.2 多態(tài)的概念 161
7.2.1 靜態(tài)多態(tài)性 161
7.2.2 動態(tài)多態(tài)性 162
7.3 虛函數(shù):實現(xiàn)多態(tài)的關鍵 162
7.3.1 虛函數(shù)的聲明和覆蓋 162
7.3.2 虛函數(shù)的實現(xiàn)原理 167
7.3.3 虛析構函數(shù) 169
7.4 純虛函數(shù)和抽象類 170
7.4.1 純虛函數(shù) 170
7.4.2 抽象類 171
第8章 模板 174
8.1 案例分析—類型帶來的困擾 174
8.1.1 案例的設計與實現(xiàn) 174
8.1.2 案例問題分析 178
8.2 變量模板 179
8.2.1 定義和使用變量模板 179
8.2.2 變量模板的特化 180
8.3 函數(shù)模板 181
8.3.1 定義和使用函數(shù)模板 181
8.3.2 函數(shù)模板的重載和特化 183
8.3.3 完美轉發(fā) 184
8.3.4 折疊表達式 185
8.4 類模板 187
8.4.1 定義和使用類模板 188
8.4.2 類模板的特化 191
8.4.3 類模板的友元 191
8.4.4 類模板的繼承和派生 192
8.4.5 類模板的變長模板參數(shù) 192
8.4.6 類模板性能的改進 194
8.5 模板的別名 196
8.6 traits技術 198
8.6.1 特性萃取 198
8.6.2 類型萃取 200
8.6.3 隨之而來的問題 202
8.7 模板元編程初探 204
8.7.1 模板遞歸 204
8.7.2 奇異遞歸模板模式 205
第9章 容器、迭代器和
泛型算法 207
9.1 案例分析—鏈表類的遍歷 207
9.1.1 案例的設計與實現(xiàn) 208
9.1.2 案例問題分析 209
9.2 容器的迭代器 210
9.2.1 迭代器的結構設計 210
9.2.2 迭代器的實現(xiàn) 211
9.3 泛型算法 217
9.3.1 只用到迭代器的泛型算法 217
9.3.2 帶更多參數(shù)的泛型算法 218
9.3.3 只讀算法和寫算法 220
9.3.4 泛型算法返回值類型的考慮 221
9.3.5 iterator traits 222
9.4 C++標準模板庫STL 224
9.4.1 C++的標準容器類 224
9.4.2 C++的標準泛型算法和
可調用對象 224
9.4.3 C++的標準iterator庫 225
第10章 多線程 226
10.1 案例分析—順序執(zhí)行的局限 226
10.1.1 案例的設計與實現(xiàn) 226
10.1.2 案例問題分析 226
10.2 關鍵概念 227
10.2.1 異步 227
10.2.2 進程和線程 227
10.2.3 共享和互斥 228
10.2.4 鎖和死鎖 228
10.3 C++的多線程庫 229
10.3.1 頭文件 229
10.3.2 頭文件 232
10.3.3 頭文件 234
10.3.4 頭文件 236
10.4 多線程編程示例 239
10.4.1 系統(tǒng)簡要分析 239
10.4.2 系統(tǒng)設計 240
10.4.3 系統(tǒng)實現(xiàn) 241
第11章 面向對象設計的原則 244
11.1 單一職責原則 244
11.2 開閉原則 247
11.3 聚集與組合復用原則 248
11.4 里氏替換原則 248
11.5 依賴倒置原則 249
11.6 接口隔離原則 251
11.7 最少知識原則 252
第12章 C++程序設計案例 257
12.1 案例描述 257
12.2 系統(tǒng)分析 258
12.2.1 MVC設計模式
簡介 258
12.2.2 系統(tǒng)的用例模型 259
12.3 系統(tǒng)設計 259
12.3.1 系統(tǒng)體系結構設計 259
12.3.2 對象設計 260
12.3.3 用戶界面設計 263
12.4 系統(tǒng)實現(xiàn) 263
附錄A C++關鍵字 274
附錄B 常用運算符的優(yōu)先級和
結合性 275
附錄C 使用不同的C++編譯器 276
C.1 使用GNU GCC for Linux 276
C.2 使用MinGW 277
C.3 使用Visual Studio 2017(VS 2017) 277
C.4 使用Clang 278
參考文獻 280