21天學通C++(第8版)(中文版)

21天學通C++(第8版)(中文版)
定價:474
NT $ 412
 

內容簡介

《21天學通C++(第8版)》通過大量短小精悍的程序詳細而全面地闡述了C++基本概念和技術,以及C++11、C++14和C++17新增的功能,包括管理輸入/輸出、循環和數組、面向對象編程、模板、使用標准模板庫、列表初始化、lambda表達式、自動類型推斷等。

這些內容被組織成結構合理、聯系緊密的章節,每章都可在1小時內閱讀完畢;每章都提供了示例程序清單,並輔以示例輸出和代碼分析,以闡述該章介紹的主題。為加深讀者對所學內容的理解,每章末尾都提供了常見問題及其答案以及練習和測驗。讀者可對照附錄E提供的測驗和練習答案,了解自己對所學內容的掌握程度。

Siddhartha Rao是全球領先的企業軟件提供商SAP SE負責安全響應的副總裁。C++的發展讓他深信,您能編寫速度更快、更簡潔、更強大的C++應用程序。Siddhartha酷愛旅游,還是山地自行車運動的狂熱愛好者;他期待着您對本書的反饋。
 

目錄

第1章 緒論 1
1.1C++簡史 1
1.1.1與C語言的關系 1
1.1.2C++的優點 1
1.1.3C++標准的發展歷程 2
1.1.4哪些人使用C++程序 2
1.2編寫C++應用程序 2
1.2.1生成可執行文件的步驟 2
1.2.2分析並修復錯誤 2
1.2.3集成開發環境 3
1.2.4編寫第一個C++應用程序 3
1.2.5生成並執行第一個C++應用程序 4
1.2.6理解編譯錯誤 5
1.3C++新增的功能 5
1.4總結 5
1.5問與答 6
1.6作業 6
1.6.1測驗 6
1.6.2練習 6

第2章 C++程序的組成部分 8
2.1HelloWorld程序的組成部分 8
2.1.1預處理器編譯指令#include 9
2.1.2程序的主體—main 9
2.1.3返回值 10
2.2名稱空間的概念 10
2.3C++代碼中的注釋 11
2.4C++函數 12
2.5使用std::cin和std::cout執行基本輸入輸出操作 14
2.6總結 15
2.7問與答 15
2.8作業 15
2.8.1測驗 16
2.8.2練習 16

第3章 使用變量和常量 17
3.1什麼是變量 17
3.1.1內存和尋址概述 17
3.1.2聲明變量以訪問和使用內存 17
3.1.3聲明並初始化多個類型相同的變量 19
3.1.4理解變量的作用域 19
3.1.5全局變量 20
3.1.6命名約定 22
3.2編譯器支持的常見C++變量類型 22
3.2.1使用bool變量存儲布爾值 23
3.2.2使用char變量存儲字符 23
3.2.3有符號整數和無符號整數的概念 24
3.2.4有符號整型short、int、long和longlong 24
3.2.5無符號整型unsigned short、unsigned int、unsigned long和unsigned long long 25
3.2.6選擇正確的數據類型以免發生溢出錯誤 25
3.2.7浮點類型float和double 26
3.3使用sizeof確定變量的長度 26
3.4使用auto自動推斷類型 28
3.5使用typedef替換變量類型 29
3.6什麼是常量 30
3.6.1字面常量 30
3.6.2使用const將變量聲明為常量 30
3.6.3使用constexpr定義常量表達式 31
3.6.4枚舉 32
3.6.5使用#define定義常量 34
3.7不能用作常量或變量名的關鍵字 34
3.8總結 35
3.9問與答 36
3.10作業 37
3.10.1測驗 37
3.10.2練習 37

第4章 管理數組和字符串 38
4.1什麼是數組 38
4.1.1為何需要數組 38
4.1.2聲明和初始化靜態數組 39
4.1.3數組中的數據是如何存儲的 39
4.1.4訪問存儲在數組中的數據 40
4.1.5修改存儲在數組中的數據 41
4.2多維數組 43
4.2.1聲明和初始化多維數組 44
4.2.2訪問多維數組中的元素 44
4.3動態數組 45
4.4C風格字符串 46
4.5C++字符串:使用std::string 48
4.6總結 50
4.7問與答 50
4.8作業 50
4.8.1測驗 51
4.8.2練習 51

第5章 使用表達式、語句和運算符 52
5.1語句 52
5.2復合語句(語句塊) 53
5.3使用運算符 53
5.3.1賦值運算符(=) 53
5.3.2理解左值和右值 53
5.3.3加法運算符(+)、減法運算符、乘法運算符(*)、除法運算符(/)和求模運算符(%) 53
5.3.4遞增運算符(++)和遞減運算符 54
5.3.5前綴還是后綴 55
5.3.6相等運算符(==)和不等運算符(!=) 56
5.3.7關系運算符 56
5.3.8邏輯運算NOT、AND、OR和XOR 58
5.3.9使用C++邏輯運算NOT(!)、AND(&&)和OR(||) 59
5.3.10按位運算符NOT(~)、AND(&)、OR(|)和XOR(;) 63
5.3.11按位右移運算符(>>)和左移運算符(<<) 64
5.3.12復合賦值運算符 65
5.3.13使用運算符sizeof確定變量占用的內存量 67
5.3.14運算符優先級 68
5.4總結 69
5.5問與答 69
5.6作業 70
5.6.1測驗 70
5.6.2練習 70

第6章 控制程序流程 71
6.1使用if…else有條件地執行 71
6.1.1使用if…else進行條件編程 72
6.1.2有條件地執行多條語句 73
6.1.3嵌套if語句 74
6.1.4使用switch—case進行條件處理 77
6.1.5使用運算符:進行條件處理 80
6.2在循環中執行代碼 81
6.2.1不成熟的goto循環 81
6.2.2while循環 83
6.2.3do…while循環 84
6.2.4for循環 86
6.2.5基於范圍的for循環 88
6.3使用continue和break修改循環的行為 90
6.3.1不結束的循環—無限循環 90
6.3.2控制無限循環 91
6.4編寫嵌套循環 93
6.4.1使用嵌套循環遍歷多維數組 94
6.4.2使用嵌套循環計算斐波納契數列 95
6.5總結 96
6.6問與答 96
6.7作業 97
6.7.1測驗 97
6.7.2練習 97

第7章 使用函數組織代碼 99
7.1為何需要函數 99
7.1.1函數原型是什麼 100
7.1.2函數定義是什麼 101
7.1.3函數調用和實參是什麼 101
7.1.4編寫接受多個參數的函數 101
7.1.5編寫沒有參數和返回值的函數 103
7.1.6帶默認值的函數參數 103
7.1.7遞歸函數—調用自己的函數 105
7.1.8包含多條return語句的函數 106
7.2使用函數處理不同類型的數據 107
7.2.1函數重載 107
7.2.2將數組傳遞給函數 109
7.2.3按引用傳遞參數 110
7.3微處理器如何處理函數調用 111
7.3.1內聯函數 112
7.3.2自動推斷返回類型 113
7.3.3lambda函數 114
7.4總結 115
7.5問與答 116
7.6作業 116
7.6.1測驗 116
7.6.2練習 116

第8章 闡述指針和引用 118
8.1什麼是指針 118
8.1.1聲明指針 119
8.1.2使用引用運算符(&)獲取變量的地址 119
8.1.3使用指針存儲地址 120
8.1.4使用解除引用運算符(*)訪問指向的數據 122
8.1.5將sizeof用於指針的結果 124
8.2動態內存分配 125
8.2.1使用new和delete動態地分配和釋放內存 125
8.2.2將遞增和遞減運算符(++和)用於指針的結果 127
8.2.3將關鍵字const用於指針 129
8.2.4將指針傳遞給函數 130
8.2.5數組和指針的類似之處 131
8.3使用指針時常犯的編程錯誤 133
8.3.1內存泄露 133
8.3.2指針指向無效的內存單元 133
8.3.3懸浮指針(也叫迷途或失控指針) 134
8.3.4檢查使用new發出的分配請求是否得到滿足 135
8.4指針編程佳實踐 137
8.5引用是什麼 137
8.5.1是什麼讓引用很有用 138
8.5.2將關鍵字const用於引用 139
8.5.3按引用向函數傳遞參數 140
8.6總結 140
8.7問與答 141
8.8作業 142
8.8.1測驗 142
8.8.2練習 142

第9章 類和對象 144
9.1類和對象 144
9.1.1聲明類 145
9.1.2作為類實例的對象 145
9.1.3使用句點運算符訪問成員 146
9.1.4使用指針運算符(—>)訪問成員 146
9.2關鍵字public和private 147
9.3構造函數 150
9.3.1聲明和實現構造函數 150
9.3.2何時及如何使用構造函數 151
9.3.3重載構造函數 152
9.3.4沒有默認構造函數的類 154
9.3.5帶默認值的構造函數參數 155
9.3.6包含初始化列表的構造函數 156
9.4析構函數 157
9.4.1聲明和實現析構函數 157
9.4.2何時及如何使用析構函數 158
9.5復制構造函數 160
9.5.1淺復制及其存在的問題 160
9.5.2使用復制構造函數確保深復制 162
9.5.3有助於改善性能的移動構造函數 166
9.6構造函數和析構函數的其他用途 166
9.6.1不允許復制的類 167
9.6.2只能有一個實例的單例類 167
9.6.3禁止在棧中實例化的類 169
9.6.4使用構造函數進行類型轉換 171
9.7this指針 172
9.8將sizeof用於類 173
9.9結構不同於類的地方 175
9.10聲明友元 176
9.11共用體:一種特殊的數據存儲機制 178
9.11.1聲明共用體 178
9.11.2在什麼情況下使用共用體 178
9.12對類和結構使用聚合初始化 180
9.13總結 183
9.14問與答 183
9.15作業 184
9.15.1測驗 184
9.15.2練習 184

第10章 實現繼承 185
10.1繼承基礎 185
10.1.1繼承和派生 186
10.1.2C++派生語法 186
10.1.3訪問限定符protected 188
10.1.4基類初始化—向基類傳遞參數 190
10.1.5在派生類中覆蓋基類的方法 192
10.1.6調用基類中被覆蓋的方法 194
10.1.7在派生類中調用基類的方法 194
10.1.8在派生類中隱藏基類的方法 196
10.1.9構造順序 198
10.1.10析構順序 198
10.2私有繼承 200
10.3保護繼承 202
10.4切除問題 205
10.5多繼承 205
10.6使用final禁止繼承 207
10.7總結 208
10.8問與答 208
10.9作業 208
10.9.1測驗 208
10.9.2練習 209

第11章 多態 210
11.1多態基礎 210
11.1.1為何需要多態行為 210
11.1.2使用虛函數實現多態行為 212
11.1.3為何需要虛構造函數 213
11.1.4虛函數的工作原理—理解虛函數表 217
11.1.5抽象基類和純虛函數 220
11.2使用虛繼承解決菱形問題 222
11.3表明覆蓋意圖的限定符override 225
11.4使用final來禁止覆蓋函數 226
11.5可將復制構造函數聲明為虛函數嗎 227
11.6總結 230
11.7問與答 230
11.8作業 231
11.8.1測驗 231
11.8.2練習 231

第12章 運算符類型與運算符重載 232
12.1C++運算符 232
12.2單目運算符 233
12.2.1單目運算符的類型 233
12.2.2單目遞增與單目遞減運算符 234
12.2.3轉換運算符 236
12.2.4解除引用運算符(*)和成員選擇運算符(—>) 238
12.3雙目運算符 239
12.3.1雙目運算符的類型 240
12.3.2雙目加法與雙目減法運算符 240
12.3.3實現運算符+=與= 242
12.3.4重載等於運算符(==)和不等運算符(!=) 243
12.3.5重載運算符<、>、<=和>= 245
12.3.6重載復制賦值運算符(=) 248
12.3.7下標運算符 250
12.4函數運算符operator 253
12.5用於高性能編程的移動構造函數和移動賦值運算符 254
12.5.1不必要的復制帶來的問題 254
12.5.2聲明移動構造函數和移動賦值運算符 254
12.6用戶定義的字面量 258
12.7不能重載的運算符 260
12.8總結 261
12.9問與答 261
12.10作業 261
12.10.1測驗 261
12.10.2練習 261

第13章 類型轉換運算符 262
13.1為何需要類型轉換 262
13.2為何有些C++程序員不喜歡C風格類型轉換 263
13.3C++類型轉換運算符 263
13.3.1使用static_cast 263
13.3.2使用dynamic_cast和運行階段類型識別 264
13.3.3使用reinterpret_cast 267
13.3.4使用const_cast 267
13.4C++類型轉換運算符存在的問題 268
13.5總結 269
13.6問與答 269
13.7作業 270
13.7.1測驗 270
13.7.2練習 270

第14章 宏和模板簡介 271
14.1預處理器與編譯器 271
14.2使用#define定義常量 271
14.3使用#define編寫宏函數 274
14.3.1為什麼要使用括號 276
14.3.2使用assert宏驗證表達式 276
14.3.3使用宏函數的優點和缺點 277
14.4模板簡介 278
14.4.1模板聲明語法 278
14.4.2各種類型的模板聲明 279
14.4.3模板函數 279
14.4.4模板與類型安全 281
14.4.5模板類 281
14.4.6聲明包含多個參數的模板 282
14.4.7聲明包含默認參數的模板 283
14.4.8一個模板示例 283
14.4.9模板的實例化和具體化 284
14.4.10模板類和靜態成員 286
14.4.11參數數量可變的模板 287
14.4.12使用static_assert執行編譯階段檢查 290
14.4.13在實際C++編程中使用模板 290
14.5總結 291
14.6問與答 291
14.7作業 291
14.7.1測驗 291
14.7.2練習 292

第15章 標准模板庫簡介 293
15.1STL容器 293
15.1.1順序容器 293
15.1.2關聯容器 294
15.1.3容器適配器 294
15.2STL迭代器 295
15.3STL算法 295
15.4使用迭代器在容器和算法之間交互 295
15.5選擇正確的容器 297
15.6STL字符串類 298
15.7總結 298
15.8問與答 299
15.9作業 299

第16章 STL string類 300
16.1為何需要字符串操作類 300
16.2使用STL string類 301
16.2.1實例化和復制STL string 301
16.2.2訪問std::string的字符內容 303
16.2.3拼接字符串 305
16.2.4在string中查找字符或子字符串 306
16.2.5截短STL string 307
16.2.6字符串反轉 309
16.2.7字符串的大小寫轉換 310
16.3基於模板的STL string實現 311
16.4總結 312
16.5問與答 312
16.6作業 313
16.6.1測驗 313
16.6.2練習 313

第17章 STL動態數組類 314
17.1std::vector的特點 314
17.2典型的vector操作 314
17.2.1實例化vector 314
17.2.2使用push_back在末尾插入元素 316
17.2.3列表初始化 317
17.2.4使用insert在指定位置插入元素 317
17.2.5使用數組語法訪問vector中的元素 319
17.2.6使用指針語法訪問vector中的元素 320
17.2.7刪除vector中的元素 321
17.3理解大小和容量 322
17.4STLdeque類 324
17.5總結 326
17.6問與答 326
17.7作業 327
17.7.1測驗 327
17.7.2練習 327

第18章 STLlist和forward_list 328
18.1std::list的特點 328
18.2基本的list操作 328
18.2.1實例化std::list對象 328
18.2.2在list開頭或末尾插入元素 330
18.2.3在list中間插入元素 331
18.2.4刪除list中的元素 333
18.3對list中的元素進行反轉和排序 334
18.3.1使用list::reverse反轉元素的排列順序 334
18.3.2對元素進行排序 335
18.3.3對包含對象的list進行排序以及刪除其中的元素 337
18.3.4C++11引入的std::forward_list 340
18.4總結 341
18.5問與答 342
18.6作業 342
18.6.1測驗 342
18.6.2練習 342

第19章 STL集合類 343
19.1簡介 343
19.2STLset和multiset的基本操作 344
19.2.1實例化std::set對象 344
19.2.2在set或multiset中插入元素 345
19.2.3在STLset或multiset中查找元素 347
19.2.4刪除STLset或multiset中的元素 348
19.3使用STLset和multiset的優缺點 352
19.4總結 354
19.5問與答 355
19.6作業 355
19.6.1測驗 355
19.6.2練習 355

第20章 STL映射類 356
20.1STL映射類簡介 356
20.2STLmap和multimap的基本操作 357
20.2.1實例化std::map和std::multimap 357
20.2.2在STLmap或multimap中插入元素 358
20.2.3在STLmap或multimap中查找元素 361
20.2.4在STLmultimap中查找元素 363
20.2.5刪除STLmap或multimap中的元素 363
20.3提供自定義的排序謂詞 365
20.4基於散列表的STL鍵—值對容器 368
20.4.1散列表的工作原理 368
20.4.2使用unordered_map和unordered_multimap 368
20.5總結 372
20.6問與答 372
20.7作業 372
20.7.1測驗 373
20.7.2練習 373

第21章 理解函數對象 374
21.1函數對象與謂詞的概念 374
21.2函數對象的典型用途 374
21.2.1一元函數 374
21.2.2一元謂詞 378
21.2.3二元函數 380
21.2.4二元謂詞 381
21.3總結 383
21.4問與答 384
21.5作業 384
21.5.1測驗 384
21.5.2練習 384

第22章 lambda表達式 385
22.1lambda表達式是什麼 385
22.2如何定義lambda表達式 386
22.3一元函數對應的lambda表達式 386
22.4一元謂詞對應的lambda表達式 387
22.5通過捕獲列表接受狀態變量的lambda表達式 388
22.6lambda表達式的通用語法 390
22.7二元函數對應的lambda表達式 391
22.8二元謂詞對應的lambda表達式 392
22.9總結 394
22.10問與答 394
22.11作業 395
22.11.1測驗 395
22.11.2練習 395

第23章 STL算法 396
23.1什麼是STL算法 396
23.2STL算法的分類 396
23.2.1非變序算法 396
23.2.2變序算法 397
23.3使用STL算法 398
23.3.1根據值或條件查找元素 398
23.3.2計算包含給定值或滿足給定條件的元素數 400
23.3.3在集合中搜索元素或序列 401
23.3.4將容器中的元素初始化為指定值 403
23.3.5使用std::generate將元素設置為運行階段生成的值 405
23.3.6使用for_each處理指定范圍內的元素 406
23.3.7使用std::transform對范圍進行變換 407
23.3.8復制和刪除操作 409
23.3.9替換值以及替換滿足給定條件的元素 412
23.3.10排序、在有序集合中搜索以及刪除重復元素 413
23.3.11將范圍分區 415
23.3.12在有序集合中插入元素 417
23.4總結 419
23.5問與答 419
23.6作業 419
23.6.1測驗 420
23.6.2練習 420

第24章 自適應容器:棧和隊列 421
24.1棧和隊列的行為特征 421
24.1.1棧 421
24.1.2隊列 422
24.2使用STLstack類 422
24.2.1實例化stack 422
24.2.2stack的成員函數 423
24.2.3使用push和pop在棧頂插入和刪除元素 424
24.3使用STLqueue類 425
24.3.1實例化queue 425
24.3.2queue的成員函數 426
24.3.3使用push 在隊尾插入以及使用pop從隊首刪除 427
24.4使用STL優先級隊列 428
24.4.1實例化priority_queue類 428
24.4.2priority_queue的成員函數 429
24.4.3使用push在priority_queue末尾插入以及使用pop在priority_queue開頭刪除 430
24.5總結 432
24.6問與答 432
24.7作業 432
24.7.1測驗 432
24.7.2練習 432

第25章 使用STL位標志 433
25.1bitset類 433
25.2使用std::bitset及其成員 434
25.2.1std:bitset的運算符 434
25.2.2std::bitset的成員方法 435
25.3vector<bool> 437
25.3.1實例化vector<bool> 437
25.3.2vector<bool>的成員函數和運算符 438
25.4總結 439
25.5問與答 439
25.6作業 439
25.6.1測驗 439
25.6.2練習 440

第26章 理解智能指針 441
26.1什麼是智能指針 441
26.1.1常規(原始)指針存在的問題 441
26.1.2智能指針有何幫助 442
26.2智能指針是如何實現的 442
26.3智能指針類型 443
26.3.1深復制 443
26.3.2寫時復制機制 445
26.3.3引用計數智能指針 445
26.3.4引用鏈接智能指針 445
26.3.5破壞性復制 445
26.3.6使用std::unique_ptr 447
26.4深受歡迎的智能指針庫 449
26.5總結 449
26.6問與答 449
26.7作業 450
26.7.1測試 450
26.7.2練習 450

第27章 使用流進行輸入和輸出 451
27.1流的概述 451
27.2重要的C++流類和流對象 452
27.3使用std::cout將指定格式的數據寫入控制台 453
27.3.1使用std::cout修改數字的顯示格式 453
27.3.2使用std::cout對齊文本和設置字段寬度 455
27.4使用std::cin進行輸入 455
27.4.1使用std::cin將輸入讀取到基本類型變量中 455
27.4.2使用std::cin:get將輸入讀取到char*緩沖區中 456
27.4.3使用std::cin將輸入讀取到std::string中 457
27.5使用std::fstream處理文件 458
27.5.1使用open和close打開和關閉文件 459
27.5.2使用open創建文本文件並使用運算符<<寫入文本 460
27.5.3使用open和運算符>>讀取文本文件 460
27.5.4讀寫二進制文件 461
27.6使用std::stringstream對字符串進行轉換 463
27.7總結 464
27.8問與答 464
27.9作業 465
27.9.1測驗 465
27.9.2練習 465

第28章 異常處理 466
28.1什麼是異常 466
28.2導致異常的原因 466
28.3使用try和catch捕獲異常 467
28.3.1使用catch(…)處理所有異常 467
28.3.2捕獲特定類型的異常 468
28.3.3使用throw引發特定類型的異常 469
28.4異常處理的工作原理 470
28.4.1std::exception類 472
28.4.2從std::exception派生出自定義異常類 473
28.5總結 474
28.6問與答 474
28.7作業 475
28.7.1測驗 475
28.7.2練習 475

第29章 繼續前行 477
29.1當今的處理器有何不同 477
29.2如何更好地利用多個內核 478
29.2.1線程是什麼 478
29.2.2為何要編寫多線程應用程序 479
29.2.3線程如何交換數據 479
29.2.4使用互斥量和信號量同步線程 480
29.2.5多線程技術帶來的問題 480
29.3編寫傑出的C++代碼 480
29.4C++17有望引入的新特性 481
29.4.1支持在if和switch中進行初始化 481
29.4.2保證復制得以避免 482
29.4.3避免內存分配開銷的std::string_view 482
29.4.4類型安全的共用體替代品std::variant 483
29.4.5使用ifconstexpr有條件地編譯代碼 483
29.4.6改進的lambda表達式 484
29.4.7在構造函數中使用類型自動推斷功能 484
29.5更深入地學習C++ 484
29.5.1在線文檔 485
29.5.2提供指南和幫助的社區 485
29.6總結 485
29.7問與答 485
29.8作業 485

附錄A 二進制和十六進制 486
A.1十進制 486
A.2二進制 486
A.2.1計算機為何使用二進制 487
A.2.2位和字節 487
A.2.31KB相當於多少字節 487
A.3十六進制 487
A.4不同進制之間的轉換 488
A.4.1通用轉換步驟 488
A.4.2從十進制轉換為二進制 488
A.4.3從十進制轉換為十六進制 489

附錄B C++關鍵字 490
附錄C 運算符優先級 491
附錄D ASCII碼 492
附錄E 答案 495
網路書店 類別 折扣 價格
  1. 新書
    87
    $412