編輯推薦
《C++入門經典(第4版)》是一本
C++初學者指南,討論了適合初學者的C++功能子集,其語法對應於C++14標準。本書的內容適合於任何開發環境,可以在任何作業系統或程式開發系統中使用。讀者不需要有任何編程知識。
目錄
第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容器 138
5.11.2 使用std::vector容器 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指針 172
6.7.2 使用shared_ptr指針 173
6.7.3 比較shared_ptr對象 177
6.7.4 weak_ptr指針 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