內容簡介
C++是在 C 語言基礎上開發的一種集面向對象編程、泛型編程和過程化編程於一體的程式語言,是C語言的超集。本書是根據2003年的ISO/ANSI C++標準編寫的,通過大量短小精悍的程式詳細而全面地闡述了 C++的基本概念和技術,並專辟一章介紹了C++11新增的功能。
《C++ Primer Plus(第6版)中文版》分18章,分別介紹了C++程式的運行方式、基本數據類型、複合數據類型、循環和關係表達式、分支語句和邏輯運算符、函式重載和函式模板、記憶體模型和名稱空間、類的設計和使用、多態、虛函式、動態記憶體分配、繼承、代碼重用、友元、異常處理技術、string類和標準模板庫、輸入/輸出、C++11新增功能等內容。
《C++ Primer Plus(第6版)中文版》針對C++初學者,從C語言基礎知識開始介紹,然後在此基礎上詳細闡述C++新增的特性,因此不要求讀者有C語言方面的背景知識。《C++ Primer Plus(第6版)中文版》可作為高等院校教授C++課程的教材,也可供初學者自學C++時使用
圖書目錄
第 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
作者簡介
Stephen Prata曾在加利福尼亞的馬林學院(肯特菲爾德)教授天文學、物理學和程式設計課程,現已退休。他在加州理工學院獲得學士學位,在加州大學伯克利分校獲得博士學位。他最早接觸程式設計,是為了利用計算機給星團建模。Stephen撰寫和與他人合著了十幾本書籍,其中包括C++ Primer Plus和C Primer Plus。