第1章 預備知識 1
1.1 C++簡介 1
1.2 C++簡史 2
1.2.1 C語言 2
1.2.2 C語言編程原理 2
1.2.3 麵嚮對象編程 3
1.2.4 C++和泛型編程 3
1.2.5 C++的起源 4
1.3 可移植性和標準 5
1.3.1 C++的發展 5
1.3.2 本書遵循的C++標準 6
1.4 程序創建的技巧 6
1.4.1 創建源代碼文件 6
1.4.2 編譯和鏈接 7
1.5 總結 10
第2章 開始學習C++ 11
2.1 進入C++ 11
2.1.1 main( )函數 12
2.1.2 C++注釋 14
2.1.3 C++預處理器和iostream文件 14
2.1.4 頭文件名 15
2.1.5 名稱空間 15
2.1.6 使用cout進行C++輸齣 16
2.1.7 C++源代碼的格式化 17
2.2 C++語句 18
2.2.1 聲明語句和變量 19
2.2.2 賦值語句 20
2.2.3 cout的新花樣 20
2.3 其他C++語句 21
2.3.1 使用cin 21
2.3.2 使用cout進行拼接 21
2.3.3 類簡介 22
2.4 函數 23
2.4.1 使用有返迴值的函數 23
2.4.2 函數變體 25
2.4.3 用戶定義的函數 26
2.4.4 用戶定義的有返迴值的函數 28
2.4.5 在多函數程序中使用using編譯指令 29
2.5 總結 30
2.6 復習題 30
2.7 編程練習 30
第3章 處理數據 32
3.1 簡單變量 32
3.1.1 變量名 33
3.1.2 整型 34
3.1.3 整型short、int、long和long long 34
3.1.4 無符號類型 37
3.1.5 選擇整型類型 38
3.1.6 整型字麵值 39
3.1.7 C++如何確定常量的類型 40
3.1.8 char類型:字符和小整數 41
3.1.9 bool類型 46
3.2 const限定符 46
3.3 浮點數 47
3.3.1 書寫浮點數 47
3.3.2 浮點類型 48
3.3.3 浮點常量 49
3.3.4 浮點數的優缺點 49
3.4 C++算術運算符 50
3.4.1 運算符優先級和結閤性 51
3.4.2 除法分支 51
3.4.3 求模運算符 52
3.4.4 類型轉換 53
3.4.5 C++11中的auto聲明 56
3.5 總結 57
3.6 復習題 57
3.7 編程練習 58
第4章 復閤類型 59
4.1 數組 59
4.1.1 程序說明 61
4.1.2 數組的初始化規則 61
4.1.3 C++11數組初始化方法 62
4.2 字符串 62
4.2.1 拼接字符串常量 63
4.2.2 在數組中使用字符串 63
4.2.3 字符串輸入 64
4.2.4 每次讀取一行字符串輸入 65
4.2.5 混閤輸入字符串和數字 67
4.3 string類簡介 68
4.3.1 C++11字符串初始化 69
4.3.2 賦值、拼接和附加 69
4.3.3 string類的其他操作 70
4.3.4 string類I/O 71
4.3.5 其他形式的字符串字麵值 72
4.4 結構簡介 73
4.4.1 在程序中使用結構 74
4.4.2 C++11結構初始化 75
4.4.3 結構可以將string類作為成員嗎 75
4.4.4 其他結構屬性 76
4.4.5 結構數組 77
4.4.6 結構中的位字段 78
4.5 共用體 78
4.6 枚舉 79
4.6.1 設置枚舉量的值 80
4.6.2 枚舉的取值範圍 80
4.7 指針和自由存儲空間 80
4.7.1 聲明和初始化指針 82
4.7.2 指針的危險 84
4.7.3 指針和數字 84
4.7.4 使用new來分配內存 84
4.7.5 使用delete釋放內存 86
4.7.6 使用new來創建動態數組 86
4.8 指針、數組和指針算術 88
4.8.1 程序說明 89
4.8.2 指針小結 90
4.8.3 指針和字符串 92
4.8.4 使用new創建動態結構 94
4.8.5 自動存儲、靜態存儲和動態存儲 96
4.9 類型組閤 97
4.10 數組的替代品 99
4.10.1 模闆類vector 99
4.10.2 模闆類array(C++11) 99
4.10.3 比較數組、vector對象和array對象 99
4.11 總結 101
4.12 復習題 101
4.13 編程練習 102
第5章 循環和關係錶達式 104
5.1 for循環 104
5.1.1 for循環的組成部分 105
5.1.2 迴到for循環 109
5.1.3 修改步長 110
5.1.4 使用for循環訪問字符串 110
5.1.5 遞增運算符(++)和遞減運算符(−−) 111
5.1.6 副作用和順序點 112
5.1.7 前綴格式和後綴格式 112
5.1.8 遞增/遞減運算符和指針 112
5.1.9 組閤賦值運算符 113
5.1.10 復閤語句(語句塊) 113
5.1.11 其他語法技巧——逗號運算符 115
5.1.12 關係錶達式 116
5.1.13 賦值、比較和可能犯的錯誤 117
5.1.14 C-風格字符串的比較 118
5.1.15 比較string類字符串 120
5.2 while循環 120
5.2.1 for與while 121
5.2.2 等待一段時間:編寫延時循環 123
5.3 do while循環 124
5.4 基於範圍的for循環(C++11) 125
5.5 循環和文本輸入 125
5.5.1 使用原始的cin進行輸入 126
5.5.2 使用cin.get(char)進行補救 126
5.5.3 使用哪一個cin.get( ) 127
5.5.4 文件尾條件 128
5.5.5 另一個cin.get( )版本 129
5.6 嵌套循環和二維數組 131
5.6.1 初始化二維數組 132
5.6.2 使用二維數組 133
5.7 總結 134
5.8 復習題 134
5.9 編程練習 135
第6章 分支語句和邏輯運算符 137
6.1 if語句 137
6.1.1 if else語句 138
6.1.2 格式化if else語句 139
6.1.3 if else if else結構 140
6.2 邏輯錶達式 141
6.2.1 邏輯OR運算符:|| 141
6.2.2 邏輯AND運算符:&& 142
6.2.3 用&&來設置取值範圍 144
6.2.4 邏輯NOT運算符:! 145
6.2.5 邏輯運算符細節 146
6.2.6 其他錶示方式 146
6.3 字符函數庫cctype 147
6.4 ?:運算符 148
6.5 switch語句 149
6.5.1 將枚舉量用作標簽 151
6.5.2 switch和if else 152
6.6 break和continue語句 153
6.7 讀取數字的循環 154
6.8 簡單文件輸入/輸齣 157
6.8.1 文本I/O和文本文件 157
6.8.2 寫入到文本文件中 158
6.8.3 讀取文本文件 160
6.9 總結 163
6.10 復習題 163
6.11 編程練習 165
第7章 函數——C++的編程模塊 167
7.1 復習函數的基本知識 167
7.1.1 定義函數 168
7.1.2 函數原型和函數調用 169
7.2 函數參數和按值傳遞 171
7.2.1 多個參數 172
7.2.2 另一個接受兩個參數的函數 174
7.3 函數和數組 175
7.3.1 函數如何使用指針來處理數組 176
7.3.2 將數組作為參數意味著什麼 176
7.3.3 更多數組函數示例 178
7.3.4 使用數組區間的函數 181
7.3.5 指針和const 182
7.4 函數和二維數組 185
7.5 函數和C-風格字符串 186
7.5.1 將C-風格字符串作為參數的函數 186
7.5.2 返迴C-風格字符串的函數 187
7.6 函數和結構 188
7.6.1 傳遞和返迴結構 188
7.6.2 另一個處理結構的函數示例 189
7.6.3 傳遞結構的地址 192
7.7 函數和string對象 194
7.8 函數與array對象 195
7.9 遞歸 196
7.9.1 包含一個遞歸調用的遞歸 196
7.9.2 包含多個遞歸調用的遞歸 197
7.10 函數指針 198
7.10.1 函數指針的基礎知識 199
7.10.2 函數指針示例 200
7.10.3 深入探討函數指針 201
7.10.4 使用typedef進行簡化 204
7.11 總結 204
7.12 復習題 205
7.13 編程練習 206
第8章 函數探幽 208
8.1 C++內聯函數 208
8.2 引用變量 210
8.2.1 創建引用變量 210
8.2.2 將引用用作函數參數 212
8.2.3 引用的屬性和特彆之處 214
8.2.4 將引用用於結構 216
8.2.5 將引用用於類對象 220
8.2.6 對象、繼承和引用 222
8.2.7 何時使用引用參數 224
8.3 默認參數 225
8.4 函數重載 227
8.4.1 重載示例 228
8.4.2 何時使用函數重載 230
8.5 函數模闆 230
8.5.1 重載的模闆 232
8.5.2 模闆的局限性 233
8.5.3 顯式具體化 234
8.5.4 實例化和具體化 236
8.5.5 編譯器選擇使用哪個函數版本 237
8.5.6 模闆函數的發展 241
8.6 總結 243
8.7 復習題 243
8.8 編程練習 244
第9章 內存模型和名稱空間 246
9.1 單獨編譯 246
9.2 存儲持續性、作用域和鏈接性 250
9.2.1 作用域和鏈接 250
9.2.2 自動存儲持續性 250
9.2.3 靜態持續變量 253
9.2.4 靜態持續性、外部鏈接性 254
9.2.5 靜態持續性、內部鏈接性 257
9.2.6 靜態存儲持續性、無鏈接性 258
9.2.7 說明符和限定符 260
9.2.8 函數和鏈接性 261
9.2.9 語言鏈接性 262
9.2.10 存儲方案和動態分配 262
9.3 名稱空間 266
9.3.1 傳統的C++名稱空間 266
9.3.2 新的名稱空間特性 267
9.3.3 名稱空間示例 271
9.3.4 名稱空間及其前途 274
9.4 總結 274
9.5 復習題 275
9.6 編程練習 276
第10章 對象和類 278
10.1 過程性編程和麵嚮對象編程 278
10.2 抽象和類 279
10.2.1 類型是什麼 279
10.2.2 C++中的類 280
10.2.3 實現類成員函數 283
10.2.4 使用類 285
10.2.5 修改實現 286
10.2.6 小結 287
10.3 類的構造函數和析構函數 288
10.3.1 聲明和定義構造函數 288
10.3.2 使用構造函數 289
10.3.3 默認構造函數 290
10.3.4 析構函數 290
10.3.5 改進Stock類 291
10.3.6 構造函數和析構函數小結 296
10.4 this指針 296
10.5 對象數組 300
10.6 類作用域 302
10.6.1 作用域為類的常量 302
10.6.2 作用域內枚舉(C++11) 303
10.7 抽象數據類型 304
10.8 總結 307
10.9 復習題 307
10.10 編程練習 308
第11章 使用類 310
11.1 運算符重載 310
11.2 計算時間:一個運算符重載示例 311
11.2.1 添加加法運算符 313
11.2.2 重載限製 315
11.2.3 其他重載運算符 316
11.3 友元 318
11.3.1 創建友元 319
11.3.2 常用的友元:重載<<運算符 320
11.4 重載運算符:作為成員函數還是非成員函數 324
11.5 再談重載:一個矢量類 324
11.5.1 使用狀態成員 329
11.5.2 為Vector類重載算術運算符 331
11.5.3 對實現的說明 332
11.5.4 使用Vector類來模擬隨機漫步 332
11.6 類的自動轉換和強製類型轉換 334
11.6.1 轉換函數 338
11.6.2 轉換函數和友元函數 341
11.7 總結 343
11.8 復習題 344
11.9 編程練習 344
第12章 類和動態內存分配 346
12.1 動態內存和類 346
12.1.1 復習示例和靜態類成員 346
12.1.2 特殊成員函數 352
12.1.3 迴到Stringbad:復製構造函數的哪裏齣瞭問題 354
12.1.4 Stringbad的其他問題:賦值運算符 356
12.2 改進後的新String類 357
12.2.1 修訂後的默認構造函數 357
12.2.2 比較成員函數 358
12.2.3 使用中括號錶示法訪問字符 359
12.2.4 靜態類成員函數 360
12.2.5 進一步重載賦值運算符 360
12.3 在構造函數中使用new時應注意的事項 364
12.3.1 應該和不應該 365
12.3.2 包含類成員的類的逐成員復製 365
12.4 有關返迴對象的說明 366
12.4.1 返迴指嚮const對象的引用 366
12.4.2 返迴指嚮非const對象的引用 366
12.4.3 返迴對象 367
12.4.4 返迴const對象 367
12.5 使用指嚮對象的指針 368
12.5.1 再談new和delete 369
12.5.2 指針和對象小結 370
12.5.3 再談定位new運算符 371
12.6 復習各種技術 374
12.6.1 重載<<運算符 374
12.6.2 轉換函數 375
12.6.3 其構造函數使用new的類 375
12.7 隊列模擬 375
12.7.1 隊列類 376
12.7.2 Customer類 382
12.7.3 ATM模擬 384
12.8 總結 387
12.9 復習題 388
12.10 編程練習 389
第13章 類繼承 392
13.1 一個簡單的基類 393
13.1.1 派生一個類 394
13.1.2 構造函數:訪問權限的考慮 395
13.1.3 使用派生類 397
13.1.4 派生類和基類之間的特殊關係 398
13.2 繼承:is-a關係 400
13.3 多態公有繼承 400
13.4 靜態聯編和動態聯編 409
13.4.1 指針和引用類型的兼容性 409
13.4.2 虛成員函數和動態聯編 411
13.4.3 有關虛函數注意事項 412
13.5 訪問控製:protected 414
13.6 抽象基類 415
13.6.1 應用ABC概念 416
13.6.2 ABC理念 421
13.7 繼承和動態內存分配 421
13.7.1 第一種情況:派生類不使用new 421
13.7.2 第二種情況:派生類使用new 422
13.7.3 使用動態內存分配和友元的繼承示例 423
13.8 類設計迴顧 427
13.8.1 編譯器生成的成員函數 427
13.8.2 其他的類方法 428
13.8.3 公有繼承的考慮因素 429
13.8.4 類函數小結 432
13.9 總結 433
13.10 復習題 433
13.11 編程練習 434
第14章 C++中的代碼重用 436
14.1 包含對象成員的類 436
14.1.1 valarray類簡介 437
14.1.2 Student類的設計 437
14.1.3 Student類示例 438
14.2 私有繼承 443
14.2.1 Student類示例(新版本) 443
14.2.2 使用包含還是私有繼承 447
14.2.3 保護繼承 448
14.2.4 使用using重新定義訪問權限 448
14.3 多重繼承 449
14.3.1 有多少Worker 452
14.3.2 哪個方法 455
14.3.3 MI小結 461
14.4 類模闆 462
14.4.1 定義類模闆 462
14.4.2 使用模闆類 464
14.4.3 深入探討模闆類 465
14.4.4 數組模闆示例和非類型參數 469
14.4.5 模闆多功能性 470
14.4.6 模闆的具體化 473
14.4.7 成員模闆 474
14.4.8 將模闆用作參數 476
14.4.9 模闆類和友元 477
14.4.10 模闆彆名(C++11) 482
14.5 總結 482
14.6 復習題 483
14.7 編程練習 484
第15章 友元、異常和其他 488
15.1 友元 488
15.1.1 友元類 488
15.1.2 友元成員函數 492
15.1.3 其他友元關係 494
15.1.4 共同的友元 495
15.2 嵌套類 495
15.2.1 嵌套類和訪問權限 496
15.2.2 模闆中的嵌套 497
15.3 異常 499
15.3.1 調用abort() 500
15.3.2 返迴錯誤碼 500
15.3.3 異常機製 501
15.3.4 將對象用作異常類型 504
15.3.5 異常規範和C++11 506
15.3.6 棧解退 506
15.3.7 其他異常特性 510
15.3.8 exception類 511
15.3.9 異常、類和繼承 514
15.3.10 異常何時會迷失方嚮 517
15.3.11 有關異常的注意事項 519
15.4 RTTI 520
15.4.1 RTTI的用途 520
15.4.2 RTTI的工作原理 521
15.5 類型轉換運算符 526
15.6 總結 528
15.7 復習題 528
15.8 編程練習 529
第16章 string類和標準模闆庫 530
16.1 string類 530
16.1.1 構造字符串 530
16.1.2 string類輸入 533
16.1.3 使用字符串 535
16.1.4 string還提供瞭哪些功能 538
16.1.5 字符串種類 539
16.2 智能指針模闆類 539
16.2.1 使用智能指針 540
16.2.2 有關智能指針的注意事項 542
16.2.3 unique_ptr為何優於auto_ptr 543
16.2.4 選擇智能指針 545
16.3 標準模闆庫 545
16.3.1 模闆類vector 546
16.3.2 可對矢量執行的操作 547
16.3.3 對矢量可執行的其他操作 550
16.3.4 基於範圍的for循環(C++11) 553
16.4 泛型編程 553
16.4.1 為何使用迭代器 553
16.4.2 迭代器類型 556
16.4.3 迭代器層次結構 557
16.4.4 概念、改進和模型 558
16.4.5 容器種類 562
16.4.6 關聯容器 568
16.4.7 無序關聯容器(C++11) 572
16.5 函數對象 572
16.5.1 函數符概念 573
16.5.2 預定義的函數符 575
16.5.3 自適應函數符和函數適配器 576
16.6 算法 577
16.6.1 算法組 578
16.6.2 算法的通用特徵 578
16.6.3 STL和string類 579
16.6.4 函數和容器方法 579
16.6.5 使用STL 581
16.7 其他庫 583
16.7.1 vector、valarray和array 583
16.7.2 模闆initializer_list(C++11) 586
16.7.3 使用initializer_list 587
16.8 總結 588
16.9 復習題 589
16.10 編程練習 590
第17章 輸入、輸齣和文件 592
17.1 C++輸入和輸齣概述 592
17.1.1 流和緩衝區 593
17.1.2 流、緩衝區和iostream文件 594
17.1.3 重定嚮 596
17.2 使用cout進行輸齣 597
17.2.1 重載的<<運算符 597
17.2.2 其他ostream方法 598
17.2.3 刷新輸齣緩衝區 600
17.2.4 用cout進行格式化 601
17.3 使用cin進行輸入 611
17.3.1 cin>>如何檢查輸入 612
17.3.2 流狀態 613
17.3.3 其他istream類方法 616
17.3.4 其他istream方法 620
17.4 文件輸入和輸齣 622
17.4.1 簡單的文件I/O 623
17.4.2 流狀態檢查和is_open() 625
17.4.3 打開多個文件 625
17.4.4 命令行處理技術 626
17.4.5 文件模式 627
17.4.6 隨機存取 633
17.5 內核格式化 638
17.6 總結 640
17.7 復習題 641
17.8 編程練習 642
第18章 探討C++新標準 644
18.1 復習前麵介紹過的C++11功能 644
18.1.1 新類型 644
18.1.2 統一的初始化 644
18.1.3 聲明 645
18.1.4 智能指針 646
18.1.5 異常規範方麵的修改 647
18.1.6 作用域內枚舉 647
18.1.7 對類的修改 647
18.1.8 模闆和STL方麵的修改 648
18.1.9 右值引用 649
18.2 移動語義和右值引用 650
18.2.1 為何需要移動語義 650
18.2.2 一個移動示例 651
18.2.3 移動構造函數解析 654
18.2.4 賦值 655
18.2.5 強製移動 655
18.3 新的類功能 658
18.3.1 特殊的成員函數 658
18.3.2 默認的方法和禁用的方法 659
18.3.3 委托構造函數 660
18.3.4 繼承構造函數 660
18.3.5 管理虛方法:override和final 661
18.4 Lambda函數 662
18.4.1 比較函數指針、函數符和Lambda函數 662
18.4.2 為何使用lambda 664
18.5 包裝器 666
18.5.1 包裝器function及模闆的低效性 666
18.5.2 修復問題 667
18.5.3 其他方式 669
18.6 可變參數模闆 669
18.6.1 模闆和函數參數包 669
18.6.2 展開參數包 670
18.6.3 在可變參數模闆函數中使用遞歸 670
18.7 C++11新增的其他功能 672
18.7.1 並行編程 672
18.7.2 新增的庫 672
18.7.3 低級編程 673
18.7.4 雜項 673
18.8 語言變化 674
18.8.1 Boost項目 674
18.8.2 TR1 674
18.8.3 使用Boost 674
18.9 接下來的任務 675
18.10 總結 675
18.11 復習題 676
18.12 編程練習 678
· · · · · · (
收起)