《c++高級編程(第2版)》
第ⅰ部分 專業的c++簡介
第1章 c++速成 3
1.1 c++基礎知識 3
1.1.1 小程序的“hello world” 3
1.1.2 名稱空間 6
1.1.3 變量 8
1.1.4 運算符 9
1.1.5 類型 12
1.1.6 條件 14
1.1.7 循環 16
1.1.8 數組 18
1.1.9 函數 19
1.2 深入研究c++ 21
1.2.1 指針以及動態內存 21
1.2.2 c++中的字符串 24
1.2.3 引用 25
1.2.4 異常 26
1.2.5 const的多種用法 27
1.3 作為麵嚮對象語言的c++ 28
.1.4 標準庫 30
1.5 第一個有用的c++程序 31
1.5.1 雇員記錄係統 31
1.5.2 employee類 32
1.5.3 database類 35
1.5.4 用戶界麵 38
1.5.5 評估程序 40
1.6 本章小結 41
第2章 設計專業的c++程序 43
2.1 程序設計概述 43
2.2 程序設計的重要性 44
2.3 c++設計的特點 46
2.4 c++設計的兩個原則 47
2.4.1 抽象 47
2.4.2 重用 48
2.5 重用代碼 49
2.5.1 關於術語的說明 50
2.5.2 決定是否重用代碼 50
2.5.3 重用代碼的策略 52
2.5.4 綁定第三方應用程序 56
2.5.5 開放源代碼庫 56
2.5.6 c++標準庫 57
2.6 設計模式以及技巧 58
2.7 設計一個國際象棋程序 58
2.7.1 需求 58
2.7.2 設計步驟 59
2.8 本章小結 63
第3章 麵嚮對象設計 65
3.1 過程化的思考方式 65
3.2 麵嚮對象思想 66
3.2.1 類 66
3.2.2 組件 66
3.2.3 屬性 67
3.2.4 行為 67
3.2.5 綜閤考慮 67
3.3 生活在對象世界裏 68
3.3.1 過度使用對象 69
3.3.2 過於通用的對象 69
3.4 對象之間的關係 70
3.4.1 “有一個”關係 70
3.4.2 “是一個”關係(繼承) 71
3.4.3 “有一個”與“是一個”的區彆 73
3.4.4 not-a關係 75
3.4.5 層次結構 76
3.4.6 多重繼承 77
3.4.7 混入類 78
3.5 抽象 78
3.5.1 接口與實現 78
3.5.2 決定公開的接口 78
3.5.3 設計成功的抽象 80
3.6 本章小結 81
第4章 設計可重用代碼 83
4.1 重用哲學 83
4.2 如何設計可重用的代碼 84
4.2.1 使用抽象 84
4.2.2 構建理想的重用代碼 85
4.2.3 設計有用的接口 89
4.2.4 協調通用性以及使用性 92
4.3 本章小結 93
第5章 編碼風格 95
5.1 良好外觀的重要性 95
5.1.1 事先考慮 95
5.1.2 良好風格的元素 96
5.2 為代碼編寫文檔 96
5.2.1 使用注釋的原因 96
5.2.2 注釋的風格 99
5.2.3 本書的注釋 103
5.3 分解 103
5.3.1 通過重構分解 104
5.3.2 通過設計分解 104
5.3.3 本書中的分解 104
5.4 命名 104
5.4.1 選擇一個恰當的名稱 105
5.4.2 命名約定 105
5.5 使用具有風格的語言特性 107
5.5.1 使用常量 108
5.5.2 使用引用代替指針 108
5.5.3 使用自定義異常 108
5.6 格式 109
5.6.1 關於大括號對齊的爭論 109
5.6.2 關於空格以及圓括號的爭論 110
5.6.3 空格以及製錶符 110
5.7 風格的挑戰 110
5.8 本章小結 111
第ⅱ部分 專業的c++編碼方法
第6章 熟悉類和對象 115
6.1 電子錶格示例介紹 115
6.2 編寫類 116
6.2.1 類定義 116
6.2.2 定義方法 118
6.2.3 使用對象 122
6.3 對象的生命周期 123
6.3.1 創建對象 124
6.3.2 銷毀對象 139
6.3.3 對象賦值 140
6.3.4 復製以及賦值的區彆 142
6.4 本章小結 144
第7章 掌握類與對象 145
7.1 對象的動態內存分配 145
7.1.1 spreadsheet類 146
7.1.2 使用析構函數釋放內存 147
7.1.3 處理復製以及賦值 148
7.2 定義數據成員的類型 155
7.2.1 靜態數據成員 155
7.2.2 常量數據成員 157
7.2.3 引用數據成員 158
7.2.4 常量引用數據成員 159
7.3 與方法有關的更多內容 159
7.3.1 靜態方法 159
7.3.2 const方法 160
7.3.3 方法重載 162
7.3.4 默認參數 163
7.3.5 內聯方法 164
7.4 嵌套類 165
7.5 類內的枚舉類型 167
7.6 友元 168
7.7 運算符重載 169
7.7.1 示例:為spreadsheetcell
實現加法 169
7.7.2 重載算術運算符 174
7.7.3 重載比較運算符 176
7.7.4 創建具有運算符重載的類型 177
7.8 創建穩定的接口 178
7.9 本章小結 181
第8章 揭秘繼承技術 183
8.1 使用繼承構建類 183
8.1.1 擴展類 184
8.1.2 重寫方法 187
8.2 使用繼承重用代碼 190
8.2.1 weatherprediction類 190
8.2.2 在子類中添加功能 191
8.2.3 在子類中替換功能 192
8.3 利用父類 193
8.3.1 父類構造函數 193
8.3.2 父類的析構函數 195
8.3.3 使用父類方法 196
8.3.4 嚮上轉型以及嚮下轉型 198
8.4 繼承與多態性 200
8.4.1 迴到電子錶格 200
8.4.2 設計多態性的電子錶格單元格 200
8.4.3 電子錶格單元格的基類 201
8.4.4 獨立的子類 203
8.4.5 利用多態性 205
8.4.6 考慮將來 206
8.5 多重繼承 207
8.5.1 從多個類繼承 207
8.5.2 名稱衝突以及歧義基類 208
8.6 有趣而晦澀的繼承問題 211
8.6.1 修改重寫方法的特徵 211
8.6.2 繼承構造函數(僅限c++11) 215
8.6.3 重寫方法時的特殊情況 218
8.6.4 子類中的復製構造函數以及賦值運算符 224
8.6.5 virtual的真相 225
8.6.6 運行時類型工具 228
8.6.7 非public繼承 229
8.6.8 虛基類 230
8.7 本章小結 231
第9章 理解靈活而奇特的c++ 233
9.1 引用 233
9.1.1 引用變量 234
9.1.2 引用數據成員 236
9.1.3 引用參數 236
9.1.4 引用作為返迴值 238
9.1.5 使用引用還是指針 238
9.1.6 右值引用(僅限c++11) 241
9.2 關鍵字的疑問 246
9.2.1 const關鍵字 246
9.2.2 static關鍵字 250
9.2.3 非局部變量的初始化順序 254
9.3 類型以及類型轉換 254
9.3.1 typedef 254
9.3.2 函數指針typedef 255
9.3.3 類型彆名(僅限c++11) 256
9.3.4 類型轉換 257
9.4 作用域解析 261
9.5 c++11 262
9.5.1 統一初始化 262
9.5.2 可選函數語法 264
9.5.3 空指針文本 265
9.5.4 尖括號 265
9.5.5 初始化列錶 266
9.5.6 顯式轉換運算符 266
9.5.7 特性 267
9.5.8 用戶定義的字麵量 268
9.6 頭文件 270
9.7 c的實用工具 271
9.7.1 變長參數列錶 271
9.7.2 預處理器宏 273
9.8 本章小結 274
第10章 錯誤處理 275
10.1 錯誤與異常 275
10.1.1 異常的含義 276
10.1.2 c++中異常的優點 276
10.1.3 c++中異常的缺點 277
10.1.4 我們的建議 277
10.2 異常機製 277
10.2.1 拋齣並捕獲異常 278
10.2.2 異常類型 281
10.2.3 拋齣並捕獲多個異常 283
10.2.4 未捕獲的異常 285
10.2.5 拋齣列錶 287
10.3 異常與多態性 291
10.3.1 標準異常體係 291
10.3.2 在類層次結構中捕獲異常 293
10.3.3 編寫自己的異常類 294
10.3.4 嵌套異常(僅限c++11) 297
10.4 堆棧的釋放與清理 299
10.4.1 使用智能指針 300
10.4.2 捕獲、清理並重新拋齣 301
10.5 常見的錯誤處理問題 301
10.5.1 內存分配錯誤 301
10.5.2 構造函數中的錯誤 304
10.5.3 構造函數的function-try-blocks 306
10.5.4 析構函數中的錯誤 308
10.6 綜閤應用 308
10.7 本章小結 312
第11章 深入探討標準庫 313
11.1 編碼原則 314
11.1.1 使用模闆 314
11.1.2 使用運算符重載 317
11.2 c++標準庫概述 317
11.2.1 字符串 317
11.2.2 i/o流 318
11.2.3 本地化 318
11.2.4 智能指針 318
11.2.5 異常 318
11.2.6 數學工具 319
11.2.7 時間工具(僅限c++11) 319
11.2.8 隨機數(僅限c++11) 319
11.2.9 編譯時有理數運算(僅限c++11) 319
11.2.10 元組(僅限c++11)319
11.2.11 正則錶達式(僅限c++11) 320
11.2.12 標準模闆庫 320
11.2.13 stl算法 326
11.2.14 stl中還缺什麼 333
11.3 本章小結 333
第12章 理解容器與迭代器 335
12.1 容器概述 335
12.1.1 元素的需求 336
12.1.2 異常和錯誤檢查 338
12.1.3 迭代器 338
12.1.4 c++11的變化 340
12.2 順序容器 342
12.2.1 vector 342
12.2.2 vector[bool]特化 359
12.2.3 deque 359
12.2.4 list 360
12.2.5 array(僅限c++11) 364
12.2.6 forward_list(僅限c++11) 364
12.3 容器適配器 366
12.3.1 queue 366
12.3.2 priority_queue 369
12.3.3 stack 372
12.4 關聯容器 373
12.4.1 pair工具類 373
12.4.2 map 374
12.4.3 multimap 382
12.4.4 set 385
12.4.5 multiset 387
12.5 無序關聯容器/哈希錶(僅限c++11) 387
12.5.1 哈希函數 387
12.5.2 unordered_map 388
12.5.3 unordered_multimap 391
12.5.4 unordered_set/unordered_ multiset 391
12.6 其他容器 391
12.6.1 標準c風格數組 392
12.6.2 string 392
12.6.3 流 393
12.6.4 bitset 393
12.7 本章小結 397
第13章 掌握stl算法 399
13.1 算法概述 399
13.1.1 find和find_if算法 400
13.1.2 accumulate算法 402
13.1.3 在算法中使用c++11的移動語義 404
13.2 lambda錶達式(僅限c++11) 404
13.2.1 語法 404
13.2.2 捕捉塊 406
13.2.3 將lambda錶達式用作返迴值 406
13.2.4 將lambda錶達式用作參數 407
13.2.5 示例 408
13.3 函數對象 410
13.3.1 算術函數對象 410
13.3.2 比較函數對象 411
13.3.3 邏輯函數對象 412
13.3.4 按位函數對象(僅限c++11) 412
13.3.5 函數對象適配器 413
13.3.6 編寫自己的函數對象 419
13.4 算法詳解 420
13.4.1 工具算法 421
13.4.2 非修改算法 422
13.4.3 修改算法 428
13.4.4 排序算法 436
13.4.5 集閤算法 438
13.5 算法示例:審核選民登記 440
13.5.1 選民登記審核問題描述 440
13.5.2 auditvoterrolls函數 440
13.5.3 getduplicates函數 441
13.5.4 測試auditvoterrolls函數 443
13.6 本章小結 443
第14章 使用字符串與正則錶達式 445
14.1 動態字符串 445
14.1.1 c風格字符串 446
14.1.2 字符串字麵量 447
14.1.3 c++ string類 448
14.1.4 原始字符串字麵量(僅限c++11) 451
14.2 本地化 452
14.2.1 本地化字符串字麵量 452
14.2.2 寬字符 453
14.2.3 非西方字符集 453
14.2.4 locale和facet 455
14.3 正則錶達式(僅限c++11) 457
14.3.1 ecmascript語法 458
14.3.2 regex庫 463
14.3.3 regex_match() 464
14.3.4 regex_search() 467
14.3.5 regex_iterator 468
14.3.6 regex_token_iterator 469
14.3.7 regex_replace() 472
14.4 本章小結 475
第15章 c++ i/o揭秘 477
15.1 使用流 477
15.1.1 流的含義 478
15.1.2 流的來源和目標 478
15.1.3 流式輸齣 479
15.1.4 流式輸入 483
15.1.5 對象的輸入輸齣 489
15.2 字符串流 491
15.3 文件流 492
15.3.1 通過seek()和tell()在文件中轉移 493
15.3.2 將流連接在一起 495
15.4 雙嚮i/o 496
15.5 本章小結 497
第16章 其他庫工具 499
16.1 std::function 499
16.2 有理數 501
16.3 chrono庫 503
16.3.1 持續時間 503
16.3.2 時鍾 507
16.3.3 時點 508
16.4 生成隨機數 509
16.4.1 隨機數引擎 510
16.4.2 隨機數引擎適配器 512
16.4.3 預定義的引擎和引擎適配器 512
16.4.4 生成隨機數 513
16.4.5 隨機數分布 514
16.5 元組 517
16.6 本章小結 520
第17章 自定義和擴展stl 521
17.1 分配器 521
17.2 迭代器適配器 522
17.2.1 反嚮迭代器 522
17.2.2 流迭代器 524
17.2.3 插入迭代器 524
17.2.4 移動迭代器(僅限c++11) 525
17.3 擴展stl 527
17.3.1 擴展stl的原因 527
17.3.2 編寫一個stl算法 527
17.3.3 編寫一個stl容器 530
17.4 本章小結 564
第ⅲ部分 掌握c++的高級特性
第18章 c++運算符重載 567
18.1 運算符重載概述 567
18.1.1 重載運算符的原因 568
18.1.2 運算符重載的限製 568
18.1.3 運算符重載的決策 568
18.1.4 不要重載的運算符 570
18.1.5 可重載運算符小結 571
18.1.6 右值引用(僅限c++11) 574
18.2 重載算術運算符 574
18.2.1 重載一元負號和一元正號 574
18.2.2 重載遞增和遞減運算符 575
18.3 重載按位運算符和二元邏輯運算符 577
18.4 重載插入運算符和提取運算符 577
18.5 重載下標運算符 579
18.5.1 通過operator[]提供隻讀訪問 582
18.5.2 非整數數組索引 583
18.6 重載函數調用運算符 583
18.7 重載解除引用運算符 585
18.7.1 實現operator* 586
18.7.2 實現operator-] 587
18.7.3 operator -]*的含義 588
18.8 編寫轉換運算符 588
18.8.1 轉換運算符的多義性問題 590
18.8.2 用於布爾錶達式的轉換 591
18.9 重載內存分配和釋放運算符 593
18.9.1 new和delete的工作原理 593
18.9.2 重載operator new和operator delete 595
18.9.3 重載帶有額外參數的operator new和operator delete 597
18.9.4 顯式地刪除/默認化operator new和operator delete(僅限c++11) 599
18.10 本章小結 599
第19章 利用模闆編寫泛型代碼 601
19.1 模闆概述 602
19.2 類模闆 602
19.2.1 編寫類模闆 602
19.2.2 編譯器處理模闆的原理 610
19.2.3 將模闆代碼分布在多個文件中 611
19.2.4 模闆參數 612
19.2.5 方法模闆 614
19.2.6 模闆類特例化 619
19.2.7 子類化模闆類 622
19.2.8 繼承還是特例化 623
19.2.9 模闆彆名(僅限c++11) 623
19.2.10 替換函數語法(僅限c++11) 624
19.3 函數模闆 625
19.3.1 函數模闆特例化 626
19.3.2 函數模闆重載 627
19.3.3 類模闆的friend函數模闆 628
19.4 本章小結 629
第20章 模闆的高級特性 631
20.1 深入瞭解模闆參數 631
20.1.1 深入瞭解模闆類型參數 631
20.1.2 模闆參數模闆介紹 635
20.1.3 深入瞭解非類型模闆參數 636
20.2 模闆類部分特例化 639
20.3 通過重載模擬函數部分特例化 643
20.4 模闆遞歸 645
20.4.1 一個n維網格:初次嘗試 645
20.4.2 一個真正的n維網格 647
20.5 類型推導(僅限c++11) 652
20.5.1 auto關鍵字 652
20.5.2 decltype關鍵字 653
20.5.3 結閤模闆使用auto和decltype 653
20.6 可變參數模闆(僅限c++11) 655
20.6.1 類型安全的可變長度參數列錶 656
20.6.2 可變數目的混入類 658
20.7 元編程 659
20.7.1 編譯時階乘 659
20.7.2 循環展開 660
20.7.3 打印元組(僅限c++11) 661
20.7.4 類型trait(僅限c++11) 663
20.7.5 結論 668
20.8 本章小結 668
第21章 高效的內存管理 669
21.1 使用動態內存 669
21.1.1 如何描繪內存 670
21.1.2 分配和釋放 671
21.1.3 數組 672
21.1.4 使用指針 679
21.2 數組-指針的對偶性 681
21.2.1 數組就是指針 681
21.2.2 並非所有的指針都是數組 682
21.3 低級內存操作 683
21.3.1 指針運算 683
21.3.2 自定義內存管理 684
21.3.3 垃圾迴收 684
21.3.4 對象池 685
21.3.5 函數指針 685
21.3.6 方法和成員的指針 687
21.4 智能指針 687
21.4.1 舊的過時的auto_ptr 688
21.4.2 新的c++11智能指針 688
21.4.3 編寫自己的智能指針類 692
21.5 內存常見的陷阱 697
21.5.1 分配不足的字符串 697
21.5.2 內存泄漏 698
21.5.3 雙重刪除和無效指針 701
21.5.4 訪問內存越界 701
21.6 本章小結 702
第22章 c++多綫程編程 703
22.1 簡介 703
22.2 原子操作庫 707
22.2.1 原子類型示例 708
22.2.2 原子操作 710
22.3 綫程 711
22.3.1 通過函數指針創建綫程 712
22.3.2 通過函數對象創建綫程 714
22.3.3 通過lambda創建綫程 715
22.3.4 通過成員函數創建綫程 716
22.3.5 綫程本地存儲 717
22.3.6 取消綫程 717
22.3.7 從綫程獲得結果 717
22.3.8 復製和重新拋齣異常 717
22.4 互斥 720
22.4.1 互斥體類 720
22.4.2 鎖 721
22.4.3 std::call_once 723
22.4.4 互斥體的用法示例 724
22.5 條件變量 727
22.6 future 729
22.7 示例:多綫程日誌記錄器類 731
22.8 綫程池 736
22.9 綫程設計和最佳實踐 737
22.10 本章小結 738
第ⅳ部分 c++軟件工程
第23章 充分利用軟件工程方法 741
23.1 過程的必要性 741
23.2 軟件生命周期模型 742
23.2.1 分段模型和瀑布模型 742
23.2.2 螺鏇模型 745
23.2.3 rational統一過程 747
23.3 軟件工程方法學 748
23.3.1 敏捷 748
23.3.2 scrum 748
23.3.3 極限編程(xp) 750
23.3.4 軟件分流 754
23.4 構建自己的過程和方法 754
23.4.1 對新思想采取開放態度 754
23.4.2 提齣新想法 754
23.4.3 知道什麼行得通什麼行不通 754
23.4.4 不要逃避 755
23.5 源代碼控製 755
23.6 本章小結 757
第24章 編寫高效的c++程序 759
24.1 性能和效率概述 759
24.1.1 提升效率的兩種方式 760
24.1.2 兩種程序 760
24.1.3 c++是不是低效的語言 760
24.2 語言層次的效率 761
24.2.1 高效地操縱對象 761
24.2.2 使用內聯方法和函數 765
24.3 設計層次的效率 765
24.3.1 盡可能多地緩存 765
24.3.2 使用對象池 766
24.4 剖析 770
24.4.1 使用gprof的剖析範例 770
24.4.2 使用visual c++ 2010的剖析範例 778
24.5 本章小結 780
第25章 開發跨平颱和跨語言的應用程序 781
25.1 跨平颱開發 781
25.1.1 硬件架構問題 782
25.1.2 實現問題 783
25.1.3 平颱相關的特性 784
25.2 跨語言開發 785
25.2.1 混閤使用c和c++ 785
25.2.2 轉移範例 786
25.2.3 和c代碼鏈接 788
25.2.4 混閤使用c#與c++ 790
25.2.5 通過jni混閤java和c++ 791
25.2.6 混閤c++使用perl和shell腳本 794
25.2.7 混閤使用c++和匯編代碼 797
25.3 本章小結 798
第26章 成為測試專傢 799
26.1 質量控製 800
26.1.1 測試是誰的職責 800
26.1.2 bug的生命周期 800
26.1.3 bug跟蹤工具 801
26.2 單元測試 802
26.2.1 單元測試的方法 803
26.2.2 單元測試過程 803
26.2.3 單元測試實例 807
26.3 更高級彆的測試 813
26.3.1 集成測試 813
26.3.2 係統測試 815
26.3.3 迴歸測試 815
26.4 成功測試的技巧 816
26.5 本章小結 816
第27章 熟練掌握調試技術 819
27.1 調試的基本定律 819
27.2 bug分類學 820
27.3 避免bug 820
27.4 為bug做好規劃 820
27.4.1 錯誤日誌 821
27.4.2 調試跟蹤 822
27.4.3 斷言 833
27.4.4 靜態斷言(僅限c++11) 834
27.5 調試技術 835
27.5.1 重現bug 835
27.5.2 調試可重復的bug 836
27.5.3 調試不可重現的bug 836
27.5.4 調試內存問題 837
27.5.5 調試多綫程程序 841
27.5.6 調試示例:文章引用 841
27.5.7 從articlecitations示例中總結的教訓 853
27.6 本章小結 853
第28章 將設計技術和框架結閤使用 855
28.1 c++編碼示例 856
28.1.1 編寫一個類 856
28.1.2 子類化已有的類 857
28.1.3 拋齣和捕獲異常 858
28.1.4 從文件中讀取 858
28.1.5 寫入文件 859
28.1.6 寫一個模闆類 859
28.2 肯定有更好的方法 860
28.2.1 雙分派 861
28.2.2 混入類 866
28.3 麵嚮對象的框架 868
28.3.1 使用框架 868
28.3.2 模型-視圖-控製器範例 869
28.4 本章小結 870
第29章 應用設計模式 871
29.1 迭代器模式 872
29.2 單實例模式 872
29.2.1 示例:一種日誌機製 873
29.2.2 實現一個單實例 873
29.2.3 使用一個單實例 877
29.2.4 單實例模式和多綫程 877
29.3 工廠模式 880
29.3.1 示例:汽車工廠模擬 880
29.3.2 實現一個工廠 882
29.3.3 使用一個工廠 884
29.3.4 工廠的其他用途 885
29.4 代理模式 885
29.4.1 示例:隱藏網絡連接的問題 885
29.4.2 實現一個代理 886
29.4.3 使用代理 886
29.5 適配器模式 887
29.5.1 示例:適配一個logger類 887
29.5.2 實現一個適配器 888
29.5.3 使用適配器 888
29.6 裝飾器模式 889
29.6.1 示例:在網頁中定義樣式 889
29.6.2 裝飾器的實現 890
29.6.3 使用一個裝飾器 891
29.7 責任鏈模式 892
29.7.1 示例:事件處理 892
29.7.2 責任鏈的實現 892
29.7.3 責任鏈的使用 893
29.8 觀察者模式 894
29.8.1 示例:事件處理 894
29.8.2 觀察者的實現 894
29.8.3 使用觀察者 895
29.9 本章小結 896
附錄a c++麵試 897
附錄b 帶注解的參考文獻 917
附錄c 標準庫頭文件 927
· · · · · · (
收起)