《MoreExceptionalC++:40個新的工程難題、編程疑問及解決方法(中文版)》是2011年出版的圖書,作者是赫伯·舒特。
基本介紹
- 書名:MoreExceptionalC++:40個新的工程難題、編程疑問及解決方法(中文版)
- 作者:Herb Sutter(赫伯•舒特)
- 譯者:於春景
- ISBN:978-7-121-12592-8
- 定價:59.00元
- 出版社:電子工業出版社
- 出版時間:2011年1月
圖書基本信息,內容簡介,與大師面對面(譯序),序,前 言,目 錄,
圖書基本信息
書名:More Exceptional C++:40個新的工程難題、編程疑問及解決方法(中文版)
作者:[美]Herb Sutter(赫伯·舒特)著 於春景 譯 ISBN 978-7-121-12592-8
出版日期:2011年1月
定價:59.00元
內容簡介
對C++程式設計師來說,ISO/ANSI C++標準的問世標誌著一個新紀元的開始。C++標準為程式設計提供了很多新的便利和可能,但要想在如此眾多的信息中挖掘到其中的精髓,現實世界中的程式設計師缺少足夠的時間。本書針對一定的主題,為程式設計師提供了簡明扼要的指導,從而將學習時間和疑惑減至最少。本書內容包括泛型程式設計與C++標準庫、最佳化與性能、異常安全議題及技術、繼承與多態、記憶體及資源管理、自由函式與宏等。
本書內容全面豐富,論述翔實清晰,作者權威且經驗豐富,是C++程式設計師的必備讀物。
與大師面對面(譯序)
小提琴家穆特錄製過一張唱片,收錄的是貝多芬最偉大的兩部小提琴作品 。聆聽那張唱片,你仿佛聽見貝多芬在向你傾訴他對音樂藝術的理解和感悟,為你解答小提琴音樂創作的每一個疑問和困惑。為了向音樂愛好者推薦貝多芬的那兩部名作,穆特為她的那張名碟加上了一個恰如其分的標題—— “與貝多芬面對面”。
合上More Exceptional C++的瞬間,我的第一反應是為這本名著也加上一個與之類似的副標題,然後,鄭重地推薦給你。
是的,本書奉獻給你的是又一位大師苦心孤詣的結晶。不同的是,這位大師來自你所關注的C++程式設計領域。對每一位C++愛好者或C++專業程式設計師來說,Herb Sutter的名字應該不會讓人感到陌生。作為ISO/ANSI C++標準委員會的委員,Herb Sutter不僅是C++程式設計領域公認的專家,還是深受程式設計師喜愛的技術講師和作家。Herb Sutter在網際網路上主持的Guru of the Week專欄廣受歡迎,幾乎成為每一位C++程式設計師的網上必讀物。本書就是Guru of the Week的最新精華總結。
本書的主要特點可以反映在我為它所加的副標題中。作為身經百戰的專業程式設計師,而且長期從事程式設計的普及教育工作,Herb Sutter最清楚程式設計師在提升技術功力的過程中的所想所為。他既了解初學者的疑問和困惑,也對專業程式設計師日常工作中遭遇到的陷阱和易犯的錯誤了如指掌。因而,在本書中,Herb Sutter採用了獨具匠心的“提問/解答”的方式來指導你學習C++的語言特性;在本書的每個專題中,Herb Sutter都合理地構想出你的疑問和困惑,又有如神助地猜到了你的(可能是錯誤的)解答,然後給你以指點並呈現出最佳方案,最後,還提煉出解決類似問題的一般性原則。讀了這本書,你仿佛和Herb Sutter這位大師面對面地進行了一場對話,親歷了他對你的指導和點撥。
關於本書的另一個特點,我想指出的是,作為C++標準委員會的委員,Herb Sutter在本書中強調了C++語言的最新標準和最新特性,強調了泛型程式設計和標準庫的使用。在本書的所有示例中,Herb Sutter為我們提供的是清新的C++編程風格和純正的現代C++代碼和範例。
本書適合的讀者對象是中高級程式設計師,但這並不是說本書的內容高不可攀。作者並不是在講述高深的語言特性和設計技巧,更沒有對基礎話題避而不談;相反,有關基礎知識的介紹、回顧和深化散見於本書的很多條款之中。只不過,這些條款的內容涉及的只是C++特性中的細節,它沒有對C++的每一個特性、或每個特性中的每一個方面做全面的介紹。儘管如此,只要具備基本的C++功底和一定的程式設計經驗,你完全可以理解和消化本書的所有內容。由於作者進行了巧妙的組織和精心的選材,本書每一個條款的內容都獨立而完整,它可以讓你在深入學習C++語言特性時事半功倍。
因而,我相信,無論是有一定基礎的C++愛好者,還是身經百戰的專業程式設計師,本書都將為你帶來收穫;在你的C++程式設計生涯中,它將是你的案頭不可或缺的C++專著之一。
致謝
能夠翻譯完這本書,我首先要感謝我的妻子妞妞和兒子鬥鬥,是你們給了我工作的動力,長期以來我都未能陪伴在你們身邊,你們不但給了我寬容,還依然給我不變的愛和支持。感謝yeka,是你促成了我和出版社的愉快合作,並給了我最直接的幫助。感謝肖翔對譯稿進行的認真審校,他在審閱過程中的真知灼見令我受益匪淺。感謝moonsea,即使是在我工作的時候,你也會不時地擾亂我的心緒,迫使我無法繼續工作—— 正因為這樣,我才得以不時地逃離枯燥的鍵盤和螢幕,偷得一刻閒暇。感謝作者Herb Sutter,在翻譯本書的過程中,你對我的每一次請教都給予了耐心的解答—— 和大師的直接對話讓我如沐春風。最後,感謝網際網路上所有給予我幫助和鼓勵的朋友們,lostmouse(我在專業論壇上的網名)希望,這本譯作能成為我對你們最好的回饋;我還希望,你們能一如既往地幫助我,指出我在這本譯作中留下的每一個疏漏和錯誤。感謝你們!
於春景(lostmouse)
2002年5月於深圳蛇口
序
怎樣才能成為專家?在我涉足過的所有領域,答案都一樣:
1.掌握基礎知識。
2.將相同的內容再學習一遍,但這一次,請將你的注意力集中在細節上—— 這些細節的重要性,你頭一次可能並沒有認識到。
如果挑選了合適的細節來學習,並且徹底掌握了它們,進而達到不再為之困惑的程度,你就離成為專家為期不遠了。然而,除非已經成為了專家,你又怎么知道該挑選哪些細節來學習呢?如果有人已經為你挑選了合適的細節,你就會學得更快,並且樂在其中。
舉個例子,我曾經參加過一次攝影學習班,授課的是一位很不錯的攝影師,名叫Fred Picker。他告訴我們,攝影中僅有的兩個困難環節是:照相機該擺放在哪兒、何時該按快門。然後,他花了學習班的大部分時間教我們有關曝光、加工和沖印的技術細節—— 只有完全了解了這些細節,我們才能夠很好地掌握攝影;而只有很好地掌握了攝影,我們去關注那兩個“困難的”環節才有意義。
學習C++編程的細節,有一個特別引人入勝的方式,即:盡力去回答有關C++編程的問題。例如:
f(a++);和f(a);++a;的效果一樣嗎?
可以用疊代器去改變set的內容嗎?
假設你正在使用一個名為v的vector,它占用的記憶體數量已經增長到讓你 擔心的程度。於是你會想到去清除這個vector,將記憶體返還給系統。調用v.clear()可以完成這一使命嗎?
你可能已經猜到,這些表面上看起來顯而易見的問題,其答案一定是No—— 否則我也不會把它們提出來—— 但你知道答案為什麼是No嗎?你確信?
本書回答了這些問題。此外,它還回答了其他許多精心挑選的問題,這些問題針對的都是看起來很平常的程式。沒有多少書籍具有本書這樣的特色—— 當然,它的前任Exceptional C++除外。有許多自封“高級”的C++書籍,其實它們中的大多數要么只是針對專項主題進行了討論—— 如果你只是想精通那些特定主題,而不是想深入研究日常編程中遇到的問題,那些書還不錯—— 要么只是用“高級”這個詞來引誘讀者而已。
一旦透徹理解了這些問題和它們的答案,你在編程時就不必勞神於細節,你就盡可以將注意力集中在真正需要盡力解決的問題上。
Andrew Koenig
2001年6月
前 言
古希臘哲學家蘇格拉底通過向學生提問進行教學——他用那些精心構思的問題來指導學生,啟發他們從已知得出結論;讓他們認識到自己正在學習的事物如何相互聯繫,這些事物與他們已有的知識又如何聯繫。這種教學法如此出名,以致於我們今天把它專稱為“蘇格拉底問答法”。如果讓我們也從學生的角度來看問題,蘇格拉底的教學法將引導我們,促使我們思考,幫助我們聯繫並套用現有的知識去獲取新知。
本書如同它的前任Exceptional C++ [Sutter00]一樣,借鑑了蘇格拉底的教學法。它假設你目前正身處C++產品軟體開發的某個領域,採用“提問/解答”的形式指導你如何有效地使用標準C++語言及其標準庫—— 尤其是,如何運用現代C++中有效的軟體工程理論來解決問題。這些問題大多直接取自於我和其他人在編寫產品級C++代碼時積累的經驗,以所謂的“疑問”和“難題”的形式呈現給你。“疑問”的目的在於幫助你從現有的知識和剛剛學到的知識中得出結論,並展現它們之間如何相互關聯。“難題”則向你展示如何去分析C++設計和編程上的論題—— 某些是常見的論題,某些並不常見;某些是淺顯的論題,某些則比較深奧;還有一些論題之所以拿來討論,是因為—— 唔,僅僅因為—— 它們很有趣。
本書覆蓋C++的方方面面。但我沒有說它觸及C++的每一個細節—— 那將需要更多的篇幅—— 我是在說,本書提取了C++語言和標準庫構件中的廣泛素材,向你展示看似毫不相關的個體如何被綜合利用起來,構成解決常見問題的新穎方案。它還展示了這些素材中看似毫不相關的那些部分自身是如何相互關聯的—— 即使有時你不希望它們有如此的關聯;以及,應當如何處理這些關聯。你將在此找到關於模板與名字空間、異常與繼承、健壯類的設計與設計模式、泛型程式設計與宏的使用技巧等內容—— 這些內容絕不是雜亂地堆砌在一起,而是作為連貫的條款,向你展示現代C++中這些組成部分之間的相互聯繫。
何為“More”?
More Exceptional C++起步於Exceptional C++駐足之處。本書繼承了前任的傳統:它提供了新的內容,這些內容被組織為短小的條款,形成有主題的章節。前一本書的讀者會在此發現一些熟悉的章節和主題,如異常安全、泛型編程、記憶體管理技術等,但如今它們包含了新的內容。這兩本書在結構和主題而非內容上有重疊之處。
More Exceptional C++還有何不同之處?本書特彆強調了泛型編程技術以及如何有效地使用C++標準庫,並涉及了如traits和predicates這樣的重要技術。有幾個條款還深入分析了使用標準容器和算法時應該牢記的要點—— 這其中的許多要點,我在別的地方還沒見到它們被提及過。此外,一個新的章節和兩個附錄集中討論了單執行緒和多執行緒環境下的最佳化議題—— 對於編寫產品級代碼的軟體開發商來說,這些議題在目前比以往任何時候都更具實用價值。
本書的大多數條款最初出現於網際網路和雜誌專欄,尤其是Guru of the Week的GotW專題31到62,以及我曾為C/C++ Users Journal、Dr.Dobb’s Journal、以前的C++ Report和其他出版物撰寫的印刷版專欄和文章中。自最初版本出現以來,本書的內容歷經大量的修訂、增補、校正和更新,因而本書(連同它在上不可缺少的勘誤表)可以被認為是那些原始材料的最新正式版本。
你應該知道的
我認為你已經了解了C++的基礎知識。如果不是這樣,建議你從一本好的C++入門和概念性的書籍開始,最好選擇一本經典的大部頭著作,如Bjarne Stroustrup的The C++ Programming Language [Stroustrup00],或者是Stan Lippman與Josée Lajoie合著的C++ Primer第三版 [Lippman98]。然後,一定要挑選一本指導編程風格的書,例如Scott Meyers經典的Effective C++套書[Meyers96][Meyers97]。我發現這套書有基於瀏覽器閱讀的CD版本[Meyers99],十分方便好用。
如何閱讀本書
本書的每個條款以一個難題或疑問的形式呈現,它帶有一條介紹性的標題,類似下面這樣:
條款#:條款的題目 難度:Ⅹ
條款的題目和難度等級提示你將要面對的是何種難題。注意,難度等級是我的主觀評斷,我只是猜想大多數人碰到每個問題時會覺得有多難,所以你很可能會發現一個難度為“7”的問題對你來說比某個難度為“5”的問題還容易。自從寫作Exceptional C++以來,我不時收到一些電子郵件,說“某某條款比你說的要容易(難)”。面對同一條款,不同的人認為“更容易”或“更難”是很自然的。難度等級隨人而定;對你來說,任何條款的實際難度真正取決於你的知識和經驗,它對別人來說會相對更容易或更難。但大多數情況下你會發現,難度分級是一種不錯的經驗方法,它指引給你的和你所認為的大致相當。
你可能打算從頭至尾閱讀整本書。這很好,但不一定非如此不可。你可能會集中閱讀一個章節中的所有條款,因為你對那個章節的議題特別感興趣。這也不錯。書中有一些條款被我稱為“短系列”,因為它們涉及的是相關的問題,你會看到這些條款用“之一”、“之二”等來標識。除了這些“短系列”外,其餘的條款都是很獨立的。在本書的條款中還包含很多交叉索引,有些索引還參考到Exceptional C++,你可以遵循這些索引隨意跳轉閱讀。我唯一要告訴你的是,製作“短系列”是為了讓它們成為一組以便於連續閱讀,除此之外,如何閱讀,選擇權在你。
名字空間、typename、URL引用以及其他約定
我在本書中提出了不少建議,但我不會指引你去做一些連我自己都沒做過的事。這包括整本書里我在我自己的示例代碼中所做的那些事。我也會遵循程式設計的現有習慣和現代風格,即使有時候這樣做不會對事情帶來本質上的差異。
關於這一點,說說名字空間。在本書的代碼示例中,如果你在一個例子中看到了一個檔案範圍內的using指令,又在幾頁或幾個條款後另外的例子中看到了一個函式範圍內的using指令,這其實沒有什麼更深層的含義,只是說明在那些特定情況下,這樣做是合理的,而且從美學的角度來看,也讓我感到美觀。至於名字空間的基本知識,請參閱條款40。在書寫代碼時,如果想強調我所指的是標準中的東西,我會用std::來修飾標準庫名稱。這一點確立後,我往往會轉而使用不帶修飾的名稱。
再說說模板參數的聲明。我時常碰到一些人,他們認為寫class而不寫typename是過時的做法,即使這二者沒有功能上的不同、而且C++標準本身也在到處使用class。純粹出於代碼書寫風格方面的考慮,並且為了強調本書所討論的是當今現代的C++,在聲明模板參數時,我也已經轉到使用typename而不使用class。唯一的例外是條款33中的一處,在那兒我直接引用了標準中的代碼—— 標準用的是class,我就隨它去了。
除非我明確地稱某段代碼是“完整程式”,否則一般不是。請記住,這些示例通常只是代碼片段或者只是程式的一部分,它們不會就這樣孤立地通過編譯。為了用我所提供的程式片段構成完整程式,你一般還得做一些顯而易見的添加工作。
最後,說說URL。網際網路上,事事在變。特別是,你無法掌控的那些事物在變。這樣一來,在印刷書籍上隨意發布URL就成為了一種真正的痛苦:不用等到一本書在你的書桌上躺上五年,在它還沒送到印刷廠之前,那些URL可能就已經過時了。本書中,當我引用其他人的文章或網站時,我是通過我自己的網站上的URL來實現的。這個網站我可以自己控制,它包含的只不過是直接指向實際網頁的重定向連結。如果你發現印刷在本書中的某個連結不再可用,請發電子郵件告訴我,我會更新這個連結,讓它指向新的網頁位置(如果我能夠重新找到這個網頁),或者標示這個網頁已經不再存在(如果我無法找到這個網頁)。無論哪種方式,本書的URL將保持最新—— 儘管在當今網際網路世界裡,印刷傳媒是這樣舉步維艱。唉!
致謝
深切感謝叢書編輯Bjarne Stroustrup,還有Debbie Lafferty、Tyrrell Albaugh、Chanda Leary-Coutu、Charles Leddy、Curt Johnson,以及Addison-Wesley出版社的其他成員,感謝他們在這個項目中的鼎力協助和堅持不懈。很難想像還能找到比他們更棒的人一起共事,他們的熱情和協作使這本書完全達到了我預想的目標。
另外值得感謝和稱讚的是審閱過本書的許多專家。對本書的許多內容,他們毫無保留地提出了深刻的見解和犀利的批評,而這些見解和批評是那樣一針見血。正是因為他們的努力,你手中的這本書比初稿更完整、更易於理解、更實用。特別感謝(大致以我收到審閱意見的順序)Scott Meyers、Jan Christiaan van Winkel、Steve DewHurst、Dennis Mancl、Jim Hyslop、Steve Clamage、Kevlin Henney、Andrew Koenig、Patrick McKillen,以及一些不知名的審閱者。書中遺留的所有錯誤、疏忽和歧義都是因為我,而非他們。
最後,將所有的感謝獻給我的家人和朋友—— 無論是在這本書的寫作和出版期間,還是其他任何時候,他們都一直陪伴在我身邊。
Herb Sutter
2001年6月於多倫多
目 錄
與大師面對面(譯序) Ⅸ
序 Ⅺ
前言 ⅫⅠ
泛型程式設計與C++標準庫 1
條款1:流 1
條款2:Predicates,之一:remove()刪除了什麼? 7
條款3:Predicates,之二:狀態帶來的問題 12
條款4:可擴充的模板:使用繼承還是traits? 22
條款5:typename 40
條款6:容器、指針和“不是容器的容器” 45
條款7:使用vector和deque 56
條款8:使用set和map 65
條款9:等同的代碼嗎? 72
條款10:模板特殊化與重載 78
條款11:Mastermind 84
最佳化與性能 100
條款12:內聯 100
條款13:緩式最佳化,之一:一個普通的舊式String 104
條款14:緩式最佳化,之二:引入緩式最佳化 108
條款15:緩式最佳化,之三:疊代器與引用 113
條款16:緩式最佳化,之四:多執行緒環境 125
異常安全議題及技術 139
條款17:構造函式失敗,之一:對象生命期 139
條款18:構造函式失敗,之二:吸收異常? 144
條款19:未捕獲的異常 153
條款20:未管理指針存在的問題,之一:參數求值 160
條款21:未管理指針存在的問題,之二:使用auto_ptr? 164
條款22:異常安全與類的設計,之一:複製賦值 171
條款23:異常安全與類的設計,之二:繼承 181
繼承與多態 187
條款24:為什麼要使用多繼承? 187
條款25:模擬多繼承 191
條款26:多繼承與連體雙嬰問題 195
條款27:(非)純虛函式 200
條款28:受控的多態 207
記憶體及資源管理 210
條款29:使用auto_ptr 210
條款30:智慧型指針成員,之一:auto_ptr存在的問題 219
條款31:智慧型指針成員,之二:設計ValuePtr 225
自由函式與宏 239
條款32:遞歸聲明 239
條款33:模擬嵌套函式 245
條款34:預處理宏 256
條款35:宏定義 260
雜項議題 265
條款36:初始化 265
條款37:前置聲明 269
條款38:typedef 271
條款39:名字空間,之一:using聲明和using指令 275
條款40:名字空間,之二:遷徙到名字空間 278
後記 293
附錄A:(在多執行緒環境下)並非最佳化 294
附錄B:單執行緒String實現與多執行緒安全String實現的對比測試結果 313
參考文獻 323
索引 325