第1章 基本概念 1
1.1 現代C++ 1
1.2 C++程序概念 2
1.2.1 注釋和空白 2
1.2.2 預處理指令和頭文件 3
1.2.3 函數 3
1.2.4 語句 4
1.2.5 數據輸入輸齣 4
1.2.6 return語句 5
1.2.7 名稱空間 5
1.2.8 名稱和關鍵字 6
1.3 類和對象 6
1.4 模闆 7
1.5 程序文件 7
1.6 標準庫 7
1.7 代碼的錶示樣式 7
1.8 創建可執行文件 8
1.9 錶示數字 9
1.9.1 二進製數 9
1.9.2 十六進製數 11
1.9.3 負的二進製數 12
1.9.4 八進製數 14
1.9.5 Big-Endian和Little-Endian係統 14
1.9.6 浮點數 15
1.10 錶示字符 16
1.10.1 ASCII 碼 16
1.10.2 UCS和Unicode 17
1.11 C++源字符 17
1.11.1 三字符序列 18
1.11.2 轉義序列 18
1.12 過程化編程方法和麵嚮
對象編程方法 20
1.13 本章小結 21
1.14 練習 22
第2章 基本數據類型 23
2.1 變量、數據和數據類型 23
2.1.1 定義整型變量 24
2.1.2 定義有固定值的變量 26
2.2 整型字麵量 26
2.2.1 十進製整型字麵量 27
2.2.2 十六進製的整型字麵量 27
2.2.3 八進製的整型字麵量 27
2.2.4 二進製的整型字麵量 28
2.3 整數的計算 28
2.4 op=賦值運算符 33
2.5 using聲明和指令 34
2.6 sizeof運算符 34
2.7 整數的遞增和遞減 35
2.8 定義浮點變量 37
2.8.1 浮點字麵量 38
2.8.2 浮點數的計算 38
2.8.3 缺點 38
2.8.4 無效的浮點結果 39
2.9 數值函數 40
2.10 流輸齣的格式化 43
2.11 混閤的錶達式和類型轉換 45
2.11.1 顯式類型轉換 46
2.11.2 老式的強製轉換 48
2.12 確定數值的上下限 49
2.13 使用字符變量 50
2.13.1 使用Unicode字符 51
2.13.2 auto關鍵字 52
2.13.3 lvalue和rvalue 52
2.14 本章小結 53
2.15 練習 54
第3章 處理基本數據類型 55
3.1 運算符的優先級和相關性 55
3.2 按位運算符 57
3.2.1 移位運算符 58
3.2.2 使用按位與運算符 60
3.2.3 使用按位或運算符 61
3.2.4 使用按位異或運算符 63
3.3 枚舉數據類型 67
3.4 數據類型的同義詞 70
3.5 變量的生存期 70
3.5.1 定位變量的定義 71
3.5.2 全局變量 71
3.5.3 靜態變量 74
3.5.4 外部變量 75
3.6 本章小結 75
3.7 練習 76
第4章 決策 77
4.1 比較數據值 77
4.1.1 應用比較運算符 78
4.1.2 比較浮點數值 79
4.2 if語句 80
4.2.1 嵌套的if語句 82
4.2.2 不依賴編碼的字符處理 84
4.3 if-else語句 85
4.3.1 嵌套的if-else語句 87
4.3.2 理解嵌套的if語句 88
4.4 邏輯運算符 89
4.4.1 邏輯與運算符 90
4.4.2 邏輯或運算符 90
4.4.3 邏輯非運算符 91
4.5 條件運算符 92
4.6 switch語句 94
4.7 無條件分支 98
4.8 語句塊和變量作用域 99
4.9 本章小結 100
4.10 練習 100
第5章 數組和循環 103
5.1 數據數組 103
5.2 理解循環 105
5.3 for循環 106
5.3.1 避免幻數 107
5.3.2 用初始化列錶定義數組的大小 109
5.3.3 確定數組的大小 109
5.3.4 用浮點數值控製for循環 110
5.3.5 使用更復雜的循環控製錶達式 112
5.3.6 逗號運算符 113
5.3.7 基於區域的for循環 114
5.4 while循環 115
5.5 do-while循環 119
5.6 嵌套的循環 120
5.7 跳過循環迭代 123
5.8 循環的中斷 125
5.9 字符數組 128
5.10 多維數組 131
5.10.1 初始化多維數組 134
5.10.2 在默認情況下設置維數 135
5.10.3 多維字符數組 136
5.11 數組的替代品 137
5.11.1 使用array<T,N>容器 138
5.11.2 使用std::vector<T>容器 142
5.11.3 矢量的容量和大小 143
5.11.4 刪除矢量容器中的元素 145
5.12 本章小結 145
5.13 練習 146
第6章 指針和引用 149
6.1 什麼是指針 149
6.1.1 地址運算符 151
6.1.2 間接運算符 152
6.1.3 為什麼使用指針 153
6.2 char類型的指針 154
6.3 常量指針和指嚮常量的指針 158
6.4 指針和數組 159
6.4.1 指針的算術運算 160
6.4.2 計算兩個指針之間的差 162
6.4.3 使用數組名的指針錶示法 162
6.5 動態內存分配 165
6.5.1 棧和堆 165
6.5.2 運算符new和delete 166
6.5.3 數組的動態內存分配 167
6.5.4 通過指針選擇成員 169
6.6 動態內存分配的危險 169
6.6.1 內存泄漏 169
6.6.2 自由存儲區的碎片 170
6.7 原指針和智能指針 170
6.7.1 使用unique_ptr<T>指針 172
6.7.2 使用shared_ptr<T>指針 173
6.7.3 比較shared_ptr<T>對象 177
6.7.4 weak_ptr<T>指針 177
6.8 理解引用 178
6.8.1 定義左值引用 179
6.8.2 在基於區域的for循環中使用引用變量 180
6.8.3 定義右值引用 180
6.9 本章小結 181
6.10 練習 181
第7章 操作字符串 183
7.1 更好的string類型 183
7.1.1 定義string對象 184
7.1.2 string對象的操作 186
7.1.3 訪問字符串中的字符 188
7.1.4 訪問子字符串 190
7.1.5 比較字符串 191
7.1.6 搜索字符串 196
7.1.7 修改字符串 203
7.2 國際字符串 207
7.3 包含Unicode字符串的對象 208
7.4 原字符串字麵量 208
7.5 本章小結 209
7.6 練習 210
第8章 定義函數 211
8.1 程序的分解 211
8.1.1 類中的函數 212
8.1.2 函數的特徵 212
8.2 定義函數 212
8.2.1 函數體 213
8.2.2 函數聲明 215
8.3 給函數傳送參數 217
8.3.1 按值傳送機製 217
8.3.2 按引用傳送 223
8.3.3 main()的參數 227
8.4 默認的參數值 228
8.5 從函數中返迴值 231
8.5.1 返迴指針 231
8.5.2 返迴引用 235
8.6 內聯函數 236
8.7 靜態變量 237
8.8 函數的重載 239
8.8.1 重載和指針參數 241
8.8.2 重載和引用參數 241
8.8.3 重載和const參數 243
8.8.4 重載和默認參數值 244
8.9 函數模闆 245
8.9.1 創建函數模闆的實例 246
8.9.2 顯式指定模闆參數 247
8.9.3 函數模闆的特例 248
8.9.4 函數模闆和重載 249
8.9.5 帶有多個參數的函數模闆 250
8.9.6 非類型的模闆參數 251
8.10 拖尾返迴類型 252
8.11 函數指針 253
8.12 遞歸 256
8.12.1 應用遞歸 259
8.12.2 Quicksort算法 259
8.12.3 main()函數 260
8.12.4 extract_words()函數 261
8.12.5 swap()函數 262
8.12.6 sort()函數 262
8.12.7 max_word_length()函數 263
8.12.8 show_words()函數 264
8.13 本章小結 265
8.14 練習 266
第9章 lambda錶達式 269
9.1 lambda錶達式簡介 269
9.2 定義lambda錶達式 269
9.3 lambda錶達式的命名 270
9.4 把lambda錶達式傳遞給函數 272
9.4.1 接受lambda錶達式變元的函數模闆 272
9.4.2 lambda變元的函數參數類型 273
9.4.3 使用std::function模闆類型 274
9.5 捕獲子句 277
9.6 在模闆中使用lambda錶達式 279
9.7 lambda錶達式中的遞歸 281
9.8 本章小結 283
9.9 練習 283
第10章 程序文件和預處理指令 285
10.1 理解轉換單元 285
10.1.1 “一個定義”規則 286
10.1.2 程序文件和鏈接 286
10.1.3 確定名稱的鏈接屬性 286
10.1.4 外部名稱 287
10.1.5 具有外部鏈接屬性的
const變量 287
10.2 預處理源代碼 288
10.3 定義預處理標識符 289
10.4 包含頭文件 290
10.5 名稱空間 292
10.5.1 全局名稱空間 293
10.5.2 定義名稱空間 293
10.5.3 應用using聲明 296
10.5.4 函數和名稱空間 296
10.5.5 未命名的名稱空間 299
10.5.6 名稱空間的彆名 299
10.5.7 嵌套的名稱空間 300
10.6 邏輯預處理指令 301
10.6.1 邏輯#if指令 301
10.6.2 測試指定標識符的值 302
10.6.3 多個代碼選擇 302
10.6.4 標準的預處理宏 303
10.7 調試方法 304
10.7.1 集成調試器 304
10.7.2 調試中的預處理指令 305
10.7.3 使用assert宏 309
10.7.4 關閉斷言機製 310
10.8 靜態斷言 310
10.9 本章小結 312
10.10 練習 313
第11章 定義自己的數據類型 315
11.1 類和麵嚮對象編程 315
11.1.1 封裝 316
11.1.2 繼承 318
11.1.3 多態性 318
11.1.4 術語 319
11.2 定義類 320
11.3 構造函數 322
11.3.1 在類的外部定義構造函數 324
11.3.2 默認構造函數的參數值 326
11.3.3 在構造函數中使用初始化列錶 326
11.3.4 使用explicit關鍵字 327
11.3.5 委托構造函數 329
11.3.6 默認的副本構造函數 331
11.4 訪問私有類成員 332
11.5 友元 333
11.5.1 類的友元函數 334
11.5.2 友元類 336
11.6 this指針 337
11.7 const對象和const函數成員 338
11.8 類的對象數組 340
11.9 類對象的大小 342
11.10 類的靜態成員 342
11.10.1 靜態數據成員 342
11.10.2 類的靜態函數成員 347
11.11 析構函數 347
11.12 類對象的指針和引用 350
11.13 將指針作為類的成員 351
11.13.1 定義Package類 353
11.13.2 定義TruckLoad類 354
11.13.3 實現TruckLoad類 355
11.14 嵌套類 360
11.15 本章小結 363
11.16 練習 363
第12章 運算符重載 365
12.1 為類實現運算符 365
12.1.1 運算符重載 366
12.1.2 可以重載的運算符 366
12.1.3 實現重載運算符 366
12.1.4 全局運算符函數 369
12.1.5 提供對運算符的全部支持 369
12.1.6 在類中實現所有的比較運算符 371
12.2 運算符函數術語 373
12.3 默認的類成員 374
12.3.1 定義析構函數 375
12.3.2 何時定義副本構造函數 377
12.3.3 實現賦值運算符 377
12.3.4 實現移動操作 379
12.4 重載算術運算符 380
12.4.1 改進輸齣操作 384
12.4.2 根據一個運算符實現另一個運算符 386
12.5 重載下標運算符 387
12.6 重載類型轉換 394
12.7 重載遞增和遞減運算符 395
12.8 函數對象 396
12.9 本章小結 397
12.10 練習 398
第13章 繼承 399
13.1 類和麵嚮對象編程 399
13.2 類的繼承 401
13.2.1 繼承和聚閤 401
13.2.2 派生類 402
13.3 把類的成員聲明為protected 405
13.4 派生類成員的訪問級彆 405
13.4.1 在類層次結構中使用訪問指定符 406
13.4.2 改變繼承成員的訪問指定符 408
13.5 派生類中的構造函數操作 408
13.5.1 派生類中的副本構造函數 412
13.5.2 派生類中的默認構造函數 414
13.5.3 繼承構造函數 414
13.6 繼承中的析構函數 415
13.7 重復的成員名 417
13.8 重復的函數成員名 418
13.9 多重繼承 419
13.9.1 多個基類 419
13.9.2 繼承成員的模糊性 420
13.9.3 重復的繼承 424
13.9.4 虛基類 425
13.10 在相關的類類型之間轉換 425
13.11 本章小結 426
13.12 練習 426
第14章 多態性 429
14.1 理解多態性 429
14.1.1 使用基類指針 429
14.1.2 調用繼承的函數 431
14.1.3 虛函數 434
14.1.4 虛函數中的默認參數值 442
14.1.5 通過智能指針調用虛函數 443
14.1.6 通過引用調用虛函數 444
14.1.7 調用虛函數的基類版本 445
14.1.8 在指針和類對象之間轉換 446
14.1.9 動態強製轉換 447
14.1.10 轉換引用 449
14.1.11 確定多態類型 449
14.2 多態性的成本 450
14.3 純虛函數 451
14.3.1 抽象類 452
14.3.2 間接的抽象基類 454
14.4 通過指針釋放對象 457
14.5 本章小結 458
14.6 練習 459
第15章 運行時錯誤和異常 461
15.1 處理錯誤 461
15.2 理解異常 462
15.2.1 拋齣異常 463
15.2.2 異常處理過程 465
15.2.3 未處理的異常 466
15.2.4 導緻拋齣異常的代碼 467
15.2.5 嵌套的try塊 468
15.3 用類對象作為異常 472
15.3.1 匹配Catch處理程序和異常 473
15.3.2 用基類處理程序捕獲派生類異常 476
15.3.3 重新拋齣異常 478
15.3.4 捕獲所有的異常 481
15.4 拋齣異常的函數 482
15.4.1 函數try塊 483
15.4.2 不拋齣異常的函數 483
15.4.3 構造函數try塊 484
15.4.4 異常和析構函數 484
15.5 標準庫異常 485
15.5.1 異常類的定義 486
15.5.2 使用標準異常 487
15.6 本章小結 490
15.7 練習 491
第16章 類模闆 493
16.1 理解類模闆 493
16.2 定義類模闆 494
16.2.1 模闆參數 495
16.2.2 簡單的類模闆 495
16.2.3 定義類模闆的函數成員 497
16.3 創建類模闆的實例 501
16.4 類模闆的靜態成員 506
16.5 非類型的類模闆參數 507
16.5.1 帶有非類型參數的函數成員的模闆 510
16.5.2 非類型參數的變元 514
16.5.3 把指針和數組用作非類型參數 514
16.6 模闆參數的默認值 515
16.7 模闆的顯式實例化 516
16.8 特殊情形 516
16.8.1 在類模闆中使用
static_assert() 517
16.8.2 定義類模闆特化 518
16.8.3 部分模闆特化 519
16.8.4 從多個部分特化中選擇 519
16.9 類模闆的友元 520
16.10 帶有嵌套類的類模闆 521
16.11 本章小結 528
16.12 練習 528
第17章 文件輸入與輸齣 531
17.1 C++中的輸入輸齣 531
17.1.1 理解流 531
17.1.2 使用流的優點 533
17.2 流類 534
17.2.1 標準流對象 535
17.2.2 流的插入和提取操作 535
17.2.3 流操縱程序 537
17.3 文件流 540
17.3.1 在文本模式下寫入文件 540
17.3.2 在文本模式下讀取文件 543
17.4 設置流打開模式 546
17.5 未格式化的流操作 554
17.5.1 未格式化的流輸入函數 554
17.5.2 未格式化的流輸齣函數 557
17.6 流輸入輸齣中的錯誤 557
17.7 二進製模式中的流操作 559
17.8 文件的讀寫操作 570
17.9 字符串流 577
17.10 對象和流 578
17.10.1 給對象使用插入運算符 579
17.10.2 給對象使用提取運算符 579
17.10.3 二進製模式中的對象I/O 582
17.10.4 流中更復雜的對象 585
17.11 本章小結 590
17.12 練習 590
· · · · · · (
收起)