關于我們
書單推薦
新書推薦
|
21天學通C++(第9版)
這是一本經(jīng)典的C++編程入門指南,第9版針對C++20標準進行了內(nèi)容上的全面更新,旨在幫助讀者編寫更快、更簡單、更可靠的C++代碼,并掌握C++和面向對象編程的基本原理。
本書通過大量短小精悍的程序詳細而全面地闡述了C++的基本概念和技術應用,以及C++20新增的功能,這些內(nèi)容被組織成結構合理、聯(lián)系緊密的章節(jié)。每章都提供了示例程序清單,并輔以示例輸出和代碼分析,以進一步闡述該章的主題。為幫助讀者鞏固所學的內(nèi)容,每章末尾都提供了常見問題相關答案以及作業(yè)。讀者可對照附錄E提供的答案,了解自己對所學內(nèi)容的掌握程度。
本書面向C++初學者,不要求讀者有C語言方面的背景知識,可作為高等院校教授C++課程的教材,也可供初學者自學C++時使用。
1.本書詳細分析了近300個帶有詳細注釋的代碼示例,覆蓋C++20和C++23語言特性,并描述了其內(nèi)部工作原理。無論是初學者還是專業(yè)程序員,都能了解到本書所具有的寶貴價值。
2.本書通過科學合理的內(nèi)容安排讓讀者在21天內(nèi)學通C++,符合讀者期望快速入門C++的心理。
3.本書通過“注意”“警告”“提示”“黑名單”“白名單”等板塊設計讓讀者輕松愉快地學會C++。
4.本書提供可下載的代碼示例,方便讀者親手實踐。
悉達多·饒(Siddhartha Rao)是SAP SE公司主管產(chǎn)品安全的副總裁,其作品享譽全球,并被翻譯成法語和中文。他深信C++發(fā)展快速,并致力于為機器學習和人工智能領域的發(fā)展添磚加瓦。
第 一部分 基礎知識
第 1章 緒論 2
1.1 C++簡史 2
1.1.1 與C語言的關系 2
1.1.2 C++的優(yōu)點 2
1.1.3 C++標準的發(fā)展歷程 3
1.1.4 哪些人使用C++程序 3
1.2 編寫C++應用程序 3
1.2.1 生成可執(zhí)行文件的步驟 3
1.2.2 分析并修復錯誤 4
1.2.3 集成開發(fā)環(huán)境 4
1.2.4 編寫第 一個C++應用程序 4
1.2.5 生成并執(zhí)行第 一個C++應用程序 5
1.2.6 理解編譯錯誤 7
1.3 C++20新增的功能 7
1.4 總結 8
1.5 問與答 8
1.6 作業(yè) 8
1.6.1 測驗 8
1.6.2 練習 9
第 2章 C++程序的組成部分 10
2.1 Hello World程序的組成部分 10
2.1.1 預處理器編譯指令#include 10
2.1.2 程序的主體:main( ) 11
2.1.3 返回值 12
2.2 命名空間的概念 12
2.3 C++代碼中的注釋 13
2.4 C++函數(shù) 14
2.5 使用std::cin和std::cout執(zhí)行基本輸入輸出操作 16
2.6 總結 17
2.7 問與答 17
2.8 作業(yè) 17
2.8.1 測驗 18
2.8.2 練習 18
第3章 使用變量和常量 19
3.1 什么是變量 19
3.1.1 內(nèi)存和尋址概述 19
3.1.2 聲明變量以訪問和使用內(nèi)存 19
3.1.3 聲明并初始化多個類型相同的變量 21
3.1.4 理解變量的作用域 21
3.1.5 全局變量 22
3.1.6 命名約定 24
3.2 編譯器支持的常見C++變量類型 24
3.2.1 使用bool變量存儲布爾值 25
3.2.2 使用char變量存儲字符 25
3.2.3 有符號整數(shù)和無符號整數(shù)的概念 26
3.2.4 有符號整型short、int、long和long long 26
3.2.5 無符號整型unsigned short、unsigned int、unsigned long和unsigned long long 26
3.2.6 選擇正確的數(shù)據(jù)類型以免發(fā)生溢出錯誤 27
3.2.7 浮點類型float和double 28
3.3 使用sizeof確定變量的長度 28
3.4 使用auto自動推斷類型 30
3.5 使用typedef替換變量類型 31
3.6 什么是常量 31
3.6.1 字面常量 32
3.6.2 使用const將變量聲明為常量 32
3.6.3 使用constexpr定義常量表達式 33
3.6.4 使用consteval定義C++20即時函數(shù) 34
3.6.5 枚舉 35
3.6.6 域限定枚舉 37
3.6.7 使用#define定義常量 37
3.7 不能用作常量或變量名的關鍵字 37
3.8 總結 38
3.9 問與答 38
3.10 作業(yè) 39
3.10.1 測驗 39
3.10.2 練習 40
第4章 管理數(shù)組和字符串 41
4.1 什么是數(shù)組 41
4.1.1 為何需要數(shù)組 41
4.1.2 聲明和初始化靜態(tài)數(shù)組 42
4.1.3 數(shù)組中的數(shù)據(jù)是如何存儲的 42
4.1.4 訪問存儲在數(shù)組中的數(shù)據(jù) 43
4.1.5 修改存儲在數(shù)組中的數(shù)據(jù) 44
4.2 多維數(shù)組 46
4.2.1 聲明和初始化多維數(shù)組 46
4.2.2 訪問多維數(shù)組中的元素 47
4.3 動態(tài)數(shù)組 48
4.4 C風格字符串 49
4.5 C++字符串:使用std::string 51
4.6 總結 52
4.7 問與答 53
4.8 作業(yè) 53
4.8.1 測驗 53
4.8.2 練習 53
第5章 使用表達式、語句和運算符 54
5.1 語句 54
5.2 復合語句(語句塊) 55
5.3 使用運算符 55
5.3.1 賦值運算符(=) 55
5.3.2 理解左值和右值 55
5.3.3 加法運算符(+)、減法運算符( )、乘法運算符(*)、除法運算符(/)和求模運算符(%) 55
5.3.4 遞增運算符(++)和遞減運算符( ) 56
5.3.5 使用前綴還是后綴 57
5.3.6 相等運算符(==)和不等運算符(!=) 58
5.3.7 關系運算符 58
5.3.8 C++20三向比較運算符 60
5.3.9 邏輯運算NOT、AND、OR和XOR 62
5.3.10 使用C++邏輯運算符!、 &&和|| 63
5.3.11 按位運算符~、&、|和^ 66
5.3.12 按位右移運算符(>>)和左移 運算符(<<) 67
5.3.13 復合賦值運算符 68
5.3.14 使用運算符sizeof( )確定特定類型 變量占用的內(nèi)存量 70
5.3.15 運算符的優(yōu)先級和結合性 71
5.4 總結 72
5.5 問與答 72
5.6 作業(yè) 73
5.6.1 測驗 73
5.6.2 練習 73
第6章 控制程序流程 74
6.1 使用if...else有條件地執(zhí)行 74
6.1.1 使用if…else進行條件編程 75
6.1.2 有條件地執(zhí)行語句塊 76
6.1.3 嵌套if語句 78
6.1.4 使用switch-case進行條件處理 81
6.1.5 使用運算符 :進行條件處理 83
6.2 在循環(huán)中執(zhí)行代碼 84
6.2.1 不成熟的goto循環(huán) 85
6.2.2 while循環(huán) 86
6.2.3 do…while循環(huán) 88
6.2.4 for循環(huán) 89
6.2.5 基于范圍的for循環(huán) 91
6.3 使用continue和break修改循環(huán)的行為 93
6.3.1 不結束的循環(huán)——無限循環(huán) 93
6.3.2 控制無限循環(huán) 94
6.4 編寫嵌套循環(huán) 96
6.4.1 使用嵌套循環(huán)遍歷多維數(shù)組 97
6.4.2 使用嵌套循環(huán)計算斐波那契數(shù)列 98
6.5 總結 99
6.6 問與答 100
6.7 作業(yè) 100
6.7.1 測驗 100
6.7.2 練習 100
第7章 使用函數(shù)組織代碼 102
7.1 為何需要函數(shù) 102
7.1.1 函數(shù)原型是什么 103
7.1.2 函數(shù)定義是什么 104
7.1.3 函數(shù)調(diào)用和實參是什么 104
7.1.4 編寫接收多個參數(shù)的函數(shù) 104
7.1.5 編寫沒有參數(shù)和返回值的函數(shù) 105
7.1.6 帶默認值的函數(shù)參數(shù) 106
7.1.7 遞歸函數(shù)——調(diào)用自己的函數(shù) 108
7.1.8 包含多條return語句的函數(shù) 109
7.2 使用函數(shù)處理不同類型的數(shù)據(jù) 110
7.2.1 函數(shù)重載 110
7.2.2 將數(shù)組傳遞給函數(shù) 112
7.2.3 按引用傳遞參數(shù) 113
7.3 微處理器如何處理函數(shù)調(diào)用 114
7.3.1 內(nèi)聯(lián)函數(shù) 115
7.3.2 自動推斷返回類型 116
7.3.3 lambda函數(shù) 117
7.4 總結 118
7.5 問與答 118
7.6 作業(yè) 119
7.6.1 測驗 119
7.6.2 練習 119
第8章 闡述指針和引用 121
8.1 什么是指針 121
8.1.1 聲明指針 122
8.1.2 使用引用運算符(&)獲取變量的地址 122
8.1.3 使用指針存儲地址 123
8.1.4 使用解除引用運算符(*)訪問指向的數(shù)據(jù) 124
8.1.5 指針占用的內(nèi)存量 126
8.2 動態(tài)內(nèi)存分配 127
8.2.1 使用new和delete動態(tài)地分配和釋放內(nèi)存 128
8.2.2 將遞增和遞減運算符(++和 )用于指針的結果 130
8.2.3 將關鍵字const用于指針 132
8.2.4 將指針傳遞給函數(shù) 133
8.2.5 數(shù)組和指針的類似之處 134
8.3 使用指針時常犯的編程錯誤 136
8.3.1 內(nèi)存泄漏 136
8.3.2 指針指向無效的內(nèi)存單元 136
8.3.3 懸浮指針(也叫迷途或失控指針) 137
8.3.4 檢查使用new發(fā)出的分配請求是否得到滿足 138
8.4 指針編程最佳實踐 140
8.5 引用是什么 140
8.5.1 是什么讓引用很有用 141
8.5.2 將關鍵字const用于引用 143
8.5.3 按引用向函數(shù)傳遞參數(shù) 143
8.6 總結 144
8.7 問與答 144
8.8 作業(yè) 145
8.8.1 測驗 145
8.8.2 練習 145
第二部分 C++面向對象編程基礎
第9章 類和對象 148
9.1 類和對象 148
9.1.1 聲明類 148
9.1.2 作為類實例的對象 149
9.1.3 使用句點運算符(.)訪問成員 149
9.1.4 使用指針運算符(->)訪問成員 150
9.2 關鍵字public和private 151
9.3 構造函數(shù) 154
9.3.1 聲明和實現(xiàn)構造函數(shù) 154
9.3.2 何時及如何使用構造函數(shù) 155
9.3.3 重載構造函數(shù) 156
9.3.4 沒有默認構造函數(shù)的類 157
9.3.5 帶默認值的構造函數(shù)參數(shù) 158
9.3.6 包含初始化列表的構造函數(shù) 159
9.4 析構函數(shù) 161
9.4.1 聲明和實現(xiàn)析構函數(shù) 161
9.4.2 何時及如何使用析構函數(shù) 162
9.5 復制構造函數(shù) 163
9.5.1 淺復制及其存在的問題 164
9.5.2 使用復制構造函數(shù)確保深復制 166
9.5.3 使用移動構造函數(shù)改善性能 169
9.6 構造函數(shù)和析構函數(shù)的其他用途 170
9.6.1 不允許復制的類 170
9.6.2 只能有一個實例的單例類 170
9.6.3 禁止在棧中實例化的類 172
9.6.4 使用構造函數(shù)進行類型轉換 174
9.7 this指針 176
9.8 將sizeof( )用于類 176
9.9 結構不同于類的地方 178
9.10 聲明友元 179
9.11 共用體:一種特殊的數(shù)據(jù)存儲機制 180
9.11.1 聲明共用體 180
9.11.2 在什么情況下使用共用體 181
9.12 對類和結構使用聚合初始化 183
9.13 總結 186
9.14 問與答 186
9.15 作業(yè) 187
9.15.1 測驗 187
9.15.2 練習 187
第 10章 實現(xiàn)繼承 188
10.1 繼承基礎 188
10.1.1 繼承和派生 189
10.1.2 C++派生語法 189
10.1.3 訪問限定符protected 191
10.1.4 基類初始化——向基類傳遞參數(shù) 193
10.1.5 在派生類中覆蓋基類的方法 195
10.1.6 調(diào)用基類中被覆蓋的方法 197
10.1.7 在派生類中調(diào)用基類的方法 197
10.1.8 在派生類中隱藏基類的方法 199
10.1.9 構造順序 201
10.1.10 析構順序 201
10.2 私有繼承 203
10.3 保護繼承 205
10.4 切除問題 207
10.5 多繼承 208
10.6 使用final禁止繼承 210
10.7 總結 210
10.8 問與答 211
10.9 作業(yè) 211
10.9.1 測驗 211
10.9.2 練習 211
第 11章 多態(tài) 213
11.1 多態(tài)基礎 213
11.1.1 為何需要多態(tài)行為 213
11.1.2 使用虛函數(shù)實現(xiàn)多態(tài)行為 214
11.1.3 為何需要虛構造函數(shù) 216
11.1.4 虛函數(shù)的工作原理——理解虛函數(shù)表 219
11.1.5 抽象基類和純虛函數(shù) 222
11.2 使用虛繼承解決菱形問題 224
11.3 使用限定符override明確覆蓋意圖 227
11.4 使用final來禁止覆蓋函數(shù) 228
11.5 可將復制構造函數(shù)聲明為虛函數(shù)嗎 229
11.6 總結 232
11.7 問與答 232
11.8 作業(yè) 233
11.8.1 測驗 233
11.8.2 練習 233
第 12章 運算符類型與運算符重載 234
12.1 C++運算符 234
12.2 單目運算符 235
12.2.1 單目運算符的類型 235
12.2.2 單目遞增與單目遞減運算符 235
12.2.3 轉換運算符 238
12.2.4 解除引用運算符(*)和成員選擇 運算符(->) 240
12.3 雙目運算符 241
12.3.1 雙目運算符的類型 242
12.3.2 雙目加法與雙目減法運算符 242
12.3.3 實現(xiàn)運算符+=與 = 244
12.3.4 重載相等運算符(==)和不等 運算符(!=) 245
12.3.5 重載運算符<、>、<=和>= 247
12.3.6 C++20三向比較運算符 (<=>) 250
12.3.7 重載復制賦值運算符(=) 252
12.3.8 索引運算符 255
12.4 函數(shù)運算符( ) 257
12.5 用于高性能編程的移動構造函數(shù)和 移動賦值運算符 258
12.5.1 不必要的復制帶來的問題 258
12.5.2 聲明移動構造函數(shù)和移動賦值 運算符 258
12.6 用戶定義的字面量 263
12.7 不能重載的運算符 265
12.8 總結 265
12.9 問與答 265
12.10 作業(yè) 266
12.10.1 測驗 266
12.10.2 練習 266
第 13章 類型轉換運算符 267
13.1 為何需要類型轉換 267
13.2 為何有些C++程序員不喜歡C風格 類型轉換 268
13.3 C++類型轉換運算符 268
13.3.1 使用static_cast 268
13.3.2 使用dynamic_cast和運行階段類型識別 269
13.3.3 使用reinterpret_cast 272
13.3.4 使用const_cast 272
13.4 C++類型轉換運算符存在的問題 273
13.5 總結 274
13.6 問與答 274
13.7 作業(yè) 275
13.7.1 測驗 275
13.7.2 練習 275
第 14章 宏和模板簡介 276
14.1 預處理器與編譯器 276
14.2 使用#define定義常量 276
14.3 使用#define編寫宏函數(shù) 279
14.3.1 為什么要使用括號 280
14.3.2 使用assert宏驗證表達式 281
14.3.3 使用宏函數(shù)的優(yōu)點和缺點 282
14.4 模板簡介 283
14.4.1 模板聲明語法 283
14.4.2 各種類型的模板聲明 283
14.4.3 模板函數(shù) 284
14.4.4 模板與類型安全 285
14.4.5 模板類 286
14.4.6 聲明包含多個參數(shù)的模板 286
14.4.7 聲明包含默認參數(shù)的模板 287
14.4.8 一個模板類示例:HoldsPair 287
14.4.9 模板的實例化和具體化 289
14.4.10 模板類和靜態(tài)成員 290
14.4.11 參數(shù)數(shù)量可變的模板 291
14.4.12 使用static_assert執(zhí)行編譯階段 檢查 294
14.4.13 在實際C++編程中使用模板 295
14.5 總結 295
14.6 問與答 296
14.7 作業(yè) 296
14.7.1 測驗 296
14.7.2 練習 296
第三部分 學習標準模板庫
第 15章 標準模板庫簡介 298
15.1 STL容器 298
15.1.1 順序容器 298
15.1.2 關聯(lián)容器 299
15.1.3 容器適配器 299
15.2 STL迭代器 300
15.3 STL算法 300
15.4 使用迭代器在容器和算法之間交互 300
15.5 選擇正確的容器 302
15.6 STL字符串類 303
15.7 總結 303
15.8 問與答 303
15.9 作業(yè) 304
第 16章 STL string類 305
16.1 為何需要字符串操作類 305
16.2 使用STL string類 306
16.2.1 實例化和復制STL string 306
16.2.2 訪問std::string的字符內(nèi)容 308
16.2.3 拼接字符串 310
16.2.4 在string中查找字符或子 字符串 311
16.2.5 截短STL string 312
16.2.6 字符串反轉 314
16.2.7 字符串的大小寫轉換 315
16.3 基于模板的STL string實現(xiàn) 316
16.4 std::string中的operator ""s 316
16.5 使用C++20改進了的
std::string_view 317
16.6 總結 318
16.7 問與答 319
16.8 作業(yè) 319
16.8.1 測驗 319
16.8.2 練習 319
第 17章 STL動態(tài)數(shù)組類 320
17.1 std::vector的特點 320
17.2 典型的vector操作 320
17.2.1 實例化vector 320
17.2.2 使用push_back( )在vector末尾 插入元素 322
17.2.3 列表初始化 322
17.2.4 使用insert( )在指定位置 插入元素 323
17.2.5 使用數(shù)組語法訪問vector中的 元素 325
17.2.6 使用指針語法訪問vector中的 元素 326
17.2.7 刪除vector中的元素 327
17.3 理解大小和容量 328
17.4 STL deque 類 329
17.5 總結 332
17.6 問與答 332
17.7 作業(yè) 333
17.7.1 測驗 333
17.7.2 練習 333
第 18章 STL list和forward_list 334
18.1 std::list的特點 334
18.2 基本的list操作 334
18.2.1 實例化std::list對象 334
18.2.2 在list開頭或末尾插入元素 336
18.2.3 在list中間插入元素 337
18.2.4 刪除list中的元素 339
18.3 對list中的元素進行反轉和排序 340
18.3.1 使用list::reverse( )反轉元素的 排列順序 340
18.3.2 對元素進行排序 341
18.3.3 對包含對象的list進行排序以及 刪除其中的元素 343
18.3.4 std::forward_list 345
18.4 總結 347
18.5 問與答 347
18.6 作業(yè) 348
18.6.1 測驗 348
18.6.2 練習 348
第 19章 STL set和multiset 349
19.1 簡介 349
19.2 STL set和multiset的基本操作 349
19.2.1 實例化std::set對象 350
19.2.2 在set或multiset中插入 元素 351
19.2.3 在STL set或multiset中查找 元素 353
19.2.4 刪除STL set或multiset中的 元素 354
19.3 使用STL set和multiset的優(yōu)缺點 358
19.4 總結 360
19.5 問與答 361
19.6 作業(yè) 361
19.6.1 測驗 361
19.6.2 練習 361
第 20章 STL map和multimap 362
20.1 STL映射類簡介 362
20.2 STL map和multimap的基本操作 363
20.2.1 實例化std::map和 std::multimap 363
20.2.2 在STL map或multimap中 插入元素 364
20.2.3 在STL map中查找元素 366
20.2.4 在STL multimap中查找元素 368
20.2.5 刪除STL map或multimap中的 元素 369
20.3 提供自定義的排序謂詞 371
20.4 基于鍵值對的STL散列表容器 374
20.4.1 散列表的工作原理 374
20.4.2 使用unordered_map和 unordered_multimap 374
20.5 總結 377
20.6 問與答 378
20.7 作業(yè) 378
20.7.1 測驗 378
20.7.2 練習 379
第四部分 lambda表達式和STL算法
第 21章 理解函數(shù)對象 382
21.1 函數(shù)對象與謂詞的概念 382
21.2 函數(shù)對象的典型用途 382
21.2.1 一元函數(shù) 382
21.2.2 一元謂詞 386
21.2.3 二元函數(shù) 387
21.2.4 二元謂詞 389
21.3 總結 391
21.4 問與答 392
21.5 作業(yè) 392
21.5.1 測驗 392
21.5.2 練習 392
第 22章 lambda表達式 393
22.1 lambda表達式是什么 393
22.2 如何定義lambda表達式 394
22.2.1 捕獲變量 394
22.2.2 參數(shù) 394
22.2.3 返回類型 395
22.3 一元函數(shù)對應的lambda表達式 395
22.4 一元謂詞對應的lambda表達式 396
22.5 通過捕獲列表接收狀態(tài)的lambda 表達式 397
22.6 二元函數(shù)對應的lambda表達式 399
22.7 二元謂詞對應的lambda表達式 400
22.8 總結 402
22.9 問與答 402
22.10 作業(yè) 402
22.10.1 測驗 403
22.10.2 練習 403
第 23章 STL算法 404
23.1 什么是STL算法 404
23.2 STL算法的分類 404
23.2.1 非變序算法 404
23.2.2 變序算法 405
23.3 使用STL算法 406
23.3.1 根據(jù)值或條件查找元素 406
23.3.2 計算包含給定值或滿足給定條件的元素數(shù) 408
23.3.3 在集合中搜索元素或序列 409
23.3.4 將容器中的元素初始化為 指定值 411
23.3.5 使用std::generate( )將元素設置為運行階段生成的值 412
23.3.6 使用for_each( )處理指定范圍內(nèi)的元素 414
23.3.7 使用std::transform( )對范圍進行變換 415
23.3.8 復制和刪除操作 417
23.3.9 替換值以及替換滿足給定條件的元素 420
23.3.10 對集合進行排序以及在有序集合中搜索和刪除重復元素 421
23.3.11 將范圍分區(qū) 423
23.3.12 在有序集合中插入元素 424
23.3.13 使用C++20引入的std:: accumulate( )執(zhí)行累積操作 426
23.4 C++20約束算法 426
23.5 總結 428
23.6 問與答 428
23.7 作業(yè) 429
23.7.1 測驗 429
23.7.2 練習 429
第 24章 自適應容器:棧和隊列 430
24.1 棧和隊列的行為特征 430
24.1.1 !430
24.1.2 隊列 431
24.2 使用STL stack類 431
24.2.1 實例化stack 431
24.2.2 stack的成員函數(shù) 432
24.2.3 使用push( )和pop( )在棧頂插入和刪除元素 433
24.3 使用STL queue類 434
24.3.1 實例化queue 434
24.3.2 queue的成員函數(shù) 435
24.3.3 使用push( )在隊尾插入以及使用pop( )從隊首刪除 436
24.4 使用STL優(yōu)先級隊列 437
24.4.1 實例化priority_queue類 437
24.4.2 priority_queue的成員函數(shù) 438
24.4.3 使用push( )在priority_queue末尾插入以及使用pop( )在priority_queue開頭刪除 439
24.5 總結 441
24.6 問與答 441
24.7 作業(yè) 441
24.7.1 測驗 441
24.7.2 練習 441
第 25章 使用STL位標志 442
25.1 bitset類 442
25.2 使用std::bitset及其成員 443
25.2.1 std::bitset中很有用的運算符 443
25.2.2 std::bitset的成員方法 444
25.3 vector
你還可能感興趣
我要評論
|