圖書推薦
《C++沉思錄》適合有一定經驗的C++程式設計師閱讀學習,可以幫助讀者加強提高技術能力,成為C++程式設計的高手。
Koenig 和MOO的《C++沉思錄》將會為許多人提供有用的幫助。對於C++是什麼樣的以及能夠做些什麼,他們的先見之明在這本書里隨處可見。
作者簡介
Andrew Koenig 和 Barbara E.Moo是夫妻.
Andrew Koenig 是AT&T公司Shannon實驗室大規模編程研究部門中的成員,同時也是C++標準委員會的項目編輯。他的編程經驗超過30年,其中有15年在使用C++,他已經出版了超過150 篇和C++有關的論文,並且在世界範圍內就這個主題進行過多次演講。
Barbara E.Moo 是獨立諮詢顧問,在軟體領域中擁有超過20年的工作經驗的獨立諮詢顧問。在AT&Tm作的近15年中,她參與了第一個使用C++編寫的商業產品的開發,領導了公司中第一個C++編譯器項目,管理了AT&T中廣受讚譽的World Net Internet Service Business的開發。
圖書目錄
序幕 1
0.1 第一次嘗試 1
0.1.1 改進 2
0.1.2 另一種改進 3
0.2 不用類來實現 4
0.3 為什麼用C++更簡單 5
0.4 一個更大的例子 6
0.5 結論 6
第一篇 動機
第1章 為什麼我用C++ 11
1.1 問題 11
1.2 歷史背景 12
1.3 自動軟體發布 12
1.3.1 可靠性與通用性 13
1.3.2 為什麼用C 14
1.3.3 應付快速增長 15
1.4 進入C++ 15
1.5 重複利用的軟體 20
1.6 後記 21
第2章 為什麼用C++工作 23
2.1 小項目的成功 23
2.1.1 開銷 24
2.1.2 質疑軟體工廠 24
2.2 抽象 25
2.2.1 有些抽象不是語言的一部分 26
2.2.2 抽象和規範 26
2.2.3 抽象和記憶體管理 27
2.3 機器應該為人服務 28
第3章 生活在現實世界中 29
第二篇 類和繼承
第4章 類設計者的核查表 37
第5章 代理類 47
5.1 問題 47
5.2 經典解決方案 48
5.3 虛複製函式 49
5.4 定義代理類 50
5.5 小結 53
第6章 句柄:第一部分 55
6.1 問題 55
6.2 一個簡單的類 56
6.3 綁定到句柄 58
6.4 獲取對象 58
6.5 簡單的實現 59
6.6 引用計數型句柄 60
6.7 寫時複製 62
6.8 討論 63
第7章 句柄:第二部分 67
7.1 回顧 68
7.2 分離引用計數 69
7.3 對引用計數的抽象 70
7.4 存取函式和寫時複製 73
7.5 討論 73
第8章 一個面向對象程式範例 75
8.1 問題描述 75
8.2 面向對象的解決方案 76
8.3 句柄類 79
8.4 擴展1:新操作 82
8.5 擴展2:增加新的節點類型 85
8.6 反思 86
第9章 一個課堂練習的分析(上) 89
9.1 問題描述 89
9.2 接口設計 91
9.3 補遺 93
9.4 測試接口 94
9.5 策略 95
9.6 方案 96
9.7 圖像的組合 99
9.8 結論 102
第10章 一個課堂練習的分析(下) 103
10.1 策略 103
10.1.1 方案 104
10.1.2 記憶體分配 105
10.1.3 結構構造 107
10.1.4 顯示圖像 110
10.2 體驗設計的靈活性 116
10.3 結論 119
第11章 什麼時候不應當使用虛函式 121
11.1 適用的情況 121
11.2 不適用的情況 122
11.2.1 效率 122
11.2.2 你想要什麼樣的行為 125
11.2.3 不是所有的類都是通用的 127
11.3 析構函式很特殊 127
11.4 小結 129
第三篇 模板
第12章 設計容器類 133
12.1 包含什麼 133
12.2 複製容器意味著什麼 134
12.3 怎樣獲取容器的元素 137
12.4 怎樣區分讀和寫 138
12.5 怎樣處理容器的增長 139
12.6 容器支持哪些操作 141
12.7 怎樣構想容器元素的類型 141
12.8 容器和繼承 143
12.9 設計一個類似數組的類 144
第13章 訪問容器中的元素 151
13.1 模擬指針 151
13.2 獲取數據 153
13.3 遺留問題 155
13.4 指向const Array的Pointer 159
13.5 有用的增強操作 161
第14章 疊代器 167
14.1 完成Pointer類 167
14.2 什麼是疊代器 170
14.3 刪除元素 171
14.4 刪除容器 172
14.5 其他設計考慮 173
14.6 討論 174
第15章 序列 175
15.1 技術狀況 175
15.2 基本的傳統觀點 176
15.3 增加一些額外操作 181
15.4 使用範例 184
15.5 再增加一些 188
15.6 請你思考 190
第16章 作為接口的模板 191
16.1 問題 191
16.2 第一個例子 192
16.3 分離疊代方式 192
16.4 遍歷任意類型 195
16.5 增加其他類型 196
16.6 將存儲技術抽象化 196
16.7 實證 199
16.8 小結 200
第17章 模板和泛型算法 203
17.1 一個特例 204
17.2 泛型化元素類型 205
17.3 推遲計數 205
17.4 地址獨立性 207
17.5 查找非數組 208
17.6 討論 210
第18章 泛型疊代器 213
18.1 一個不同的算法 213
18.2 需求的分類 215
18.3 輸入疊代器 216
18.4 輸出疊代器 216
18.5 前向疊代器 217
18.6 雙向疊代器 218
18.7 隨機存取疊代器 218
18.8 是繼承嗎 220
18.9 性能 220
18.10 小結 221
第19章 使用泛型疊代器 223
19.1 疊代器類型 224
19.2 虛擬序列 224
19.3 輸出流疊代器 227
19.4 輸入流疊代器 229
19.5 討論 232
第20章 疊代器配接器 233
20.1 一個例子 233
20.2 方向不對稱性 235
20.3 一致性和不對稱性 236
20.4 自動反向 237
20.5 討論 240
第21章 函式對象 241
21.1 一個例子 241
21.2 函式指針 244
21.3 函式對象 246
21.4 函式對象模板 248
21.5 隱藏中間類型 249
21.6 一種類型包羅萬象 250
21.7 實現 251
21.8 討論 253
第22章 函式配接器 255
22.1 為什麼是函式對象 255
22.2 用於內建操作符的函式對象 256
22.3 綁定者(Binders) 257
22.4 更深入地探討 258
22.5 接口繼承 259
22.6 使用這些類 260
22.7 討論 261
第四篇 庫
第23章 日常使用的庫 265
23.1 問題 265
23.2 理解問題:第1部分 267
23.3 實現:第1部分 267
23.4 理解問題:第2部分 270
23.5 實現:第2 部分 270
23.6 討論 272
第24章 一個庫接口設計實例 275
24.1 複雜問題 276
24.2 最佳化接口 277
24.3 溫故知新 279
24.4 編寫代碼 280
24.5 結論 282
第25章 庫設計就是語言設計 283
25.1 字元串 283
25.2 記憶體耗盡 284
25.3 複製 287
25.4 隱藏實現 290
25.5 預設構造函式 292
25.6 其他操作 293
25.7 子字元串 295
25.8 結論 296
第26章 語言設計就是庫設計 297
26.1 抽象數據類型 297
26.1.1 構造函式與析構函式 297
26.1.2 成員函式及可見度控制 299
26.2 庫和抽象數據類型 299
26.2.1 類型安全的連結(linkage) 299
26.2.2 命名空間 300
26.3 記憶體分配 302
26.4 按成員賦值(memberwise assignment)和初始化 303
26.5 異常處理 305
26.6 小結 306
第五篇 技術
第27章 自己跟蹤自己的類 309
27.1 設計一個跟蹤類 309
27.2 創建死代碼 312
27.3 生成對象的審計跟蹤 313
27.4 驗證容器行為 315
27.5 小結 320
第28章 在簇中分配對象 321
28.1 問題 321
28.2 設計方案 321
28.3 實現 324
28.4 加入繼承 326
28.5 小結 327
第29章 套用器、操縱器和函式對象 329
29.1 問題 329
29.2 一種解決方案 332
29.3 另一種不同的解決方案 332
29.4 多個參數 334
29.5 一個例子 335
29.6 簡化 337
29.7 思考 338
29.8 歷史記錄、參考資料和致謝 339
第30章 將應用程式庫從輸入輸出中分離出來 341
30.1 問題 341
30.2 解決方案1:技巧加蠻力 342
30.3 解決方案2:抽象輸出 343
30.4 解決方案3:技巧,但無蠻力 345
30.5 評論 348
第六篇 總結
第31章 通過複雜性獲取簡單性 351
31.1 世界是複雜的 351
31.2 複雜性變得隱蔽 352
31.3 計算機也是一樣 353
31.4 計算機解決實際問題 354
31.5 類庫和語言語義 355
31.6 很難使事情變得容易 357
31.7 抽象和接口 357
31.8 複雜度的守恆 358
第32章 說了Hello world後再做什麼 361
32.1 找當地的專家 361
32.2 選一種工具包並適應它 362
32.3 C的某些部分是必需的 362
32.4 C的其他部分不是必需的 364
32.5 給自己設一些問題 366
32.6 結論 368
附錄 Koenig和Moo夫婦訪談 371
索引 377