C++ 沉思錄 (Ruminations on C++: A Decade of Programming Insight and Experience)
內容描述
《C++沉思錄》基於作者在知名技術雜志發表的技術文章、世界各地發表的演講以及斯坦福大學的課程講義整理、
寫作而成,融聚了作者10多年C++程序生涯的真知灼見。
《C++沉思錄》分為6篇,共32章,分別對C++語言的歷史和特點、類和繼承、STL與泛型編程、
庫的設計等幾大技術話題進行了詳細而深入的討論,細微之處幾乎涵蓋了C++所有的設計思想和技術細節。
本書通過精心挑選的實例,向讀者傳達先進的程序設計方法和理念。
《C++沉思錄》適合有一定經驗的C++程序員閱讀學習,
可以幫助他們提升技術能力,成為C++程序設計的高手。
目錄大綱
目錄
第0章序幕1
0.1第一次嘗試1
0.2不用類來實現4
0.3為什麼用C++更簡單5
0.4一個更大的例子5
0.5小結6
第一篇動機
第1章為什麼我用C++ 9
1.1問題9
1.2歷史背景10
1.3自動軟件發布10
1.4進入C++ 13
1.5重複利用的軟件17
1.6後記18
第2章為什麼用C++工作19
2.1小項目的成功19
2.2抽象21
2.3機器應該為人服務23
第3章生活在現實世界中25
第二篇類和繼承
第4章類設計者的核查表31
第5章代理類39
5.1問題39
5.2經典解決方案40
5.3虛複製函數41
5.4定義代理類42
5.5小結44
第6章句柄:第一部分45
6.1問題45
6.2一個簡單的類46
6.3綁定到句柄47
6.4獲取對象48
6.5簡單的實現48
6.6引用計數型句柄49
6.7寫時復制51
6.8討論52
第7章句柄:第二部分55
7.1回顧56
7.2分離引用計數57
7.3對引用計數的抽象58
7.4存取函數和寫時復制61
7.5討論61
第8章一個面向對象程序範例63
8.1問題描述63
8.2面向對象的解決方案64
8.3句柄類67
8.4擴展1:新操作69
8.5擴展2:增加新的節點類型72
8.6反思73
第9章一個課堂練習的分析(上) 75
9.1問題描述75
9.2接口設計77
9.3補遺79
9.4測試接口80
9 .5策略81
9.6方案81
9.7圖像的組合85
9.8小結87
第10章一個課堂練習的分析(下) 89
10.1策略89
10.2體驗設計的靈活性102
10.3小結105
第11章什麼時候不應當使用虛函數107
11.1適用的情況107
11.2不適用的情況108
11.3析構函數很特殊113
11.4小結114
第三篇模板
第12章設計容器類117
12.1包含什麼117
12.2複製容器意味著什麼118
12.3怎樣獲取容器的元素121
12.4怎樣區分讀和寫121
12.5怎樣處理容器的增長123
12.6容器支持哪些操作124
12.7怎樣設想容器元素的類型124
12.8容器和繼承125
12.9設計一個類似數組的類126
第13章訪問容器中的元素131
13.1模擬指針131
13.2獲取數據132
13.3遺留問題135
13.4指向const Array的Pointer 139
13.5有用的增強操作140
第14章迭代器145
14.1完成Pointer類145
14.2什麼是迭代器148
14.3刪除元素149
14.4刪除容器150
14.5其他設計考慮151
14.6討論151
第15章序列153
15.1技術狀況153
15.2基本的傳統觀點154
15.3增加一些額外操作159
15.4使用範例162
15.5再增加一些166
15.6請你思考167
第16章作為接口的模板169
16.1問題169
16.2第一個例子170
16.3分離迭代方式170
16.4遍歷任意類型172
16.5增加其他類型173
16 .6將存儲技術抽象化174
16.7實證177
16.8小結178
第17章模板和泛型算法179
17.1一個特例180
17.2泛型化元素類型180
17.3推遲計數181
17. 4地址獨立性183
17.5查找非數組184
17.6討論185
第18章泛型迭代器187
18.1一個不同的算法187
18.2需求的分類189
18.3輸入迭代器190
18.4輸出迭代器190
18.5前向迭代器191
18.6雙向迭代器191
18.7隨機存取迭代器192
18.8是繼承嗎193
18.9性能193
18.10小結194
第19章使用泛型迭代器195
19.1迭代器類型196
19.2虛擬序列196
19.3輸出流迭代器199
19.4輸入流迭代器200
19.5討論204
第20章迭代器配接器205
20.1一個例子205
20.2方向不對稱性207
20.3一致性和不對稱性208
20.4自動反向209
20.5討論211
第21章函數對象213
21.1一個例子213
21.2函數指針216
21.3函數對象218
21.4函數對像模板219
21.5隱藏中間類型220
21.6一種類型包羅萬象221
21.7實現222
21.8討論224
第22章函數配接器225
22.1為什麼是函數對象225
22.2用於內建操作符的函數對象226
22.3綁定者(Binders) 227
22.4更深入地探討228
22.5接口繼承229
22.6使用這些類230
22.7討論231
第四篇庫
第23章日常使用的庫235
23 .1問題235
23.2理解問題:第1部分237
23.3實現:第1部分237
23.4理解問題:第2部分239
23.5實現:第2部分240
23.6討論242
第24章一個庫接口設計實例243
24.1複雜問題244
24.2優化接口245
24.3溫故知新246
24.4編寫代碼247
24.5小結249
第25章庫設計就是語言設計251
25.1字符串251
25.2內存耗盡252
25.3複製255
25.4隱藏實現257
25.5缺省構造函數259
25.6其他操作260
25.7子字符串262
25.8小結263
第26章語言設計就是庫設計265
26.1抽像數據類型265
26.2庫和抽像數據類型266
26.3內存分配269
26.4按成員賦值(memberwise assignment)和初始化270
26.5異常處理272
26.6小結272
第五篇技術
第27章自己跟踪自己的類275
27.1設計一個跟踪類275
27.2創建死代碼278
27.3生成對象的審計跟踪279
27.4驗證容器行為281
27.5小結286
第28章在簇中分配對象287
28.1問題287
28.2設計方案287
28.3實現290
28.4加入繼承292
28.5小結293
第29章應用器、操縱器和函數對象295
29.1問題295
29.2一種解決方案297
29.3另一種不同的解決方案298
29.4多個參數299
29.5一個例子301
29.6簡化302
29.7思考303
29.8歷史記錄、參考資料和致謝304
第30章將應用程序庫從輸入輸出中分離出來305
30.1問題305
30.2解決方案1:技巧加蠻力306
30 .3解決方案2:抽象輸出307
30.4解決方案3:技巧而無蠻力309
30.5評論311
第六篇總結
第31章通過複雜性獲取簡單性315
31.1世界是複雜的315
31 .2複雜性變得隱蔽316
31.3計算機也是一樣316
31.4計算機解決實際問題317
31.5類庫和語言語義318
31.6很難使事情變得容易319
31.7抽象和接口320
31.8複雜度的守恆321
第32章說了Hello world後再做什麼323
32.1找當地的專家323
32.2選一種工具包並適應它324
32.3 C的某些部分是必需的324
32.4 C的其他部分不是必需的325
32.5給自己設一些問題327
32.6小結329
附錄Koenig和Moo夫婦訪談331
作者介紹
Andrew Koenig
AT&T大規模程序研發部(前貝爾實驗室)成員。
他從1986年開始從事C語言的研究,1977年加入貝爾實驗室。
他編寫了一些早期的類庫,並在1988年組織召開了第一個具有相當規模的C++會議。
在ISO/ANSI C++委員會成立的1989年,他就加入了該委員會,並一直擔任項目編輯。
他已經發表了100多篇C++方面的論文,並在Addsion-Wesley出版了C Traps and Pitfalls 一書(中文版名為《C缺陷與陷阱》,
由人民郵電出版社出版),還應邀到世界各地演講。
Barbara Moo
AT&T網絡體系結構部門負責人。
在1983年加入貝爾實驗室不久,她開始從事Fortran 77編譯器的研究工作,這是第一個用C++編寫的商業產品。
她一直負責AT&T的C++編譯器項目,直到AT&T賣掉它的軟件業務。
她還為SIG會議、Lund技術學院和斯坦福大學提供輔導課程。
Anderw Koenig和Barbara Moo不僅有著多年的C++開發、研究和教學經驗,而且還親身參與了C++的演化和變革,對C++的變化和發展產生了重要的影響。