目 錄 Contents
序
前言
致C語言程序員
第一部分 C 語言核心
第1章 啟動和運行2
1.1 C 程序的基本結構2
1.1.1 創(chuàng)建第一個C 源文件3
1.1.2 main函數:C 程序的入口點3
1.1.3 程序庫:引入外部代碼3
1.2 編譯器工具鏈4
1.2.1 設置開發(fā)環(huán)境4
1.2.2 Windows 10以及后續(xù)版本:
Visual Studio5
1.2.3 macOS: Xcode6
1.2.4 Linux和GCC7
1.2.5 文本編輯器10
1.3 開始認識C 11
1.3.1 C 類型系統(tǒng)11
1.3.2 聲明變量11
1.3.3 初始化變量的狀態(tài)11
1.3.4 條件語句12
1.3.5 函數14
1.3.6 printf格式指定符15
1.3.7 重新審視step_function16
1.3.8 注釋 17
1.4 調試18
1.4.1 Visual Studio18
1.4.2 Xcode19
1.4.3 用GDB和LLDB對GCC和
Clang進行調試20
1.5 總結23
練習23
拓展閱讀24
第2章 類型25
2.1 基本類型25
2.1.1 整數類型25
2.1.2 浮點類型28
2.1.3 字符類型30
2.1.4 布爾類型31
2.1.5 std::byte類型33
2.1.6 size_t類型34
2.1.7 void35
2.2 數組35
2.2.1 數組初始化35
2.2.2 訪問數組元素35
2.2.3 for循環(huán)簡介36
2.2.4 C風格字符串38
2.3 用戶自定義類型41
2.3.1 枚舉類型41
2.3.2 普通數據類44
2.3.3 聯(lián)合體45
2.4 全功能的C 類46
2.4.1 方法47
2.4.2 訪問控制47
2.4.3 構造函數49
2.4.4 初始化51
2.4.5 析構函數55
2.5 總結56
練習56
拓展閱讀56
第3章 引用類型57
3.1 指針57
3.1.1 尋址變量58
3.1.2 指針解引用59
3.1.3 成員指針運算符60
3.1.4 指針和數組61
3.1.5 指針很危險63
3.1.6 void指針和std::byte指針65
3.1.7 nullptr和布爾表達式65
3.2 引用65
3.3 指針和引用的使用66
3.3.1 前向鏈表:經典的基于指針的
數據結構66
3.3.2 使用引用68
3.3.3 this指針69
3.3.4 const正確性69
3.3.5 const成員變量71
3.3.6 成員初始化列表71
3.4 auto類型推斷72
3.4.1 用auto進行初始化73
3.4.2 auto和引用類型73
3.4.3 auto和代碼重構73
3.5 總結74
練習74
拓展閱讀75
第4章 對象生命周期76
4.1 對象的存儲期76
4.1.1 分配、釋放和生命周期76
4.1.2 內存管理77
4.1.3 自動存儲期77
4.1.4 靜態(tài)存儲期77
4.1.5 線程局部存儲期80
4.1.6 動態(tài)存儲期81
4.2 追蹤對象的生命周期83
4.3 異常84
4.3.1 throw關鍵字84
4.3.2 使用try-catch代碼塊85
4.3.3 stdlib異常類86
4.3.4 異常處理88
4.3.5 用戶定義的異常89
4.3.6 noexcept關鍵字90
4.3.7 調用棧和異常90
4.4 SimpleString類92
4.4.1 追加和打印93
4.4.2 使用SimpleString94
4.4.3 組合SimpleString95
4.4.4 調用棧展開96
4.4.5 異常和性能98
4.4.6 異常的替代方法98
4.5 復制語義99
4.5.1 復制構造函數101
4.5.2 復制賦值103
4.5.3 默認復制105
4.5.4 復制指南106
4.6 移動語義106
4.6.1 復制行為可能浪費資源106
4.6.2 值類別108
4.6.3 左值引用和右值引用108
4.6.4 std::move函數109
4.6.5 移動構造110
4.6.6 移動賦值110
4.6.7 終成果111
4.6.8 編譯器生成的方法113
4.7 總結114
練習114
拓展閱讀115
第5章 運行時多態(tài)116
5.1 多態(tài)116
5.2 一個有啟發(fā)性的例子116
5.2.1 添加新的日志記錄器119
5.2.2 接口119
5.2.3 對象組合和實現繼承119
5.3 定義接口120
5.3.1 基類繼承120
5.3.2 成員繼承121
5.3.3 虛方法122
5.3.4 純虛類和虛析構函數124
5.3.5 實現接口125
5.3.6 使用接口126
5.4 更新銀行日志記錄器126
5.4.1 構造函數注入127
5.4.2 屬性注入127
5.4.3 構造函數注入和屬性注入的
選擇128
5.5 總結129
練習129
拓展閱讀129
第6章 編譯時多態(tài)130
6.1 模板130
6.2 聲明模板130
6.2.1 模板類定義131
6.2.2 模板函數定義131
6.2.3 實例化模板131
6.3 類型轉換函數132
6.3.1 const_cast132
6.3.2 static_cast133
6.3.3 reinterpret_cast134
6.3.4 narrow_cast134
6.4 mean:模板函數示例136
6.4.1 通用mean136
6.4.2 模板類型推斷138
6.5 SimpleUniquePointer:模板類
示例139
6.6 模板中的類型檢查142
6.7 concept143
6.7.1 定義concept143
6.7.2 類型特征144
6.7.3 約束要求146
6.7.4 從requires表達式構建
concept147
6.7.5 使用concept147
6.7.6 臨時requires表達式151
6.8 static_assert:concept之前的權宜
之計153
6.9 非類型模板參數154
6.10 可變參數模板156
6.11 高級模板主題156
6.11.1 模板特化156
6.11.2 名字綁定157
6.11.3 類型函數157
6.11.4 模板元編程157
6.12 模板源代碼組織157
6.13 運行時多態(tài)與編譯時多態(tài)對比158
6.14 總結158
練習158
拓展閱讀159
第7章 表達式160
7.1 運算符160
7.1.1 邏輯運算符160
7.1.2 算術運算符161
7.1.3 賦值運算符162
7.1.4 自增和自減運算符163
7.1.5 比較運算符163
7.1.6 成員訪問運算符164
7.1.7 三元條件運算符164
7.1.8 逗號運算符165
7.1.9 重載運算符165
7.1.10 重載運算符new167
7.1.11 運算符優(yōu)先級和結合性172
7.1.12 求值順序174
7.2 自定義字面量175
7.3 類型轉換175
7.3.1 隱式類型轉換176
7.3.2 顯式類型轉換178
7.3.3 C風格的類型轉換179
7.3.4 用戶自定義類型的轉換180
7.4 常量表達式181
7.4.1 有關色彩的示例182
7.4.2 關于constexpr的說明184
7.5 volatile表達式184
7.6 總結185
練習186
拓展閱讀186
第8章 語句187
8.1 表達式語句187
8.2 復合語句188
8.3 聲明語句189
8.3.1 函數189
8.3.2 命名空間192
8.3.3 類型別名195
8.3.4 結構化綁定197
8.3.5 屬性198
8.4 選擇語句199
8.4.1 if語句199
8.4.2 switch語句203
8.5 迭代語句204
8.5.1 while循環(huán)204
8.5.2 do-while循環(huán)205
8.5.3 for循環(huán)206
8.5.4 基于范圍的for循環(huán)208
8.6 跳轉語句211
8.6.1 break語句212
8.6.2 continue語句212
8.6.3 goto語句213
8.7 總結214
練習215
拓展閱讀215
第9章 函數216
9.1 函數聲明216
9.1.1 前綴修飾符216
9.1.2 后綴修飾符217
9.2 auto返回類型220
9.3 auto和函數模板220
9.4 重載解析221
9.5 可變參數函數222
9.6 可變參數模板223
9.6.1 用參數包編程223
9.6.2 再談sum函數224
9.6.3 折疊表達式225
9.7 函數指針225
9.7.1 聲明函數指針225
9.7.2 類型別名和函數指針226
9.8 函數調用運算符227
9.9 計數例子227
9.10 lambda表達式229
9.10.1 用法229
9.10.2 參數和表達式體230
9.10.3 默認參數231
9.10.4 泛型232
9.10.5 返回類型233
9.10.6 捕獲列表233
9.10.7 constexpr lambda表達式239
9.11 std :: function 239
9.11.1 聲明函數239
9.11.2 擴展示例240
9.12 main函數和命令行242
9.12.1 main的三個重載變體242
9.12.2 程序參數243
9.12.3 更深入的例子244
9.12.4 退出狀態(tài)246
9.13 總結246
練習246
拓展閱讀247
第二部分 C 庫和框架
第10章 測試250
10.1 單元測試250
10.1.1 集成測試250
10.1.2 驗收測試251
10.1.3 性能測試251
10.2 擴展示例:汽車制動服務251
10.2.1 實現AutoBrake253
10.2.2 測試驅動開發(fā)254
10.2.3 添加服務總線接口264
10.3 單元測試框架和模擬框架270
10.3.1 Catch單元測試框架270
10.3.2 Google Test276
10.3.3 Boost Test282
10.3.4 總結:測試框架287
10.4 模擬框架287
10.4.1 Google Mock289
10.4.2 HippoMocks296
10.4.3 其他模擬框架:FakeIt和
Trompeloeil300
10.5 總結300
練習301
拓展閱讀302
第11章 智能指針303
11.1 智能指針概述303
11.2 智能指針所有權304
11.3 作用域指針304
11.3.1 構造304
11.3.2 引入Oath Breaker304
11.3.3 基于所有權的隱式布爾轉換305
11.3.4 RAII包裝器306
11.3.5 指針語義306
11.3.6 與nullptr比較307
11.3.7 交換307
11.3.8 重置和替換scoped_ptr308
11.3.9 不可轉移性309
11.3.10 boost::scoped_array309
11.3.11 支持的部分操作310
11.4 獨占指針310
11.4.1 構造311
11.4.2 支持的操作311
11.4.3 可轉移的專屬所有權311
11.4.4 獨占數組312
11.4.5 刪除器313
11.4.6 自定義刪除器和系統(tǒng)編程313
11.4.7 支持的部分操作315
11.5 共享指針31