內容簡介
《C++17入門經典(第5版)》介紹如何使用最新的C++17編寫程式。從基礎知識講起,通過詳細分析示例,幫助讀者成為能夠自己編寫程式的C++程式設計師。參考《C++17入門經典(第5版)》的內容,並安裝最新的
C++編譯器,讀者很快就能編寫真正的C++程式。《C++17入門經典(第5版)》不需要讀者有任何編程經驗,因此在講解所有語言概念時,均給出了可以工作的程式示例,並且全部章節都包含練習題,以幫助讀者檢測並練習自己學到的知識。《C++17入門經典(第5版)》為正文中的所有代碼示例和練習題提供可下載的代碼。《C++17入門經典(第5版)》內容已針對C++語言的最新版本C++17做了全面更新,並且介紹了現代C++的約定和最佳實踐。《C++17入門經典(第5版)》還介紹了
C++標準庫的元素,它們為C++17語言提供了必要的支持。
目錄
第1章基本概念1
1.1現代C++1
1.2標準庫2
1.3C++程式概念2
1.3.1源檔案和頭檔案3
1.3.2注釋和空白3
1.3.3預處理指令和標準庫頭檔案3
1.3.4函式3
1.3.5語句4
1.3.6數據的輸入輸出4
1.3.7return語句5
1.3.8名稱空間5
1.3.9名稱和關鍵字6
1.4類和對象6
1.5模板6
1.6代碼的表示樣式和編程風格7
1.7創建執行檔7
1.8過程化編程和面向對象編程8
1.9表示數字9
1.9.1二進制數9
1.9.2十六進制數10
1.9.3負的二進制數11
1.9.4八進制數12
1.9.5Big-Endian和Little-Endian系統12
1.9.6浮點數13
1.10表示字元14
1.10.1ASCII碼14
1.10.2UCS和Unicode14
1.11C++源字元15
1.12本章小結17
1.13練習17
第2章基本數據類型19
2.1變數、數據和數據類型19
2.1.1定義整型變數19
2.1.2零初始化22
2.1.3定義有固定值的變數22
2.2整型字面量22
2.2.1十進制整型字面量23
2.2.2十六進制的整型字面量23
2.2.3八進制的整型字面量24
2.2.4二進制的整型字面量24
2.3整數的計算24
2.4賦值運算26
2.5sizeof運算符29
2.6整數的遞增和遞減30
2.7定義浮點變數31
2.8浮點字面量32
2.9浮點數的計算32
2.9.1缺點32
2.9.2無效的浮點結果33
2.9.3數學函式33
2.10輸出流的格式化35
2.11混合的表達式和類型轉換37
2.12顯式類型轉換38
2.13確定數值的上下限40
2.14使用字元變數41
2.15auto關鍵字42
2.16本章小結43
2.17練習43
第3章處理基本數據類型45
3.1運算符的優先權和相關性45
3.2位運算符46
3.2.1移位運算符47
3.2.2位模式下的邏輯運算49
3.3枚舉數據類型53
3.4數據類型的別名55
3.5變數的生存期56
3.6全局變數56
3.7本章小結59
3.8練習59
第4章決策61
4.1比較數據值61
4.1.1套用比較運算符62
4.1.2比較浮點數值63
4.2if語句63
4.2.1嵌套的if語句65
4.2.2字元分類和轉換66
4.3if-else語句68
4.3.1嵌套的if-else語句69
4.3.2理解嵌套的if語句70
4.4邏輯運算符71
4.4.1邏輯與運算符71
4.4.2邏輯或運算符71
4.4.3邏輯非運算符72
4.4.5對整數運算元套用邏輯運算符73
4.4.6對比邏輯運算符與位運算符74
4.5條件運算符75
4.6switch語句76
4.7語句塊和變數作用域81
4.8本章小結82
4.9練習83
第5章數組和循環85
5.1數組85
5.2理解循環87
5.3for循環87
5.4避免幻數89
5.5用初始化列表定義數組的大小90
5.6確定數組的大小90
5.7用浮點數控制for循環91
5.8使用更複雜的for循環控制表達式93
5.9基於範圍的for循環94
5.10while循環95
5.11do-while循環96
5.12嵌套的循環98
5.13跳過循環疊代100
5.14循環的中斷101
5.15使用無符號整數控制for循環103
5.16字元數組104
5.17多維數組107
5.17.1初始化多維數組108
5.17.2多維字元數組110
5.18在運行期間給數組分配記憶體空間111
5.19數組的替代品112
5.19.1使用array容器113
5.19.2使用std::vector容器116
5.20本章小結119
5.21練習120
第6章指針和引用121
6.1什麼是指針121
6.2地址運算符123
6.3間接運算符124
6.4為什麼使用指針125
6.5char類型的指針125
6.6常量指針和指向常量的指針128
6.7指針和數組130
6.7.1指針的算術運算130
6.7.2使用數組名的指針表示法132
6.8動態記憶體分配133
6.8.1棧和自由存儲區134
6.8.2運算符new和delete134
6.8.3數組的動態記憶體分配135
6.9通過指針選擇成員138
6.10動態記憶體分配的危險138
6.10.1懸掛指針和多次釋放138
6.10.2分配與釋放的不匹配139
6.10.3記憶體泄漏139
6.10.4自由存儲區的碎片139
6.11記憶體分配的黃金準則140
6.12原始指針和智慧型指針140
6.12.1使用unique_ptr指針141
6.12.2使用shared_ptr指針143
6.13理解引用146
6.13.1定義引用146
6.13.2在基於範圍的for循環中使用引用變數147
6.14本章小結148
6.15練習148
第7章操作字元串151
7.1更強大的string類151
7.1.1定義string對象151
7.1.2string對象的操作154
7.1.3訪問字元串中的字元157
7.1.4訪問子字元串158
7.1.5比較字元串158
7.1.6搜尋字元串162
7.1.7修改字元串167
7.1.8對比std::string與std::vector170
7.2將字元串轉換為數字171
7.3字元串流171
7.4國際字元串172
7.4.1存儲wchar_t字元的字元串172
7.4.2包含Unicode字元串的對象173
7.5原始字元串字面量173
7.6本章小結174
7.7練習175
第8章定義函式177
8.1程式的分解177
8.1.1類中的函式177
8.1.2函式的特徵178
8.2定義函式178
8.2.1函式體179
8.2.2返回值180
8.2.3函式聲明181
8.3給函式傳送實參182
8.3.1按值傳送182
8.3.2按引用傳送187
8.3.3字元串視圖:新的conststring引用192
8.4默認實參值194
8.(5main)函式的實參196
8.6從函式中返回值196
8.6.1返回指針197
8.6.2返回引用199
8.6.3對比返回值與輸出參數200
8.6.4返回類型推斷200
8.6.5使用可選值201
8.7靜態變數203
8.8內聯函式204
8.9函式重載204
8.9.1重載和指針參數206
8.9.2重載和引用參數206
8.9.3重載和const參數207
8.9.4重載和默認實參值208
8.10遞歸209
8.10.1基本示例209
8.10.2遞歸算法210
8.11本章小結215
8.12練習216
第9章函式模板219
9.1函式模板219
9.2創建函式模板的實例220
9.3模板類型參數221
9.4顯式指定模板實參221
9.5函式模板的特例222
9.6函式模板和重載222
9.7帶有多個參數的函式模板224
9.8模板的返回類型推斷225
9.8.1decltype和拖尾返回類型225
9.8.2對比decltype(auto)、拖尾(decltype)與auto226
9.9模板參數的默認值226
9.10非類型的模板參數227
9.11本章小結229
9.12練習229
第10章程式檔案和預處理指令231
10.1理解轉換單元231
10.1.1單一定義規則231
10.1.2程式檔案和連結232
10.1.3確定名稱的連結屬性232
10.1.4外部函式233
10.1.5外部變數233
10.1.6內部名稱235
10.2預處理原始碼236
10.3定義預處理宏236
10.3.1定義類似於函式的宏238
10.3.2取消宏的定義239
10.4包含頭檔案240
10.4.1防止重複頭檔案的內容240
10.4.2第一個頭檔案241
10.5名稱空間242
10.5.1全局名稱空間242
10.5.2定義名稱空間242
10.5.3套用using聲明244
10.5.4函式和名稱空間244
10.5.5未命名的名稱空間246
10.5.6嵌套的名稱空間247
10.5.7名稱空間的別名248
10.6邏輯預處理指令248
10.6.1邏輯#if指令248
10.6.2測試指定標識符的值249
10.6.3多個代碼選擇249
10.6.4標準的預處理宏250
10.6.5檢查頭檔案是否可用251
10.7調試方法251
10.7.1集成調試器252
10.7.2調試中的預處理指令252
10.7.3使用(assert)宏254
10.8靜態斷言255
10.9本章小結257
10.10練習257
第11章定義自己的數據類型259
11.1類和面向對象編程259
11.1.1封裝260
11.1.2繼承262
11.1.3多態性263
11.2術語263
11.3定義類264
11.4構造函式265
11.4.1默認構造函式265
11.4.2定義類的構造函式266
11.4.3使用default關鍵字267
11.4.4在類的外部定義函式和構造函式267
11.4.6使用成員初始化列表269
11.4.7使用explicit關鍵字269
11.4.8委託構造函式271
11.4.9副本構造函式272
11.5訪問私有類成員273
11.6this指針274
11.7const對象和const成員函式275
11.7.1const成員函式276
11.7.2const正確性277
11.7.3重載const277
11.7.4常量的強制轉換279
11.7.5使用mutable關鍵字279
11.8友元280
11.8.1類的友元函式280
11.8.2友元類281
11.9類的對象數組282
11.10類對象的大小283
11.11類的靜態成員283
11.11.1靜態成員變數283
11.11.2訪問靜態成員變數286
11.11.3靜態常量286
11.11.5靜態成員函式288
11.12析構函式288
11.13使用指針作為類成員290
11.14嵌套類299
11.15本章小結302
11.16練習303
第12章運算符重載305
12.1為類實現運算符305
12.1.1運算符重載305
12.1.2實現重載運算符306
12.1.3非成員運算符函式307
12.1.4提供對運算符的全部支持308
12.1.5在類中實現所有的比較運算符309
12.2可以重載的運算符311
12.3運算符函式習語313
12.4為輸出流重載
12.5重載算術運算符315
12.6成員與非成員函式318
12.7重載一元運算符320
12.8重載遞增和遞減運算符321
12.9重載下標運算符322
12.10函式對象326
12.11重載類型轉換326
12.12.1實現複製賦值運算符328
12.12.2複製賦值運算符與副本構造函式330
12.12.3賦值不同類型330
12.13本章小結331
12.14練習331
第13章繼承333
13.1類和面向對象編程333
13.2類的繼承334
13.2.1繼承和聚合335
13.2.2派生類335
13.3把類的成員聲明為protected337
13.4派生類成員的訪問級別338
13.4.1在類層次結構中使用訪問修飾符338
13.4.2在類層次結構中選擇訪問修飾符339
13.4.3改變繼承成員的訪問修飾符340
13.5派生類中的構造函式341
13.5.1派生類中的副本構造函式343
13.5.2派生類中的默認構造函式344
13.5.3繼承構造函式344
13.6繼承中的析構函式345
13.7重複的成員變數名347
13.8重複的成員函式名347
13.9多重繼承348
13.9.1多個基類348
13.9.2繼承成員的模糊性349
13.9.3重複繼承352
13.9.4虛基類353
13.10在相關的類類型之間轉換353
13.11本章小結354
13.12練習354
第14章多態性355
14.1理解多態性355
14.1.1使用基類指針355
14.1.2調用繼承的函式357
14.1.3虛函式359
14.1.4虛函式中的默認實參值365
14.1.5通過引用調用虛函式366
14.1.6多態集合366
14.1.7通過指針釋放對象367
14.1.8在指針和類對象之間轉換369
14.1.9動態強制轉換370
14.1.10調用虛函式的基類版本373
14.1.11在構造函式或析構函式中
調用虛函式374
14.2多態性引發的成本375
14.3確定動態類型376
14.4純虛函式378
14.4.1抽象類379
14.4.2用作接口的抽象類381
14.5本章小結382
14.6練習383
第15章運行時錯誤和異常385
15.1處理錯誤385
15.2理解異常386
15.2.1拋出異常386
15.2.2異常處理過程388
15.2.3導致拋出異常的代碼389
15.2.4嵌套的try塊389
15.3用類對象作為異常392
15.3.1匹配catch處理程式和異常393
15.3.2用基類處理程式捕獲派生類異常394
15.4重新拋出異常396
15.5未處理的異常398
15.6捕獲所有的異常399
15.7不拋出異常的函式400
15.7.1noexcept限定符400
15.7.2異常和析構函式401
15.8異常和資源泄漏401
15.8.1資源獲取即初始化403
15.8.2用於動態記憶體的標準RAII類404
15.9標準庫異常405
15.9.1異常類的定義406
15.9.2使用標準異常407
15.10本章小結409
15.11練習410
第16章類模板413
16.1理解類模板413
16.2定義類模板414
16.2.1模板參數414
16.2.2簡單的類模板415
16.3定義類模板的成員函式416
16.3.1構造函式模板416
16.3.2析構函式模板417
16.3.3下標運算符模板417
16.3.4賦值運算符模板419
16.4創建類模板的實例422
16.5非類型的類模板參數426
16.5.1帶有非類型參數的成員函式的模板427
16.5.2非類型參數的實參431
16.5.3對比非類型模板實參與構造函式實參431
16.6模板參數的默認值432
16.7模板的顯式實例化432
16.8類模板特化433
16.8.1定義類模板特化433
16.8.2部分模板特化433
16.8.3從多個部分特化中選擇434
16.9在類模板中使用(static_assert)434
16.10類模板的友元435
16.11帶有嵌套類的類模板436
16.11.1棧成員的函式模板438
16.11.2消除依賴名稱的歧義441
16.12本章小結443
16.13練習443
第17章移動語義445
17.1lvalue和rvalue445
17.2移動對象447
17.2.1傳統方法449
17.2.2定義移動成員449
17.3顯式移動對象452
17.3.1隻能移動的類型452
17.3.2移動對象的繼續使用453
17.4看似矛盾的情況454
17.4.(1std::move)並不移動任何東西454
17.4.2rvalue引用是一個lvalue454
17.5繼續探討函式定義455
17.5.1按rvalue引用傳送455
17.5.2按值傳送的歸來456
17.5.3按值返回458
17.6繼續討論定義移動成員459
17.6.1總是添加noexcept459
17.6.2“移動後交換”技術462
17.7特殊成員函式463
17.7.1默認移動成員464
17.7.25的規則464
17.7.30的規則465
17.8本章小結466
17.9練習466
第18章頭等函式467
18.1函式指針467
18.1.1定義函式指針467
18.1.2高階函式的回調函式469
18.1.3函式指針的類型別名471
18.2函式對象472
18.2.1基本的函式對象472
18.2.2標準函式對象473
18.2.3參數化函式對象474
18.3lambda表達式475
18.3.1定義lambda表達式475
18.3.2命名lambda閉包476
18.3.4捕獲子句477
18.4std::function模板481
18.5本章小結482
18.6練習483
第19章容器與算法485
19.1容器485
19.1.1順序容器485
19.1.2棧和佇列488
19.1.3集合489
19.1.4映射491
19.2疊代器494
19.2.1疊代器設計模式495
19.2.2標準庫容器的疊代器496
19.2.3數組的疊代器502
19.3算法503
19.3.1第一個示例503
19.3.2尋找元素504
19.3.3輸出多個值505
19.3.4刪除-擦除技術507
19.3.5排序507
19.3.6並行算法508
19.4本章小結508
19.5練習509