《Effective C++最新改善程式與設計的55個具體做法》是2011年電子工業出版社出版的圖書,作者是Scott Meyers。
基本介紹
- 書名:Effective C++最新改善程式與設計的55個具體做法
- 作者:(美)Scott Meyers
- 原版名稱:Effective C++: 55 Specific Ways to Improve Your Programs and Designs (3rd Edition)
- 譯者:侯捷
- ISBN:9787121123320
- 頁數:336
- 出版社:電子工業出版社
- 出版時間:2011 年1月
- 開本:16開
編輯推薦,內容簡介,作譯者,目錄,譯者序,序言,
編輯推薦
傳承大師智慧 領悟技術本真
經典名著 翻譯良品 典藏不二之選
內容簡介
有人說c++程式設計師可以分為兩類,讀過effective c++的和沒讀過的。世界頂級c++大師scott meyers成名之作的第三版的確當得起這樣的評價。當您讀過這本書之後,就獲得了迅速提升自己c++功力的一個契機。
在國際上,本書所引起的反響,波及整個計算機技術的出版領域,餘音至今未絕。幾乎在所有c++書籍的推薦名單上,本書都會位於前三名。作者高超的技術把握力、獨特的視角、詼諧輕鬆的寫作風格、獨具匠心的內容組織,都受到極大的推崇和仿效。這種奇特的現象,只能解釋為人們對這本書衷心的讚美和推崇。
這本書不是讀完一遍就可以束之高閣的快餐讀物,也不是用以解決手邊問題的參考手冊,而是需要您去反覆閱讀體會的,c++是真正程式設計師的語言,背後有著精深的思想與無以倫比的表達能力,這使得它具有類似宗教般的魅力。希望這本書能夠幫您跨越c++的重重險阻,領略高處才有的壯美風光,做一個成功而快樂的c++程式設計師。
作譯者
Scott Meyers是全世界最知名的C++軟體開發專家之一。他是暢銷書《Effective C++》系列(Effective C++,More Effective C++,Effective STL)的作者,又是創新產品《Effective C++ CD》的設計者和作者,也是Addison-Wesley的“Effective Software Development Series”顧問編輯,以及《Software Development》雜誌諮詢板成員。他也為若干新公司的技術諮詢板提供服務。Meyers於1993年自Brown大學獲得計算機博士學位。侯捷是計算機技術書籍的作家、譯者、書評人
目錄
譯序 vii
中英簡繁術語對照 ix
目錄 xvii
序言 xxi
致謝 xxiii
導讀 1
1 讓自己習慣c++ 11
accustoming yourself to c++ 11
條款01:視c++ 為一個語言聯邦 11
view c++ as a federation of languages 11
條款02:儘量以const, enum, inline替換 #define 13
prefer consts,enums, and inlines to #defines 13
條款03:儘可能使用const 17
use const whenever possible 17
條款04:確定對象被使用前已先被初始化 26
make sure that objects are initialized before they're used 26
2 構造/析構/賦值運算 34
constructors, destructors, and assignment operators 34
條款05:了解c++ 默默編寫並調用哪些函式 34
know what functions c++ silently writes and calls 34
條款06:若不想使用編譯器自動生成的函式,就該明確拒絕 37
explicitly disallow the use of compiler-generated functions you do not want 37
條款07:為多態基類聲明virtual析構函式 40
declare destructors virtual in polymorphic base classes 40
條款08:別讓異常逃離析構函式 44
prevent exceptions from leaving destructors 44
條款09:絕不在構造和析構過程中調用virtual函式 48
never call virtual functions during construction or destruction 48
條款10:令operator= 返回一個reference to *this 52
have assignment operators return a reference to *this 52
條款11:在operator= 中處理“自我賦值” 53
handle assignment to self in operator= 53
條款12:複製對象時勿忘其每一個成分 57
copy all parts of an object 57
3 資源管理 61
resource management 61
條款13:以對象管理資源 61
use objects to manage resources 61
條款14:在資源管理類中小心copying行為 66
think carefully about copying behavior in resource-managing classes 66
條款15:在資源管理類中提供對原始資源的訪問 69
provide access to raw resources in resource-managing classes 69
條款16:成對使用new和delete時要採取相同形式 73
use the same form in corresponding uses of new and delete 73
條款17:以獨立語句將newed對象置入智慧型指針 75
store newed objects in smart pointers in standalone statements 75
4 設計與聲明 78
designs and declarations 78
條款18:讓接口容易被正確使用,不易被誤用 78
make interfaces easy to use correctly and hard to use incorrectly 78
條款19:設計class猶如設計type 84
treat class design as type design 84
條款20:寧以pass-by-reference-to-const替換pass-by-value 86
prefer pass-by-reference-to-const to pass-by-value 86
條款21:必須返回對象時,別妄想返回其reference 90
don't try to return a reference when you must return an object 90
條款22:將成員變數聲明為private 94
declare data members private 94
條款23:寧以non-member、non-friend替換member函式 98
prefer non-member non-friend functions to member functions 98
條款24:若所有參數皆需類型轉換,請為此採用non-member函式 102
declare non-member functions when type conversions should apply to all parameters 102
條款25:考慮寫出一個不拋異常的swap函式 106
consider support for a non-throwing swap 106
5 實現 113
implementations 113
條款26:儘可能延後變數定義式的出現時間 113
postpone variable definitions as long as possible 113
條款27:儘量少做轉型動作 116
minimize casting 116
條款28:避免返回handles指向對象內部成分 123
avoid returning "handles" to object internals 123
條款29:為“異常安全”而努力是值得的 127
strive for exception-safe code 127
條款30:透徹了解inlining的里里外外 134
understand the ins and outs of inlining 134
條款31:將檔案間的編譯依存關係降至最低 140
minimize compilation dependencies between files 140
6 繼承與面向對象設計 149
inheritance and object-oriented design 149
條款32:確定你的public繼承塑模出is-a關係 150
make sure public inheritance models "is-a " 150
條款33:避免遮掩繼承而來的名稱 156
avoid hiding inherited names 156
條款34:區分接口繼承和實現繼承 161
differentiate between inheritance of interface and inheritance of implementation 161
條款35:考慮virtual函式以外的其他選擇 169
consider alternatives to virtual functions 169
條款36:絕不重新定義繼承而來的non-virtual函式 178
never redefine an inherited non-virtual function 178
條款37:絕不重新定義繼承而來的預設參數值 180
never redefine a function's inherited default parameter value 180
條款38:通過複合塑模出has-a或"根據某物實現出" 184
model "has-a" or "is-implemented-in-terms-of" through composition 184
條款39:明智而審慎地使用private繼承 187
use private inheritance judiciously 187
條款40:明智而審慎地使用多重繼承 192
use multiple inheritance judiciously 192
7 模板與泛型編程 199
templates and generic programming 199
條款41:了解隱式接口和編譯期多態 199
understand implicit interfaces and compile-time polymorphism 199
條款42:了解typename的雙重意義 203
understand the two meanings of typename 203
條款43:學習處理模板化基類內的名稱 207
know how to access names in templatized base classes 207
條款44:將與參數無關的代碼抽離templates 212
factor parameter-independent code out of templates 212
條款45:運用成員函式模板接受所有兼容類型 218
use member function templates to accept "all compatible types " 218
條款46:需要類型轉換時請為模板定義非成員函式 222
define non-member functions inside templates when type conversions are desired 222
條款47:請使用traits classes表現類型信息 226
use traits classes for information about types 226
條款48:認識template元編程 233
be aware of template metaprogramming 233
8 定製new和delete 239
customizing new and delete 239
條款49:了解new-handler的行為 240
understand the behavior of the new-handler 240
條款50:了解new和delete的合理替換時機 247
understand when it makes sense to replace new and delete 247
條款51:編寫new和delete時需固守常規 252
adhere to convention when writing new and delete 252
條款52:寫了placement new也要寫placement delete 256
write placement delete if you write placement new 256
9 雜項討論 262
miscellany 262
條款53:不要輕忽編譯器的警告 262
pay attention to compiler warnings 262
條款54:讓自己熟悉包括tr1在內的標準程式庫 263
familiarize yourself with the standard library, including tr1 263
條款55:讓自己熟悉boost 269
familiarize yourself with boost 269
a 本書之外 273
b 新舊版條款對照 277
索引 280
譯者序
按孫中山先生的說法,這個世界依聰明才智的先天高下得三種人:先知先覺得發明家,後知後覺得宣傳家,不知不覺得實踐家。三者之中發明家最少最稀珍,最具創造力。正是匠心獨具的發明家創造了這個花花綠綠的計算機世界。
以文字、圖書、授課形式來講解、宣揚、引導技術的人,一般被視為宣傳家而非發明家。然而,有一類最高等級的技術作家,不但能將精闢獨到的見解訴諸文字,又能創造新的教學形式,引領風騷,對技術的影響和對產業的貢獻不亞於技術或開發工具的創造者。這種人當之發明家亦無愧矣。
Scott Meyers就是這一等級的技術作家!
自從1991年出版《Effective C++》之後,Meyers聲名大噪。1996年的《More Effective C++》和1997年的《Effective C++》2/e以及2001年的《Effective STL》讓他更上高樓。Meyers擅長探索程式語言的極限,窮盡其理,再以一支生花妙筆將複雜的探索過程和前因後果寫成環環相扣故事性甚強的文字。他的幽默文風也讓讀者在高張力的技術學習過程中猶能享受“閱讀的樂趣”——這是我對技術作家的最高禮讚。
以條款(items)傳遞專家經驗,這種寫作形式是否為Meyers首創我不確定,但的確是他造成了這種形式的計算機書籍寫作風潮。影響所及,《Exceptional C++》、《More Exceptional C++》、《C++ Gotchas》、《C++ Coding Standards》、《Effective COM》、《Effective Java》、《Practical Java》紛紛在書名或形式上“向大師致敬”。
睽違8年之後《Effective C++》第三版面世了。我很開心繼第二版再次受邀翻譯。Meyers在自序中對新版已有介紹,此處不待贅言。在此我適度修改第二版部分譯序,援引於下,協助讀者迅速認識本書定位。
C++ 是一個難學易用的語言!
C++ 的難學,不僅在其廣博的語法,以及語法背後的語義,以及語義背後的深層思維,以及深層思維背後的對象模型;C++ 的難學還在於它提供了四種不同而又相輔相成的編程范型(programming paradigms):procedural-based, object-based, object-oriented, generics。
世上沒有白吃的午餐!又要有效率,又要有彈性,又要前瞻望遠,又要回溯相容,又要治大國,又要烹小鮮,學習起來當然就不可能太簡單。在龐大複雜的機制下,萬千使用者前仆後繼的動力是:一旦學成,妙用無窮。
C++ 相關書籍車載斗量,如天上繁星,如過江之鯽。廣博如四庫全書者有之(The C++ Programming Language、C++ Primer、Thinking in C++),深奧如重山復水者有之(The Annotated C++ Reference Manual, Inside the C++ Object Model),細說歷史者有之(The Design and Evolution of C++, Ruminations on C++),獨沽一味者有之(Polymorphism in C++),獨樹一幟者有之(Design Patterns, Large Scale C++ Software Design, C++ FAQs),另闢蹊徑者有之(Generic Programming and the STL),程式庫大全有之(The C++ Standard Library),專家經驗之累積亦有之(Effective C++, More Effective C++)。這其中“專家經驗之累積”對已具 C++ 相當基礎的程式設計師有著立竿見影的幫助,其特色是輕薄短小,高密度納入作者浸淫C++/OOP多年的廣泛經驗。它們不但開展讀者的視野,也為讀者提供各種C++/OOP常見問題的解決模型。某些主題雖然在百科型C++ 語言書中也可能提過,但此類書籍以深度探索的方式讓我們了解問題背後的成因、最佳解法,以及其他可能的牽扯。這些都是經驗的累積和心血的結晶,十分珍貴。
《Effective C++》就是這樣一本輕薄短小高密度的“專家經驗累積”。
本中譯版與英文版頁頁對譯,保留索引,偶爾加上小量譯註;願能提供您一個愉快的學習。千里之行始於足下,祝願您從聲名崇隆的本書展開一段新里程。同時,我也向您推薦本書之兄弟《More Effective C++》,那是Meyers的另一本同樣盛名遠播的書籍。
侯捷 2006/02/15於台灣新竹
序言
1991年我寫下《Effective C++》第一版。1997年撰寫第二版時我更新了許多重要內容,但為了不讓熟悉第一版的讀者感到困惑,我竭盡所能保留原始結構:原先50個條款中的48個標題基本沒變。如果把書籍視為一棟房屋,第二版只是更換地毯燈飾,重新粉刷一遍而已。
到了第三版,修繕工作進一步深入壁骨牆筋(好幾次我甚至希望能夠翻新地基)。1991年起C++ 世界經歷了巨大變革,而本書目標——在一本小而有趣的書中確認最重要的一些C++ 編程準則——卻已不再能夠由15年前建立的那些條款體現出來。“C++ 程式設計師擁有C背景”這句話在1991年是個合理假設,如今C++ 程式設計師卻很可能來自Java或C# 陣營。繼承(inheritance)和面向對象編程(object-oriented programming)在1991年對大多數程式設計師都很新鮮,如今程式設計師已經建立良好概念,異常(exceptions)、模板(templates)和泛型編程(generic programming)才是需要更多引導的領域。1991年沒人聽過所謂設計模式(design patterns),如今少了它很難討論軟體系統。1991年C++ 正式標準才剛要上路,如今C++ 標準規範已經8歲,新版規範蓄勢待發。
為了對付這些改變,我把所有條款抹得一乾二淨,然後問自己“2005年什麼是對C++ 程式設計師最重要的忠告?”答案便是第三版中的這些條款。本書有兩個新章,一個是資源管理(resource management),一個是模板編程(programming with templates)。實際上template(模板)這東西遍布全書,因為它們幾乎影響了C++ 的每個角落。本書新素材還包括在exceptions(異常)概念下編程、套用設計模式、
以及運用新的TR1程式庫設施(TR1於條款54描述)。本書也告訴大家在單執行緒系統(single-threaded systems)中運作良好但可能不適用於多執行緒系統(multithreaded systems)的某些技術和做法。本書半數以上內容是新的。在此同時第二版大部分基礎信息仍然很重要,所以我找出一個保留它們的辦法:你可以在附錄B找到第二、第三兩版的條款對應表。
我努力讓本書達到我所能夠達到的最佳狀態,但這並不表示它已臻完美。如果你認為某些條款不適合作為一般性忠告,或你有更好的辦法完成本書所談的某件工作,或書中某些技術討論不夠清楚不夠完全,甚或有所誤導,請告訴我。如果你找出任何錯誤——技術上的、文法上的、排版印刷上的,不論哪一種——也請告訴我。我很樂意將第一位提出問題並吸引我注意的朋友加入下次印刷的致謝名單中。
即使本書條款個數擴充為55,這一整組編程準則還談不上完備。然而畢竟整理出優良準則——幾乎任何時間適用於任何應用程式的準則——比想像中困難得多。如果你有其他編程準則的想法或建議,我將樂以與聞。
我手上維護本書第一刷以來的變化清單,其中包括錯誤修訂、進一步說明和技術更新。致 謝
《Effective C++》已經面世15年了,我開始學習C++ 則是在書寫此書的前5年。也就是說 "Effective C++項目" 已經發展兩個年代了。此期間我得益於數百(數千?)人的深刻知識、對我的建議與修正,以及偶發的一些目瞪口呆的事績。這些人幫助我更加完善《Effective C++》,我要對他們全體表示感謝。
我已經放棄追蹤“在哪兒學到什麼”的歷史,但永遠記得有個公眾信息來源不斷帶給我幫助:Usenet C++ newsgroups,特別是comp lang c++ moderated和comp std c++。本書許多——也許是大多數——條款得益於這些討論群所突出的若干技術想法和後續調查與診療。
關於第三版新內容,Steve Dewhurst和我一起討論了最初的條款名單。條款11中關於“藉由copy and-swap實現operator=”的構想來自Herb Sutter在此主題的作品,像是《Exceptional C++》(Addison-Wesley, 2000)條款13。RAII(見條款13)源自Bjarne Stroustrup的《The C++ Programming Language》(Addison-Wesley, 2000)。條款17背後的想法來自Boost shared_ptr網頁上的“Best Practices”節區(http://boost org/libs/smart_ptr/shared_ptr htm#BestPractices),又得到Herb Sutter的《More Exceptional C++》(Addison-Wesley, 2002)條款21的琢磨。條款29強烈受到Herb Sutter在此主題上的廣泛作品的影響,像是《Exceptional C++》條款8~19,《More Exceptional C++》條款17~23,以及《Exceptional C++ Style》(Addison-Wesley, 2005)條款11~13;David Abrahams幫助我更好地了解三個異常安全性保證。條款35的NVI 手法來自Herb Sutter寫於《C/C++ Users Journal》2001年9月份的 "Virtuality" 專欄。同一條款中的Template Method和Strategy設計模式來自《Design Patterns》(Addison-Wesley, 1995),作者是Erich Gamma, Richard Helm, Ralph Johnson和John Vlissides。條款37所說的NVI使用手法,概念來自Hendrik Schober。David Smallberg 給了我動機在條款38寫出一個定製型set 實現品。條款39提到EBO通常只在多重繼承中才可用,這個構想源自David Vandevoorde和 Nicolai M Josuttis合著的《C++ Templates》(Addison-Wesley, 2003)。條款42中我對typename的最初理解來自Greg Comeau主持的 "C++ and C FAQ",Leor Zolman則幫助我認知我的最初了解並不正確(是我的錯,和Greg無關)。條款46的本質源自於Dan Sak的談話,"Making New Friends"。條款52末尾的那個想法“如果你聲明一版operator new,你也應該聲明其對應的delete夥伴”源自Herb Sutter的《Exceptional C++ Style》條款22。我從David Abrahams身上更多了解了Boost的檢評過程(條款55有一份摘要)。
上面所說關於我向誰或從某處學習某一技術,並不必然表示誰或某處就是該技術的發明人或發表處。我的筆記還告訴我,我也使用了來自Steve Clamage, Antoine Trux, Timothy Knox和Mike Kaelbling的信息,可惜這份筆記沒有提到如何以及在哪兒學到什麼。
第一版草稿由Tom Cargill, Glenn Carroll, Tony Davis, Brian Kernighan, Jak Kirman, Doug Lea, Moises Lejter, Eugene Santos, Jr , John Shewchuk, John Stasko, Bjarne Stroustrup, Barbara Tilly和Nancy L Urbano共同檢閱。我收到了一些改善建議並納入後來刷次,這些建議來自Nancy L Urbano, Chris Treichel, David Corbin, Paul Gibson, Steve Vinoski, Tom Cargill, Neil Rhodes, David Bern, Russ Williams, Robert Brazile, Doug Morgan, Uwe Steinmüller,Mark Somer, Doug Moore, David Smallberg, Seth Meltzer, Oleg Shteynbuk, David Papurt, Tony Hansen, Peter McCluskey, Stefan Kuhlins, David Braunegg, Paul Chisholm, Adam Zell, Clovis Tondo, Mike Kaelbling, Natraj Kini, Lars Nyman, Greg Lutz, Tim Johnson, John Lakos, Roger Scott, Scott Frohman, Alan Rooks, Robert Poor, Eric Nagler, Antoine Trux, Cade Roux, Chandrika Gokul, Randy Mangoba和Glenn Teitelbaum。
第二版草稿由以下人士共同檢閱:Derek Bosch, Tim Johnson, Brian Kernighan, Junichi Kimura, Scott Lewandowski, Laura Michaels, David Smallberg, Clovis Tondo, Chris Van Wyk和Oleg Zabluda。我收到來自以下人士的意見並因此對新刷有所幫助:Daniel Steinberg, Arunprasad Marathe, Doug Stapp, Robert Hall, Cheryl Ferguson, Gary Bartlett, Michael Tamm, Kendall Beaman, Eric Nagler, Max Hailperin, Joe Gottman, Richard Weeks, Valentin Bonnard, Jun He, Tim King, Don Maier, Ted Hill, Mark Harrison, Michael Rubenstein, Mark Rodgers, David Goh, Brenton Cooper, Andy Thomas-Cramer, Antoine Trux, John Wait, Brian Sharon, Liam Fitzpatrick, Bernd Mohr, Gary Yee, John O'Hanley, Brady Patterson, Christopher Peterson, Feliks Kluzniak, Isi Dunietz, Christopher Creutzi, Ian Cooper, Carl Harris, Mark Stickel, Clay Budin, Panayotis Matsinopoulos, David Smallberg, Herb Sutter, Pajo Misljencevic, Giulio Agostini, Fredrik Blomqvist, Jimmy Snyder, Byrial Jensen, Witold Kuzminski, Kazunobu Kuriyama, Michael Christensen, Jorge Yá?ez Teruel, Mark Davis, Marty Rabinowitz, Ares Lagae和Alexander Medvedev
第三版早期部分草稿由以下人士共同檢閱:Brian Kernighan, Angelika Langer, Jesse Laeuchli, Roger E Pedersen, Chris Van Wyk, Nicholas Stroustrup和Hendrik Schober。完整草稿由以下人士共同檢閱:Leor Zolman, Mike Tsao, Eric Nagler, Gene Gutnik, David Abrahams, Gerhard Kreuzer, Drosos Kourounis, Brian Kernighan, Andrew Kirmse, Balog Pal, Emily Jagdhar, Eugene Kalenkovich, Mike Roze, Enrico Carrara, Benjamin Berck, Jack Reeves, Steve Schirripa, Martin Fallenstedt, Timothy Knox, Yun Bai, Michael Lanzetta, Philipp Janert, Guido Bartolucci, Michael Topic, Jeff Scherpelz, Chris Nauroth, Nishant Mittal, Jeff Somers, Hal Moroff, Vincent Manis, Brandon Chang, Greg Li, Jim Meehan, Alan Geller, Siddhartha Singh, Sam Lee, Sasan Dashtinezhad, Alex Marin, Steve Cai, Thomas Fruchterman, Cory Hicks, David Smallberg, Gunavardhan Kakulapati, Danny Rabbani, Jake Cohen, Hendrik Schober, Paco Viciana, Glenn Kennedy, Jeffrey D Oldham, Nicholas Stroustrup, Matthew Wilson, Andrei Alexandrescu, Tim Johnson, Leon Matthews, Peter Dulimov和Kevlin Henney。某些個別條款的草稿由Herb Sutter和Attila F Feher檢閱。
檢閱一份不夠洗鍊(而且可能尚未完成)的手稿是件吃力的工作,在時間壓力之下進行只會使得它更困難。我要感謝這么多人願意為我做這件事。
如果對討論素材缺乏背景,而又期望捕捉手稿中的每一個問題,檢閱工作將更加困難。令人驚訝的是還是有人選擇成為文字編輯。Chrysta Meadowbrooke是本書的文字編輯,她的周密工作揭露出許多逃過其他每一雙眼睛的問題。
Leor Zolman在正式檢閱前先以多種編譯器檢驗所有代碼,在我校訂手稿之後又做一次。如果書中仍然存在任何錯誤,全是我的責任。Karl Wiegers和(特別是)Tim Johnson提供我快速而有幫助的反饋。