目 錄
第I部分 專業的C++簡介
第1章 C++和STL速成 3
1.1 C++基礎知識 3
1.1.1 小程序“hello world” 4
1.1.2 名稱空間 6
1.1.3 變量 8
1.1.4 字麵量 9
1.1.5 運算符 9
1.1.6 類型 11
1.1.7 條件 13
1.1.8 數組 16
1.1.9 循環 18
1.1.10 函數 19
1.1.11 類型推斷(上) 21
1.1.12 這些都是基礎 21
1.2 深入研究C++ 21
1.2.1 指針和動態內存 22
1.2.2 引用 26
1.2.3 C++中的字符串 26
1.2.4 異常 27
1.2.5 const的多種用法 28
1.2.6 類型推斷(下) 29
1.3 作為麵嚮對象語言的C++ 30
1.4 標準庫 32
1.5 第一個有用的C++程序 33
1.5.1 雇員記錄係統 33
1.5.2 Employee類 33
1.5.3 Database類 36
1.5.4 用戶界麵 39
1.5.5 評估程序 41
1.6 本章小結 41
第2章 使用字符串 43
2.1 動態字符串 43
2.1.1 C風格的字符串 43
2.1.2 字符串字麵量 45
2.1.3 C++ string類 46
2.1.4 原始字符串字麵量 49
2.1.5 非標準字符串 50
2.2 本章小結 50
第3章 編碼風格 51
3.1 良好外觀的重要性 51
3.1.1 事先考慮 51
3.1.2 良好風格的元素 52
3.2 為代碼編寫文檔 52
3.2.1 使用注釋的原因 52
3.2.2 注釋的風格 55
3.2.3 本書的注釋 59
3.3 分解 59
3.3.1 通過重構分解 59
3.3.2 通過設計分解 60
3.3.3 本書中的分解 60
3.4 命名 60
3.4.1 選擇恰當的名稱 60
3.4.2 命名約定 61
3.5 使用具有風格的語言特性 63
3.5.1 使用常量 63
3.5.2 使用引用代替指針 63
3.5.3 使用自定義異常 64
3.6 格式 64
3.6.1 關於大括號對齊的爭論 64
3.6.2 關於空格和圓括號的爭論 65
3.6.3 空格和製錶符 66
3.7 風格的挑戰 66
3.8 本章小結 66
第II部分 專業的C++軟件設計
第4章 設計專業的C++程序 69
4.1 程序設計概述 69
4.2 程序設計的重要性 70
4.3 C++設計的特點 72
4.4 C++設計的兩個原則 73
4.4.1 抽象 73
4.4.2 重用 74
4.5 重用代碼 75
4.5.1 關於術語的說明 76
4.5.2 決定是否重用代碼 76
4.5.3 重用代碼的策略 78
4.5.4 綁定第三方應用程序 82
4.5.5 開放源代碼庫 82
4.5.6 C++標準庫 83
4.6 設計模式和技巧 84
4.7 設計一個國際象棋程序 84
4.7.1 需求 84
4.7.2 設計步驟 85
4.8 本章小結 88
第5章 麵嚮對象設計 91
5.1 過程化的思考方式 91
5.2 麵嚮對象思想 92
5.2.1 類 92
5.2.2 組件 92
5.2.3 屬性 93
5.2.4 行為 93
5.2.5 綜閤考慮 93
5.3 生活在對象世界裏 94
5.5.1 過度使用對象 94
5.5.2 過於通用的對象 95
5.4 對象之間的關係 96
5.4.1 “有一個”關係 96
5.4.2 “是一個”關係(繼承) 97
5.4.3 “有一個”與“是一個”的區彆 98
5.4.4 Not-a關係 101
5.4.5 層次結構 101
5.4.6 多重繼承 102
5.4.7 混入類 103
5.5 抽象 104
5.5.1 接口與實現 104
5.5.2 決定公開的接口 104
5.5.3 設計成功的抽象 106
5.6 本章小結 106
第6章 設計可重用代碼 107
6.1 重用哲學 107
6.2 如何設計可重用的代碼 108
6.2.1 使用抽象 108
6.2.2 構建理想的重用代碼 109
6.2.3 設計有用的接口 113
6.2.4 協調通用性和使用性 116
6.3 本章小結 117
第III部分 專業的C++編碼方法
第7章 熟悉類和對象 121
7.1 電子錶格示例介紹 121
7.2 編寫類 122
7.2.1 類定義 122
7.2.2 定義方法 124
7.2.3 使用對象 127
7.3 對象的生命周期 129
7.3.1 創建對象 129
7.3.2 銷毀對象 143
7.3.3 對象賦值 144
7.3.4 復製和賦值的區彆 147
7.4 本章小結 148
第8章 掌握類與對象 149
8.1 對象的動態內存分配 149
8.1.1 Spreadsheet類 149
8.1.2 使用析構函數釋放內存 151
8.1.3 處理復製和賦值 152
8.2 不同的數據成員類型 158
8.2.1 靜態數據成員 158
8.2.2 常量數據成員 159
8.2.3 引用數據成員 160
8.2.4 常量引用數據成員 161
8.3 與方法有關的更多內容 162
8.3.1 靜態方法 162
8.3.2 const方法 162
8.3.3 方法重載 164
8.3.4 默認參數 165
8.3.5 內聯方法 166
8.4 嵌套類 167
8.5 類內的枚舉類型 168
8.6 友元 169
8.7 運算符重載 170
8.7.1 示例:為SpreadsheetCell實現加法 170
8.7.2 重載算術運算符 174
8.7.3 重載比較運算符 176
8.7.4 創建具有運算符重載的類型 178
8.8 創建穩定的接口 178
8.9 本章小結 181
第9章 揭秘繼承技術 183
9.1 使用繼承構建類 183
9.1.1 擴展類 184
9.1.2 重寫方法 187
9.2 使用繼承重用代碼 190
9.2.1 WeatherPrediction類 190
9.2.2 在派生類中添加功能 191
9.2.3 在派生類中替換功能 192
9.3 利用父類 193
9.3.1 父類構造函數 193
9.3.2 父類的析構函數 194
9.3.3 使用父類方法 196
9.3.4 嚮上轉型和嚮下轉型 198
9.4 繼承與多態性 199
9.4.1 迴到電子錶格 199
9.4.2 設計多態性的電子錶格單元格 200
9.4.3 電子錶格單元格的基類 200
9.4.4 獨立的派生類 202
9.4.5 利用多態性 204
9.4.6 考慮將來 205
9.5 多重繼承 206
9.5.1 從多個類繼承 206
9.5.2 名稱衝突和歧義基類 207
9.6 有趣而晦澀的繼承問題 210
9.6.1 修改重寫方法的特徵 210
9.6.2 繼承的構造函數 214
9.6.3 重寫方法時的特殊情況 217
9.6.4 派生類中的復製構造函數和賦值運算符 223
9.6.5 virtual的真相 224
9.6.6 運行時類型工具 227
9.6.7 非public繼承 228
9.6.8 虛基類 228
9.7 本章小結 229
第10章 理解靈活而奇特的C++ 231
10.1 引用 231
10.1.1 引用變量 232
10.1.2 引用數據成員 233
10.1.3 引用參數 234
10.1.4 引用作為返迴值 235
10.1.5 使用引用還是指針 235
10.1.6 右值引用 238
10.2 關鍵字的疑問 242
10.2.1 const關鍵字 243
10.2.2 static關鍵字 246
10.2.3 非局部變量的初始化順序 249
10.2.4 非局部變量的銷毀順序 249
10.3 類型和類型轉換 250
10.3.1 typedef 250
10.3.2 函數指針typedef 251
10.3.3 類型彆名 251
10.3.4 類型轉換 252
10.4 作用域解析 256
10.5 C++11/C++14 257
10.5.1 統一初始化 257
10.5.2 初始化列錶 258
10.5.3 顯式轉換運算符 259
10.5.4 特性 260
10.5.5 用戶定義的字麵量 260
10.6 頭文件 262
10.7 C的實用工具 263
10.7.1 變長參數列錶 263
10.7.2 預處理器宏 265
10.8 本章小結 266
第11章 利用模闆編寫泛型代碼 267
11.1 模闆概述 268
11.2 類模闆 268
11.2.1 編寫類模闆 268
11.2.2 尖括號 275
11.2.3 編譯器處理模闆的原理 275
11.2.4 將模闆代碼分布在多個文件中 276
11.2.5 模闆參數 278
11.2.6 方法模闆 280
11.2.7 模闆類特例化 284
11.2.8 從類模闆派生 286
11.2.9 繼承還是特例化 287
11.2.10 模闆彆名 287
11.2.11 替換函數語法 288
11.3 函數模闆 289
11.3.1 函數模闆特例化 290
11.3.2 函數模闆重載 291
11.3.3 類模闆的friend函數模闆 292
11.4 可變模闆 293
11.5 本章小結 293
第12章 C++ I/O揭秘 295
12.1 使用流 295
12.1.1 流的含義 296
12.1.2 流的來源和目標 296
12.1.3 流式輸齣 297
12.1.4 流式輸入 301
12.1.5 對象的輸入輸齣 306
12.2 字符串流 308
12.3 文件流 309
12.3.1 通過seek()和tell()在文件中轉移 310
12.3.2 將流連接在一起 312
12.4 雙嚮I/O 312
12.5 本章小結 314
第13章 錯誤處理 315
13.1 錯誤與異常 315
13.1.1 異常的含義 316
13.1.2 C++中異常的優點 316
13.1.3 C++中異常的缺點 317
13.1.4 我們的建議 317
13.2 異常機製 317
13.2.1 拋齣並捕獲異常 318
13.2.2 異常類型 321
13.2.3 拋齣並捕獲多個異常 322
13.2.4 未捕獲的異常 325
13.2.5 拋齣列錶 326
13.3 異常與多態性 330
13.3.1 標準異常體係 330
13.3.2 在類層次結構中捕獲異常 332
13.3.3 編寫自己的異常類 333
13.3.4 嵌套異常 335
13.4 堆棧的釋放與清理 337
13.4.1 使用智能指針 338
13.4.2 捕獲、清理並重新拋齣 339
13.5 常見的錯誤處理問題 339
13.5.1 內存分配錯誤 339
13.5.2 構造函數中的錯誤 342
13.5.3 構造函數的function-
try-blocks 343
13.5.4 析構函數中的錯誤 345
13.6 綜閤應用 346
13.7 本章小結 350
第14章 C++運算符重載 351
14.1 運算符重載概述 351
14.1.1 重載運算符的原因 352
14.1.2 運算符重載的限製 352
14.1.3 運算符重載的選擇 352
14.1.4 不要重載的運算符 354
14.1.5 可重載運算符小結 354
14.1.6 右值引用 357
14.1.7 關係運算符 358
14.2 重載算術運算符 358
14.2.1 重載一元負號和一元正號 358
14.2.2 重載遞增和遞減運算符 359
14.3 重載按位運算符和二元邏輯運算符 360
14.4 重載插入運算符和提取運算符 360
14.5 重載下標運算符 362
14.5.1 通過operator[]提供隻讀訪問 364
14.5.2 非整數數組索引 365
14.6 重載函數調用運算符 366
14.7 重載解除引用運算符 367
14.7.1 實現operator* 368
14.7.2 實現operator-> 369
14.7.3 operator ->*的含義 369
14.8 編寫轉換運算符 370
14.8.1 轉換運算符的多義性問題 371
14.8.2 用於布爾錶達式的轉換 372
14.9 重載內存分配和釋放運算符 373
14.9.1 new和delete的工作原理 374
14.9.2 重載operator new和operator delete 375
14.9.3 顯式地刪除/默認化operator new和operator delete 377
14.9.4 重載帶有額外參數的operator new和operator delete 377
14.10 本章小結 379
第15章 C++標準庫概述 381
15.1 編碼原則 382
15.1.1 使用模闆 382
15.1.2 使用運算符重載 382
15.2 C++標準庫概述 382
15.2.1 字符串 382
15.2.2 正則錶達式 382
15.2.3 I/O流 383
15.2.4 智能指針 383
15.2.5 異常 383
15.2.6 數學工具 383
15.2.7 時間工具 384
15.2.8 隨機數 384
15.2.9 初始化列錶 384
15.2.10 Pair 和Tuple 384
15.2.11 函數對象 384
15.2.12 多綫程 384
15.2.13 類型特質 385
15.2.14 標準模闆庫 385
15.3 本章小結 397
第16章 理解容器與迭代器 399
16.1 容器概述 399
16.1.1 對元素的要求 400
16.1.2 異常和錯誤檢查 401
16.1.3 迭代器 401
16.2 順序容器 404
16.2.1 vector 404
16.2.2 vector<bool>特化 420
16.2.3 deque 420
16.2.4 list 421
16.2.5 forward_list 424
16.2.6 array 426
16.3 容器適配器 427
16.3.1 queue 427
16.3.2 priority_queue 429
16.3.3 stack 432
16.4 關聯容器 432
16.4.1 pair工具類 432
16.4.2 map 433
16.4.3 multimap 439
16.4.4 set 442
16.4.5 multiset 444
16.5 無序關聯容器/哈希錶 444
16.5.1 哈希函數 444
16.5.2 unordered_map 446
16.5.3 unordered_multimap 449
16.5.4 unordered_set/unordered_multiset 449
16.6 其他容器 449
16.6.1 標準C風格數組 449
16.6.2 string 450
16.6.3 流 451
16.6.4 bitset 451
16.7 本章小結 455
第17章 掌握STL算法 457
17.1 算法概述 457
17.1.1 find和find_if算法 458
17.1.2 accumulate算法 460
17.1.3 在算法中使用移動語義 461
17.2 lambda錶達式 461
17.2.1 語法 462
17.2.2 泛型Lambda錶達式 464
17.2.3 Lambda捕捉錶達式 464
17.2.4 將Lambda錶達式用作返迴值 465
17.2.5 將Lambda錶達式用作參數 466
17.2.6 STL算法示例 466
17.3 函數對象 467
17.3.1 算術函數對象 468
17.3.2 透明運算符仿函數 468
17.3.3 比較函數對象 469
17.3.4 邏輯函數對象 470
17.3.5 按位函數對象 470
17.3.6 函數對象適配器 470
17.3.7 編寫自己的函數對象 474
17.4 算法詳解 475
17.4.1 迭代器 475
17.4.2 非修改序列算法 476
17.4.3 修改序列算法 480
17.4.4 操作算法 486
17.4.5 分區算法 487
17.4.6 排序算法 488
17.4.7 二叉樹搜索算法 489
17.4.8 集閤算法 489
17.4.9 最大/最小算法 491
17.4.10 數值處理算法 492
17.5 算法示例:審核選民登記 493
17.5.1 選民登記審核問題描述 493
17.5.2 auditVoterRolls函數 493
17.5.3 getDuplicates函數 494
17.5.4 測試auditVoterRolls函數 495
17.6 本章小結 496
第18章 字符串本地化與正則錶達式 497
18.1 本地化 497
18.1.1 本地化字符串字麵量 497
18.1.2 寬字符 498
18.1.3 非西方字符集 498
18.1.4 locale和facet 500
18.2 正則錶達式 502
18.2.1 ECMAScript語法 503
18.2.2 regex庫 507
18.2.3 regex_match() 508
18.2.4 regex_search() 510
18.2.5 regex_iterator 512
18.2.6 regex_token_iterator 513
18.2.7 regex_replace() 515
18.3 本章小結 517
第19章 其他庫工具 519
19.1 std::function 519
19.2 有理數 521
19.3 Chrono庫 523
19.3.1 持續時間 523
19.3.2 時鍾 526
19.3.3 時點 528
19.4 生成隨機數 529
19.4.1 隨機數引擎 530
19.4.2 隨機數引擎適配器 531
19.4.3 預定義的引擎和引擎適配器 532
19.4.4 生成隨機數 532
19.4.5 隨機數分布 533
19.5 元組 536
19.6 本章小結 539
第IV部分 掌握C++的高級特性
第20章 自定義和擴展STL 543
20.1 分配器 543
20.2 迭代器適配器 544
20.2.1 反嚮迭代器 544
20.2.2 流迭代器 545
20.2.3 插入迭代器 546
20.2.4 移動迭代器 547
20.3 擴展STL 548
20.3.1 擴展STL的原因 549
20.3.2 編寫STL算法 549
20.3.3 編寫STL容器 551
20.4 本章小結 582
第21章 模闆的高級特性 583
21.1 深入瞭解模闆參數 583
21.1.1 深入瞭解模闆類型參數 583
21.1.2 模闆參數模闆介紹 586
21.1.3 深入瞭解非類型模闆參數 587
21.2 模闆類部分特例化 589
21.3 通過重載模擬函數部分特例化 592
21.4 模闆遞歸 593
21.4.1 N維網格:初次嘗試 593
21.4.2 真正的N維網格 595
21.5 類型推導 597
21.6 可變參數模闆 600
21.6.1 類型安全的可變長度參數列錶 600
21.6.2 可變數目的混入類 602
21.7 元編程 603
21.7.1 編譯時階乘 603
21.7.2 循環展開 604
21.7.3 打印元組 605
21.7.4 類型trait 607
21.7.5 結論 612
21.8 本章小結 612
第22章 內存管理 613
22.1 使用動態內存 614
22.1.1 如何描繪內存 614
22.1.2 分配和釋放 615
22.1.3 數組 616
22.1.4 使用指針 622
22.2 數組-指針的對偶性 624
22.2.1 數組就是指針 624
22.2.2 並非所有的指針都是數組 626
22.3 低級內存操作 626
22.3.1 指針運算 626
22.3.2 自定義內存管理 627
22.3.3 垃圾迴收 627
22.3.4 對象池 628
22.3.5 函數指針 628
22.3.6 方法和數據成員的指針 630
22.4 智能指針 630
22.4.1 舊的過時的auto_ptr 631
22.4.2 shared_ptr和unique_ptr智能指針 631
22.5 內存常見的陷阱 636
22.5.1 分配不足的字符串 637
22.5.2 訪問內存越界 637
22.5.3 內存泄漏 638
22.5.4 雙重刪除和無效指針 640
22.6 本章小結 641
第23章 C++多綫程編程 643
23.1 簡介 643
23.1.1 競爭條件 645
23.1.2 死鎖 646
23.1.3 撕裂 647
23.1.4 緩存的一緻性 647
23.2 綫程 647
23.2.1 通過函數指針創建綫程 647
23.2.2 通過函數對象創建綫程 649
23.2.3 通過lambda創建綫程 650
23.2.4 通過成員函數創建綫程 651
23.2.5 綫程本地存儲 651
23.2.6 取消綫程 652
23.2.7 從綫程獲得結果 652
23.2.8 復製和重新拋齣異常 652
23.3 原子操作庫 654
23.3.1 原子類型示例 655
23.3.2 原子操作 657
23.4 互斥 658
23.4.1 互斥體類 658
23.4.2 鎖 660
23.4.3 std::call_once 661
23.4.4 互斥體的用法示例 663
23.5 條件變量 665
23.6 future 667
23.7 異常處理 669
23.8 示例:多綫程日誌記錄器類 669
23.9 綫程池 673
23.10 綫程設計和最佳實踐 674
23.11 本章小結 675
第V部分 C++軟件工程
第24章 充分利用軟件工程方法 679
24.1 過程的必要性 679
24.2 軟件生命周期模型 680
24.2.1 分段模型和瀑布模型 680
24.2.2 螺鏇模型 683
24.2.3 Rational統一過程 685
24.3 軟件工程方法學 686
24.3.1 敏捷 686
24.3.2 Scrum 686
24.3.3 極限編程 688
24.3.4 軟件分流 691
24.4 構建自己的過程和方法 691
24.4.1 對新思想采取開放態度 692
24.4.2 提齣新想法 692
24.4.3 知道什麼行得通什麼行不通 692
24.4.4 不要逃避 692
24.5 源代碼控製 692
24.6 本章小結 694
第25章 編寫高效的C++程序 695
25.1 性能和效率概述 695
25.1.1 提升效率的兩種方式 696
25.1.2 兩種程序 696
25.1.3 C++是不是低效的語言 696
25.2 語言層次的效率 696
25.2.1 高效地操縱對象 697
25.2.2 使用內聯方法和函數 700
25.3 設計層次的效率 700
25.3.1 盡可能多地緩存 701
25.3.2 使用對象池 701
25.4 剖析 705
25.4.1 使用gprof的剖析範例 705
25.4.2 使用Visual C++ 2013的剖析範例 713
25.5 本章小結 716
第26章 熟練掌握調試技術 717
26.1 調試的基本定律 717
26.2 bug分類學 718
26.3 避免bug 718
26.4 為bug做好規劃 719
26.4.1 錯誤日誌 719
26.4.2 調試跟蹤 720
26.4.3 斷言 727
26.4.4 靜態斷言 728
26.4.5 崩潰轉儲 729
26.5 調試技術 729
26.5.1 重現bug 729
26.5.2 調試可重復的bug 730
26.5.3 調試不可重現的bug 730
26.5.4 調試退化 731
26.5.5 調試內存問題 731
26.5.6 調試多綫程程序 735
26.5.7 調試示例:文章引用 736
26.5.8 從ArticleCitations示例中總結的教訓 746
26.6 本章小結 747
附錄A C++麵試 749
附錄B 帶注解的參考文獻 767
附錄C 標準庫頭文件 777
· · · · · · (
收起)