圖書簡介
C++是當今最流行的高級程式設計語言之一,常用於編寫性能卓越的企業級面向對象程式,如遊戲或大型商業軟體。但一個無法規避的事實是:C++語法紛繁複雜,學習難度較大。如何才能化繁為簡,全面系統地快速掌握C++知識呢? C++高級編程(第2版) 將為您提供完美答案。這本權威書籍在大量實例的引導下,解密C++中鮮為人知的特性,揭示最新版本C++11帶來的顯著變化,並探討有助於提高代碼質量和編程效率的編程方法、可重用設計模式和良好編程風格。
目錄
第Ⅰ部分專業的C++簡介
第1章C++速成 3
1.1C++基礎知識 3
1.1.1小程式的“helloworld” 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.2C++中的字元串 24
1.2.3引用 25
1.2.4異常 26
1.2.5const的多種用法 27
1.3作為面向對象語言的C++ 28
1.4標準庫 30
1.5第一個有用的C++程式 31
1.5.1雇員記錄系統 31
1.5.2Employee類 32
1.5.3Database類 35
1.5.4用戶界面 38
1.5.5評估程式 40
1.6本章小結 41
第2章設計專業的C++程式 43
2.1程式設計概述 43
2.2程式設計的重要性 44
2.3C++設計的特點 46
2.4C++設計的兩個原則 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.6C++標準庫 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.4Not-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.1Spreadsheet類 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.2const方法 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.1WeatherPrediction類 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.5virtual的真相 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.1const關鍵字 246
9.2.2static關鍵字 250
9.2.3非局部變數的初始化順序 254
9.3類型以及類型轉換 254
9.3.1typedef 254
9.3.2函式指針typedef 255
9.3.3類型別名(僅限C++11) 256
9.3.4類型轉換 257
9.4作用域解析 261
9.5C++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.7C的實用工具 271
9.7.1變長參數列表 271
9.7.2預處理器宏 273
9.8本章小結 274
第10章錯誤處理 275
10.1錯誤與異常 275
10.1.1異常的含義 276
10.1.2C++中異常的優點 276
10.1.3C++中異常的缺點 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.2C++標準庫概述 317
11.2.1字元串 317
11.2.2I/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.13STL算法 326
11.2.14STL中還缺什麼 333
11.3本章小結 333
第12章理解容器與疊代器 335
12.1容器概述 335
12.1.1元素的需求 336
12.1.2異常和錯誤檢查 338
12.1.3疊代器 338
12.1.4C++11的變化 340
12.2順序容器 342
12.3容器適配器 366
12.3.1queue 366
12.3.2priority_queue 369
12.3.3stack 372
12.4關聯容器 373
12.4.1pair工具類 373
12.5無序關聯容器/哈希表(僅限C++11) 387
12.6其他容器 391
12.6.1標準C風格數組 392
12.6.2string 392
12.6.3流 393
12.6.4bitset 393
12.7本章小結 397
第13章掌握STL算法 399
13.1算法概述 399
13.1.1find和find_if算法 400
13.1.2accumulate算法 402
13.1.3在算法中使用C++11的移動語義 404
13.2lambda表達式(僅限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.2auditVoterRolls函式 440
13.5.3getDuplicates函式 441
13.5.4測試auditVoterRolls函式 443
13.6本章小結 443
第14章使用字元串與正則表達式 445
14.1動態字元串 445
14.1.1C風格字元串 446
14.1.2字元串字面量 447
14.1.3C++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.4locale和facet 455
14.3正則表達式(僅限C++11) 457
14.3.1ECMAScript語法 458
14.3.2regex庫 463
14.3.3regex_match() 464
14.3.4regex_search() 467
14.3.5regex_iterator 468
14.3.6regex_token_iterator 469
14.3.7regex_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.1STD::FUNCTION 499
16.2有理數 501
16.3Chrono庫 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.8編寫轉換運算符 588
18.8.1轉換運算符的多義性問題 590
18.8.2用於布爾表達式的轉換 591
18.9重載記憶體分配和釋放運算符 593
18.9.1new和delete的工作原理 593
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.1auto關鍵字 652
20.5.2decltype關鍵字 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.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.3std::call_once 723
22.4.4互斥體的用法示例 724
22.5條件變數 727
22.6future 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.3Rational統一過程 747
23.3軟體工程方法學 748
23.3.1敏捷 748
23.3.2Scrum 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.3C++是不是低效的語言 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使用VisualC++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.2bug的生命周期 800
26.1.3bug跟蹤工具 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.2bug分類學 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.1C++編碼示例 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
附錄AC++面試 897
附錄B帶註解的參考文獻 917
附錄C標準庫頭檔案 927