出版時(shí)間:2012-6-19 出版社:人民郵電出版社 作者:[美]Matthew Wilson 頁數(shù):591 字?jǐn)?shù):875000 譯者:榮耀,劉未鵬
Tag標(biāo)簽:無
前言
或許我不像喜歡我的孩子們那樣喜愛C++,甚至或許我對C++的喜愛都比不上我對騎自行車在坡度為32°、光滑度為10%的柏油路上爬坡的熱衷, 盡管有時(shí)這些喜愛之情的確十分接近。我慶幸我有這樣的人生,讓我得以將生命中的部分時(shí)間用來實(shí)踐或闡釋Frederick P.Brooks的名言:“盡量發(fā)揮想象力進(jìn)行創(chuàng)造”。我更要感激的是我能夠跟這門如此強(qiáng)大、危險(xiǎn)卻又誘人的語言相伴。這些話聽起來似乎蠻華麗動聽,但你可能是因?yàn)榭吹奖緯臅刨I下它的,以為本書是一本抨擊C++的圖書。你可能是Java或C或其他主流語言的熱衷者,因而買這本書可能是想從中找到支持你遠(yuǎn)離C++的理由。倘若果真如此,你會失望的,因?yàn)楸緯⒉皇桥e辦一切C++批判大會。不過先別急著離開,因?yàn)槟慊蛟S能夠從中找到令你開始接觸C++的理由。你將從中學(xué)到什么我寫這本書的目的在于給予開發(fā)同行們一些能量。它以雖批評但具建設(shè)性的眼光來看待C++及其不完美之處,并給出實(shí)際的措施以避免或改善這種不完美。我希望你在讀完本書后能夠?qū)ο旅孢@些問題有一個(gè)更好的把握:? 如何克服C++類型系統(tǒng)中的某些不足。? 模板編程在提高代碼靈活性和健壯性上的強(qiáng)大能力。? 如何在(當(dāng)前標(biāo)準(zhǔn)尚不予置理的)未定義行為的險(xiǎn)惡叢林中生存下來。后者包括動態(tài)庫、靜態(tài)對象以及線程等。? 隱式轉(zhuǎn)換的代價(jià)、它所帶來的問題,及其替代方案,即基于顯式轉(zhuǎn)換的、高效且易于控制的泛用性編程。? 如何編寫能夠與(或更容易令它們與)其他編譯器、庫、線程模型等兼容的軟件。? 編譯器“在幕后”都做了些什么?你對編譯器可以施加什么樣的影響。? 數(shù)組和指針之間微妙而棘手的互操作性,以及用于防止它們的行為變得彼此相似的技術(shù)。? C++對RAII(Resource Acquisition Is Initialization,資源獲取即初始化)機(jī)制的支持,以及該機(jī)制可以被運(yùn)用到的各種問題領(lǐng)域。? 如何通過最大限度地榨取編譯器的偵錯(cuò)能力來節(jié)省你自己所需花費(fèi)的工夫。有了上面這些“裝備”,你編寫的代碼將更有效率、更具可維護(hù)性、更健壯,也更具靈活性。我的意圖是,即便是經(jīng)驗(yàn)豐富的C++實(shí)踐者也能從本書中發(fā)現(xiàn)新思想和新技術(shù),從而引發(fā)他們的靈感并提高其現(xiàn)有的實(shí)戰(zhàn)能力。經(jīng)驗(yàn)較少的程序員則能領(lǐng)會其中包含的有關(guān)原則并將相關(guān)技術(shù)應(yīng)用到自己的工作中,在增長見識的同時(shí)彌補(bǔ)自己對一些技術(shù)細(xì)節(jié)理解上的疏漏。我并不指望你們所有人都完全同意我所說的一切,但我期望哪怕是最有爭議的內(nèi)容也能激發(fā)你去真正弄明白自己對這門強(qiáng)大語言的使用問題。我假設(shè)你們已經(jīng)知道除非有人想寫一本很厚的書,否則他必須假設(shè)許多知識是讀者已經(jīng)知道的。當(dāng)然,規(guī)定大家必須首先讀完某些書籍的做法過于粗魯,但我假設(shè)你們的知識和經(jīng)驗(yàn)?zāi)苁鼓銈冚p松地理解Scott Meyer的Effective C++系列和Herb Sutter的Exceptional C++系列中講述的絕大部分概念。我還假設(shè)你們擁有一本C++“圣經(jīng)”,即Bjarne Stroustrup的The C++ Programming Language。我并不指望你們仔細(xì)閱讀該書的每一頁(我都還沒有做到這一點(diǎn)),但你們應(yīng)當(dāng)將這本書作為這門語言的終極參考,因?yàn)樗拇_是字字珠璣。本書中包含有相當(dāng)多的模板代碼(哪一本現(xiàn)代C++書籍不是如此呢),但我并沒有假設(shè)你是名大師級的人物, 或掌握了高階元編程知識。話雖如此,我還是建議你們最好熟悉如何使用模板,比如組成C++標(biāo)準(zhǔn)庫中最流行的部分的那些內(nèi)容。我努力將對模板的使用控制在一個(gè)合理的水平,但我們必須得承認(rèn),正是對模板的支持使得C++具有“自我修復(fù)”的能力,而這也是本書得以誕生的主要原因。由于靈活性和實(shí)用性對我而言非常重要,因此書中的代碼并非只能在少數(shù)最新編譯器上編譯;實(shí)際上,書中幾乎所有代碼都可以在任意一款“還算可以”的現(xiàn)代編譯器(見附錄A)上編譯。當(dāng)然,有一些很好的編譯器是可以免費(fèi)獲得的,并且你也可以相信你的編譯器能夠編譯這些代碼。只要有可能,我就會盡量避免涉及特定的操作環(huán)境、庫和技術(shù)。然而我也略微談到了一些,所以,了解以下內(nèi)容將會有所幫助(盡管并非必不可少):COM和CORBA、動態(tài)庫(UNIX和Win32的)、STL、線程(POSIX和Win32的)、UNIX以及Win32。參考書目中包含有許多這些方面以及其他方面內(nèi)容的好書。此外,熟悉不止一種機(jī)器架構(gòu)也是有幫助的,當(dāng)然這同樣并非不可或缺。由于C目前仍是語言間交互以及操作系統(tǒng)開發(fā)的通用語言,因此它繼續(xù)作為一門極其重要的語言存在著。盡管本書是關(guān)于C++的,但在某些領(lǐng)域,C跟C++之間的共性會變得很重要,我認(rèn)為在這些領(lǐng)域選擇兼顧C(jī)/C++是合理的。事實(shí)上,正如我們將在本書的第二部分中看到的,我們有時(shí)需要求助于C來支持C++的一些高級用法。此外,我還作了一個(gè)重要的假定。我假定你們也認(rèn)為工作的質(zhì)量是非常重要的,并且有動力去尋找達(dá)到這一目標(biāo)的新途徑。本書不敢妄稱是這些所謂新途徑的惟一源泉。確切地說,它提供了一種實(shí)踐性的、有時(shí)甚至是異端的視角來看待我們在C++中遇到的問題。如果情況夠好的話,本書或許也能成為你的精華書庫中的成員之一。最終的責(zé)任落在你自己的肩上,剩下來要做的就是去尋找最好的工具來支持你的工作。本書的組織方式本書的主要內(nèi)容分為6個(gè)部分,每一部分由一個(gè)緒論和5~7章組成,每一章又可以被進(jìn)一步劃分為若干節(jié)。既然本書取名為“Imperfect C++”,那么我就會在書中盡量突顯出實(shí)際的不完美之處,這就是你們在本書的通篇都會發(fā)現(xiàn)一些所謂的“不完美(Imperfection)”的原因。在書的前幾部分,這些不完美之處出現(xiàn)得比較密集,這說明它們自身和它們的解決之道尚且是比較簡單的。每個(gè)小節(jié)都對應(yīng)著語言的某個(gè)特定的特性,并且通常會介紹它的一個(gè)不完美之處。只要有可能,我就會提供一些具體的技巧或技術(shù)來解決這些問題,或至少為開發(fā)者提供控制問題的方法。隨著本書內(nèi)容逐步展開,這些不完美之處將會變得不再像前面那樣散碎,顯得更為重大,從而伴隨有更大篇幅、更加詳細(xì)的討論。本書并沒有采用時(shí)髦的“自助餐”式的寫法,也不存在一條必須從頭讀到尾的貫穿全書的主線。當(dāng)然,大部分后續(xù)章節(jié)的內(nèi)容是根據(jù)前面章節(jié)的內(nèi)容進(jìn)行描述的,有時(shí)甚至建立在之前的章節(jié)之上,所以除非你故意作對,否則最好還是按順序閱讀。然而,一旦你讀完一遍后,回頭再來參考其中的某些部分時(shí),你就可以根據(jù)需要跳至任意一處而不再需要通讀所有內(nèi)容了。在每一章中,各節(jié)一般是按內(nèi)容順序排列的,所以我建議你也應(yīng)該按順序來閱讀每一節(jié)。在難度方面,第一部分到第四部分顯然經(jīng)歷了一個(gè)從易到難的過程,從相當(dāng)簡單明了直到有相當(dāng)高的要求。 盡管第五部分和第六部分需要依賴第三部分和第四部分的一些內(nèi)容,但它們相對來說不再那么具有挑戰(zhàn)性了。你可以優(yōu)哉游哉地一直讀到附錄。主要內(nèi)容介紹完之后是4個(gè)簡短的附錄。附錄A介紹在探討本書各項(xiàng)議題時(shí)使用的編譯器和庫的詳細(xì)信息。附錄B向你展示一個(gè)年輕的C++工程師在剛踏入這一充滿陷阱的領(lǐng)域時(shí)所犯下的一些令人目瞪口呆的錯(cuò)誤。附錄C介紹Arturius項(xiàng)目,這是一個(gè)免費(fèi)的源碼開放的編譯器多路分發(fā)器,你也可以在隨書光盤中找到它。最后,附錄D介紹隨書光盤的內(nèi)容。我的編碼風(fēng)格十分一致,甚至可以說是嚴(yán)格,你也可以說它過于“學(xué)究氣”,我以前的同事和使用我?guī)斓娜藗冊缇瓦@樣說過。但我之所以采取這種風(fēng)格是因?yàn)檫@么一來代碼中的所有東西都有其明確的位置,人家不至于會問“某某東西到哪里去了”這種問題,同時(shí)這也意味著當(dāng)我?guī)啄旰笾匦旅鎸@些代碼時(shí),我還可以輕松搞定它。當(dāng)然這么做也有缺點(diǎn):我需要一個(gè)21英寸的顯示器和一個(gè)工業(yè)用激光打印機(jī)。為了盡量減少我的編碼風(fēng)格對閱讀本書的影響,我在書中出現(xiàn)的代碼示例中使用了一些自由風(fēng)格。你將會在示例中看到很多省略號(...),它們一般表示前面的有關(guān)例子中已經(jīng)包含了該段代碼,或者表示這些省卻的代碼是我們司空見慣的樣板式代碼(例如,禁止客戶代碼訪問某些方法,見2.2節(jié))。只有編碼風(fēng)格中對可靠性有著顯著影響的方面才會被加以討論(見第17章)。參考資料我在閱讀其他C++書籍時(shí)感到不滿的一件事是:作者指出事實(shí)的同時(shí)從不提及標(biāo)準(zhǔn)的相關(guān)部分。所以我在寫作本書的過程中,除了會不斷引用一些相關(guān)的書籍和文章外,還會在描述C++語言行為的同時(shí)提供其在C++(C++98)或C(C99)標(biāo)準(zhǔn)中的相關(guān)參考。補(bǔ)充材料光盤隨書光盤中包含有一些庫、編譯器(包括書中描述的大量編碼技術(shù))、測試程序、工具,以及其他有用的軟件,另外還有許多摘自各種出版物的相關(guān)文章。關(guān)于光盤的詳細(xì)內(nèi)容,請參考附錄D。網(wǎng)上資源你也可以通過如下網(wǎng)址來獲取補(bǔ)充資源:http://imperfectcplusplus.com。致謝在幾乎所有你看到或?qū)⒁吹降臅?dāng)中,你都會發(fā)現(xiàn)其中有一頁或幾頁充滿著對家人和朋友熱情洋溢的致謝之辭,我可以向你保證這些言辭都是發(fā)自內(nèi)心的真情流露。一本書要想得以完成,其背后必定隱藏著若干人的支持。首先感謝我的母親和Suzanne,感謝她們長期以來的容忍、支持以及養(yǎng)育之恩,直到當(dāng)年的唧唧喳喳的小布谷鳥到了早就成熟的年齡(27歲),才離開溫暖的巢,飛向一個(gè)不同的世界。感謝母親和Robert在一段艱苦但最終有所收獲的歲月里一直幫助小布谷鳥和他的家庭。尤其感謝Robert在這段時(shí)間里的許多重要時(shí)刻幫我保持精神放松。謝謝Piker填補(bǔ)了這個(gè)大家庭的空缺,并且不遺余力地照看孩子,鼓勵(lì)我們,并提供免費(fèi)的午餐。同樣感謝Dazzle,他總是告訴我他對我極有信心,并難能可貴地放棄那些誘人的DBA大師活動,堅(jiān)定地幫我做那些沉悶的審稿工作;他在看其他Perl和Python腳本的時(shí)候可決不會是這個(gè)心態(tài)!也要感謝Besso一直以來對我的計(jì)劃的濃厚興趣、過分的自豪以及鼓舞人心的觀點(diǎn)。謝謝Al和Cynth(親家)提供許多免費(fèi)的飯菜和美味的巧克力(哦,我差點(diǎn)忘了我那輛自行車……)。衷心感謝808 State、Aim、Barry While、Billy Bragg、De La Soul、Fatboy Slim、George Michael、Level 42、Rush、Seal、Stevie Wonder以及The Brand New Heavies,沒有他們我不可能從這個(gè)一年半的幻想中掙扎過來。最重要的感謝要給予我的美麗愛妻Sarah,感謝她抑制住合乎情理的擔(dān)心和疑慮,而表現(xiàn)出完全的支持和信任。她是我心目中真正的明星!感謝一些出色的人,他們對我的教育和事業(yè)的影響是深遠(yuǎn)的。感謝Bob Cryan教授,感謝他能夠賞識一名天賦不錯(cuò)的學(xué)生,并在后來3年的研究生在讀期間寬容他的逃課(去騎自行車)。還要感謝Richard McCormack讓我保持在概念上的優(yōu)雅之外還看到了代碼的高效之美。這段時(shí)間我有時(shí)會被別人責(zé)備說過于看重效率了,我就說你要怪就怪Richard去吧。另外,感謝Graham Jones(綽號“Dukey”)教我設(shè)置vi,在那瘋狂的6個(gè)月的時(shí)間里和我保持深厚的友誼以及提供開心的玩笑。這些東西,無可替代!同樣還要感謝Leigh和Scott Perry,感謝他們向我介紹“螺栓”概念以及其他優(yōu)秀的技術(shù)。特別感謝Andy Thurling。在我懷揣博士文憑和名不副實(shí)的軟件工程技能等級證書去找工作時(shí),Andy對我的潛能表現(xiàn)出充分的信心。 Andy還教給我或許在這個(gè)奇妙而令人畏懼的職業(yè)中最最重要的一課:“我們只是在盡量充分利用手頭擁有的信息而已(Skegging it Out)”。 Chuck Allison則以更為親切的形式來表述這個(gè)意思,那是一句來自古老的印第安人部落中的箴言:“向一個(gè)不斷學(xué)習(xí)的人學(xué)知識就好比是在飲一條生生不息的河流”。任何書籍的成功都離不開出版社、評審者以及其他給出指導(dǎo)和建議的人們的幫助。感謝我的編輯Peter Gordon給予鼓勵(lì)并包容一個(gè)熱情而任性的作者在寫他的第一本書的過程中情緒起落。同樣感謝Peter的得力助手Bernard Gaffney,他很好地控制了整個(gè)計(jì)劃進(jìn)程,并耐心地答復(fù)我每天發(fā)去的幾封電子郵件。還要感謝Addison Wesley出版社的產(chǎn)品和市場部門的其他職員,包括Amy Fleischer、Chanda Leary-Coutu、Heather Mullane、Jacquelyn Doucette、Jennifer Andrews、Kim Boedigheimer以及Kristy Hart。衷心感謝(并致歉)我的項(xiàng)目經(jīng)理Jessica Balch不厭其煩地幫助我糾正書中糟糕的句法、蹩腳的幽默以及英式英語的拼寫(例如有很多“ize”被寫成了“ise”)。還要特別感謝Debbie Lafferty,2002年的某一個(gè)晚上我在睡夢中冒出了“Imperfect C++”這個(gè)念頭,是Debbie Lafferty鼓勵(lì)我付諸實(shí)現(xiàn)的。感謝忠誠的評審者們,他們是Chuck Allison、Dave Brooks、Darren Lynch、Duane Yates、Eugene Gershnik、Gary Pennington、George Frasier、Greg Peet、John Torjo、Scott Patterson以及Walter Bright。沒有他們我肯定會到處磕磕碰碰,踉踉蹌蹌。他們中的一些人讓我保持心情愉快,有些人則使我質(zhì)疑這個(gè)寫作計(jì)劃是否明智,但無論如何他們的反饋信息都極大地有助于我改善最終的成果。我們生活在一個(gè)奇妙的世界中,來自各個(gè)不同國家的人們可以建立起友誼,雖然其中大部分人我未曾謀面,卻能夠給予我如此之多的幫助,這真是奇妙!同樣要感謝Addison Wesley的審閱者們,包括Dan Saks、JC van Winkel、Jay Roy、Ron McCarty、Justin Shaw、Nevin Liber以及Steve Clamage。他們的反饋信息對于本書的篇幅能夠降到1000頁以下起到了至關(guān)重要的作用,而且?guī)椭冶苊饬艘恍o聊的閑話和粗心大意的錯(cuò)誤。作為一名作者,我早已領(lǐng)略了寫作和審稿過程的艱辛,我知道一次徹底的審閱需要付出多少精力,真的非常感謝他們投入的時(shí)間和精力。感謝Peter Dimov允許我引用他的名言(在第26章),同時(shí)還對第五部分各章給出了極好的建議。感謝Kevlin Henney對第19章和智能強(qiáng)制的一些有趣的討論所給予的關(guān)注。感謝Joe Goodman仔細(xì)審閱有關(guān)C++ ABI的那一部分(第7、8兩章),使我最終能夠呈上一份像樣的討論。感謝Thorsten Ottosen在第1章有關(guān)契約式設(shè)計(jì)部分提供的類似的幫助。特別感謝Chuck Allison、Herb Sutter、Joe Casad、John Dorsey以及Jon Erickson,他們在過去的幾年中在各方面都給予我極大的支持和鼓勵(lì)。感謝Bjarne Stroustrup的鼓勵(lì),他還不時(shí)為我補(bǔ)上一點(diǎn)歷史常識。哦,首先還是要感謝他發(fā)明了這門神奇的語言!感謝Walter Bright在本書的寫作過程中持續(xù)不斷地改進(jìn)他的優(yōu)秀的Digital Mars C/C++編譯器,在世界上最缺乏耐心的家伙持續(xù)的質(zhì)問面前保持責(zé)任心,而且還友好地將我引領(lǐng)入D語言開發(fā)世界,后者也給我這本書的寫作帶來了不少靈感。同樣感謝Greg Comeau,盡管他用不著對他的Comeau編譯器做那么多的改進(jìn):Comeau是目前業(yè)界最遵從標(biāo)準(zhǔn)的C++編譯器!他們除了是優(yōu)秀而又反應(yīng)迅速的編譯器供應(yīng)者之外,還在眾多問題上持續(xù)不斷地給予鼓勵(lì)、建議以及其他信息。感謝CMP出版公司允許我在書中使用我原先在他們刊物上發(fā)表的文章中的一些內(nèi)容,并允許我將原先的幾篇文章放在隨書光盤中(見附錄D)。感謝Borland、CodePlay、Digital Mars、Intel、Metrowerks以及Microsoft公司為我的研究、寫作以及編寫開源庫提供編譯器。特別要感謝Digital Mars、Intel和Watcom公司授權(quán)我將他們的編譯器放在隨書光盤中(見附錄D)。另外,Greg Peet在光盤的設(shè)計(jì)及內(nèi)容方面的巨大幫助值得大大嘉賞。謝謝C/C++ User's Journal、Dr. Dobb's Journal、BYTE以及Windows Developer Network的讀者,他們?yōu)槲业奈恼潞蛯谟押玫靥峁┝朔答佇畔⒑椭С?。同樣感謝整個(gè)C++社群,以及那些關(guān)注各種與C++有關(guān)的新聞組(見附錄A)的好心人。他們是Attila Feher、Carl Young、Daniel Spangenberg、Eelis van der Weegen、Gabriel Dos Reis、Igor Tandetnik、John Potter、Massimiliano Alberti、Michal Necasek、Richard Smith、Ron Crane、Steven Keuchel、Thomas Richter以及“tom_usenet”,而且或許還有好些人沒有列出。尤其感謝Ilya Minkov,是他要求我為STLSoft庫增加屬性(Properties)實(shí)現(xiàn)的,而我自己以前可沒有產(chǎn)生過這個(gè)念頭。如果不是因?yàn)檫@個(gè)建議,我可能永遠(yuǎn)也不會實(shí)現(xiàn)這項(xiàng)我鐘愛的技術(shù)(見第35章)。最后,還要感謝STLSoft庫的所有用戶,沒有他們的信息反饋,這個(gè)庫中的許多特性就不會存在,而且本書中的某些部分也會變得難弄得多。Matthew Wilson
內(nèi)容概要
即便是C++陣營里最忠實(shí)的信徒,也不得不承認(rèn):C++語言并不完美。實(shí)際上,世界上也沒有完美的編程語言。
如何克服C++類型系統(tǒng)的不足?在C++中,如何利用約束、契約和斷言來實(shí)施軟件設(shè)計(jì)?如何處理被C++標(biāo)準(zhǔn)所忽略的動態(tài)庫、靜態(tài)對象以及線程等有關(guān)的問題?隱式轉(zhuǎn)換有何替代方案?《Imperfect C++中文版》將為你一一解答這些問題。針對C++的每一個(gè)不完美之處,《Imperfect C++中文版》都具體地分析原因,并探討實(shí)用的解決方案。書中也不乏許多作者創(chuàng)新的、你從未聽說過或使用的技術(shù),但這些確實(shí)能幫助你成為C++方面的專家。
《Imperfect C++中文版》適合有一定經(jīng)驗(yàn)的C++程序員和項(xiàng)目經(jīng)理閱讀,也適合對C++編程的一些專門或高級話題感興趣的讀者參考。
作者簡介
作者:(美國)Matthew Wilson 譯者:榮耀 劉未鵬Matthew Wilson是一名軟件開發(fā)顧問,也是STLSoft庫的創(chuàng)建者。他為雙月刊C/C++ Users Journal撰寫關(guān)于將C/C++與其他語言和技術(shù)進(jìn)行整合的專欄文章,同時(shí)也是C++ Experts Forum在線專欄作家。Wilson有十余年C++開發(fā)經(jīng)驗(yàn)。榮耀,南京師范大學(xué)教師。他是一名C++講師和研究者,譯有《C++必知必會》、《C++ Templates全覽》以及《C++ Template Metaprogramming中文版》(中文繁體版)等,并在期刊雜志上發(fā)表過多篇文章。他原任電力自動化研究院工程師與項(xiàng)目經(jīng)理,是數(shù)個(gè)企業(yè)級信息系統(tǒng)項(xiàng)目負(fù)責(zé)人。劉未鵬,南京大學(xué)計(jì)算機(jī)系碩士畢業(yè),現(xiàn)就職于微軟亞洲研究院創(chuàng)新工程中心。
書籍目錄
第一部分 基礎(chǔ)知識 1
第1章 強(qiáng)制設(shè)計(jì):約束、契約和斷言 3
1.1 綠蛋和火腿 4
1.2 編譯期契約:約束 4
1.2.1 must_have_base() 5
1.2.2 must_be_subscriptable() 6
1.2.3 must_be_subscriptable_as_decayable_pointer() 6
1.2.4 must_be_pod() 7
1.2.5 must_be_same_size() 9
1.2.6 使用約束 10
1.2.7 約束和TMP 11
1.2.8 約束:尾聲 11
1.3 運(yùn)行期契約:前置條件、后置條件和不變式 12
1.3.1 前置條件 13
1.3.2 后置條件 13
1.3.3 類不變式 15
1.3.4 檢查?總是進(jìn)行 16
1.3.5 DbC還是不DbC 17
1.3.6 運(yùn)行期契約:尾聲 17
1.4 斷言 18
1.4.1 獲取消息 19
1.4.2 不恰當(dāng)?shù)臄嘌浴?0
1.4.3 語法以及64位指針 21
1.4.4 避免使用verify() 21
1.4.5 為你的斷言命名 22
1.4.6 避免使用#ifdef_DEBUG 23
1.4.7 DebugBreak()和int 3 24
1.4.8 靜態(tài)/編譯期斷言 24
1.4.9 斷言:尾聲 26
第2章 對象生命期 27
2.1 對象生命周期 27
2.2 控制你的客戶端 28
2.2.1 成員類型 28
2.2.2 缺省構(gòu)造函數(shù) 28
2.2.3 拷貝構(gòu)造函數(shù) 29
2.2.4 拷貝賦值 29
2.2.5 new和delete 30
2.2.6 虛析構(gòu) 30
2.2.7 explicit 31
2.2.8 析構(gòu)函數(shù) 31
2.2.9 友元 32
2.3 MIL及其優(yōu)點(diǎn) 33
2.3.1 取得一塊更大的場地 35
2.3.2 成員順序依賴 37
2.3.3 offsetof() 38
2.3.4 MIL:尾聲 39
第3章 資源封裝 40
3.1 資源封裝分類 40
3.2 POD類型 41
3.2.1 直接操縱 41
3.2.2 API函數(shù)和透明類型 42
3.2.3 API函數(shù)和不透明類型 42
3.3 外覆代理類 43
3.4 RRID類型 45
3.4.1 缺省初始化:緩式初始化 46
3.4.2 未初始化 48
3.5 RAII類型 51
3.5.1 常性RAII和易變性RAII 51
3.5.2 內(nèi)部初始化和外部初始化 53
3.5.3 RAII排列 53
3.6 RAII:尾聲 54
3.6.1 不變式 54
3.6.2 錯(cuò)誤處理 54
第4章 數(shù)據(jù)封裝和值類型 55
4.1 數(shù)據(jù)封裝的分類學(xué) 55
4.2 值類型和實(shí)體類型 56
4.3 值類型的分類學(xué) 56
4.4 開放式類型 58
4.4.1 POD開放式類型 58
4.4.2 C++數(shù)據(jù)結(jié)構(gòu) 59
4.5 封裝式類型 60
4.6 值類型 61
4.7 算術(shù)值類型 62
4.8 值類型:尾聲 63
4.9 封裝:尾聲 64
第5章 對象訪問模型 68
5.1 確定性生命期 68
5.2 返回拷貝 70
5.3 直接交給調(diào)用者 70
5.4 共享對象 71
第6章 域守衛(wèi)類 73
6.1 值 73
6.2 狀態(tài) 78
6.3 API和服務(wù) 83
6.3.1 API 83
6.3.2 服務(wù) 86
6.4 語言特性 87
第二部分 生存在現(xiàn)實(shí)世界 89
第7章 ABI 91
7.1 共享代碼 91
7.2 C ABI需求 93
7.2.1 結(jié)構(gòu)布局 93
7.2.2 調(diào)用約定、符號名以及目標(biāo)文件格式 94
7.2.3 靜態(tài)連接 94
7.2.4 動態(tài)連接 95
7.3 C++ ABI需求 96
7.3.1 對象布局 97
7.3.2 虛函數(shù) 97
7.3.3 調(diào)用約定和名字重整 97
7.3.4 靜態(tài)連接 99
7.3.5 動態(tài)連接 99
7.4 現(xiàn)在知道怎么做了 100
7.4.1 extern“C” 100
7.4.2 名字空間 103
7.4.3 extern“C++” 103
7.4.4 獲得C++類的句柄 106
7.4.5 “由實(shí)現(xiàn)定義”的隱患 108
第8章 跨邊界的對象 110
8.1 近乎可移植的虛函數(shù)表 110
8.1.1 虛函數(shù)表布局 111
8.1.2 動態(tài)操縱虛函數(shù)表 113
8.2 可移植的虛函數(shù)表 114
8.2.1 利用宏進(jìn)行簡化 116
8.2.2 兼容的編譯器 116
8.2.3 可移植的服務(wù)端對象 117
8.2.4 簡化可移植接口的實(shí)現(xiàn) 119
8.2.5 C客戶代碼 120
8.2.6 OAB的約束 120
8.3 ABI/OAB尾聲 121
第9章 動態(tài)庫 123
9.1 顯式調(diào)用函數(shù) 123
9.1.1 顯式調(diào)用C++函數(shù) 124
9.1.2 打破C++訪問控制 125
9.2 同一性:連接單元和連接空間 125
9.2.1 連接單元 125
9.2.2 連接空間 126
9.2.3 多重身份 126
9.3 生命期 127
9.4 版本協(xié)調(diào) 128
9.4.1 丟失的函數(shù) 128
9.4.2 變化的簽名 128
9.4.3 行為的改變 129
9.4.4 常量 129
9.5 資源所有權(quán) 130
9.5.1 共享池 130
9.5.2 返還給被調(diào)用方 130
9.6 動態(tài)庫:尾聲 131
第10章 線程 132
10.1 對整型值的同步訪問 133
10.1.1 操作系統(tǒng)函數(shù) 134
10.1.2 原子類型 135
10.2 對(代碼)塊的同步訪問:臨界區(qū) 136
10.2.1 進(jìn)程間互斥體和進(jìn)程內(nèi)互斥體 137
10.2.2 自旋互斥體 138
10.3 原子整型的性能 139
10.3.1 基于互斥體的原子整型 139
10.3.2 運(yùn)行期按架構(gòu)派發(fā) 141
10.3.3 性能比較 142
10.3.4 原子整型操作:尾聲 143
10.4 多線程擴(kuò)展 144
10.4.1 synchronized 144
10.4.2 匿名synchronized 147
10.4.3 atomic 147
10.5 線程相關(guān)的存儲 148
10.5.1 重入 148
10.5.2 線程相關(guān)的數(shù)據(jù)/線程局部存儲 148
10.5.3 declspec(thread)和TLS 150
10.5.4 Tss庫 150
10.5.5 TSS的性能 155
第11章 靜態(tài)對象 156
11.1 非局部靜態(tài)對象:全局對象 157
11.1.1 編譯單元內(nèi)的順序性 158
11.1.2 編譯單元間的順序性 159
11.1.3 利用main()避免全局變量 161
11.1.4 全局對象尾聲:順序性 162
11.2 單件 163
11.2.1 Meyers單件 163
11.2.2 Alexandrescu單件 164
11.2.3 即時(shí)Schwarz計(jì)數(shù)器:一個(gè)極妙的主意 165
11.2.4 對API計(jì)數(shù) 166
11.2.5 被計(jì)數(shù)的API、外覆類、代理類:最終得到一個(gè)順序化的單件 168
11.3 函數(shù)范圍內(nèi)的靜態(tài)對象 169
11.3.1 犧牲緩式求值能力 171
11.3.2 自旋互斥體是救星 171
11.4 靜態(tài)成員 172
11.4.1 解決連接問題 172
11.4.2 自適應(yīng)代碼 174
11.5 靜態(tài)對象:尾聲 175
第12章 優(yōu)化 176
12.1 內(nèi)聯(lián)函數(shù) 176
12.1.1 警惕過早優(yōu)化 176
12.1.2 只含有頭文件的庫 177
12.2 返回值優(yōu)化 177
12.3 空基類優(yōu)化 180
12.4 空派生類優(yōu)化 183
12.5 阻止優(yōu)化 184
第三部分 語言相關(guān)的議題 188
第13章 基本類型 189
13.1 可以給我來一個(gè)字節(jié)嗎 189
13.1.1 標(biāo)明符號 190
13.1.2 一切都在名字之中 190
13.1.3 窺探void內(nèi)部 191
13.1.4 額外的安全性 191
13.2 固定大小的整型 192
13.2.1 平臺無關(guān)性 193
13.2.2 類型相關(guān)的行為 195
13.2.3 固定大小的整型:尾聲 197
13.3 大整型 198
13.4 危險(xiǎn)的類型 200
13.4.1 引用和臨時(shí)對象 200
13.4.2 bool 201
第14章 數(shù)組和指針 204
14.1 不要重復(fù)你自己 204
14.2 數(shù)組退化為指針 206
14.2.1 下標(biāo)索引操作符的交換性 206
14.2.2 阻止退化 208
14.3 dimensionof() 209
14.4 無法將數(shù)組傳遞給函數(shù) 211
14.5 數(shù)組總是按地址進(jìn)行傳遞 214
14.6 派生類的數(shù)組 215
14.6.1 通過指針保存多態(tài)類型 216
14.6.2 提供非缺省的構(gòu)造函數(shù) 217
14.6.3 隱藏向量式new和delete 218
14.6.4 使用std::vector 218
14.6.5 確保類型的大小相同 219
14.7 不能擁有多維數(shù)組 222
第15章 值 226
15.1 NULL的是非曲直 226
15.2 回到0 232
15.3 屈服于事實(shí) 235
15.4 字面量 236
15.4.1 整型 236
15.4.2 后綴 238
15.4.3 字符串 240
15.5 常量 243
15.5.1 簡單常量 243
15.5.2 類類型常量 244
15.5.3 成員常量 245
15.5.4 類類型的成員常量 248
第16章 關(guān)鍵字 251
16.1 interface 251
16.2 temporary 253
16.3 owner 256
16.4 explicit(_cast) 261
16.4.1 使用顯式訪問函數(shù) 263
16.4.2 模擬顯式轉(zhuǎn)換 264
16.4.3 使用特性墊片 265
16.5 unique 266
16.6 final 267
16.7 不被支持的關(guān)鍵字 267
第17章 語法 270
17.1 類的代碼布局 270
17.2 條件表達(dá)式 273
17.2.1 “使它布爾” 273
17.2.2 一個(gè)危險(xiǎn)的賦值 275
17.3 for 277
17.3.1 初始化作用域 277
17.3.2 異質(zhì)初始化類型 278
17.4 變量命名 280
17.4.1 匈牙利命名法 280
17.4.2 成員變量 281
第18章 Typedef 284
18.1 指針typedef 286
18.2 定義里面有什么 288
18.2.1 概念性的類型定義 288
18.2.2 上下文相關(guān)的類型定義 289
18.3 別名 292
18.3.1 錯(cuò)誤的概念性類型互換 293
18.3.2 不能對概念性類型進(jìn)行重載 294
18.4 true_typedef 294
18.5 好的、壞的、丑陋的 300
18.5.1 好的typedef 300
18.5.2 壞的typedef 303
18.5.3 可疑的typedef 304
第四部分 感知式轉(zhuǎn)換 308
第19章 強(qiáng)制 310
19.1 隱式轉(zhuǎn)換 310
19.2 C++中的強(qiáng)制 311
19.3 適合使用C強(qiáng)制的場合 312
19.4 模仿強(qiáng)制 314
19.5 explicit_cast 316
19.6 literal_cast 321
19.7 union_cast 323
19.8 comstl::interface_cast 327
19.8.1 interface_cast_addref 328
19.8.2 interface_cast_noaddref 329
19.8.3 interface_cast_test 329
19.8.4 接口強(qiáng)制操作符的實(shí)現(xiàn) 330
19.8.5 保護(hù)引用計(jì)數(shù) 333
19.8.6 interface_cast_base 334
19.8.7 IID_traits 335
19.8.8 interface_cast 尾聲 336
19.9 boost::polymorphic_cast 337
19.10 強(qiáng)制:尾聲 339
第20章 墊片 341
20.1 擁抱變化 擁抱自由 341
20.2 特性墊片 344
20.3 邏輯墊片 346
20.4 控制墊片 347
20.5 轉(zhuǎn)換墊片 348
20.6 復(fù)合式墊片概念 350
20.6.1 訪問墊片 351
20.6.2 返回值生命期 352
20.6.3 泛化的類型操縱 354
20.6.4 效率方面的考慮 356
20.7 名字空間和Koenig查找 357
20.8 為何不使用traits 359
20.9 結(jié)構(gòu)一致性 360
20.10 打破巨石 362
20.11 墊片:尾聲 363
第21章 飾面 365
21.1 輕量級RAII 366
21.2 將數(shù)據(jù)和操作綁定在一起 367
21.2.1 pod_veneer 368
21.2.2 創(chuàng)建日志消息 370
21.2.3 減少浪費(fèi) 371
21.2.4 類型安全的消息類 372
21.3 “擦亮”飾面概念 374
21.4 飾面:尾聲 376
第22章 螺栓 377
22.1 添加功能 377
22.2 皮膚選擇 378
22.3 非虛重寫 379
22.4 巧用作用域 380
22.5 擬編譯期多態(tài):逆反式螺栓 383
22.6 參數(shù)化多態(tài)包裝 384
22.7 螺栓:尾聲 386
第23章 模板構(gòu)造函數(shù) 387
23.1 不易察覺的開銷 389
23.2 懸掛引用 389
23.3 模板構(gòu)造函數(shù)特化 391
23.4 實(shí)參代理 392
23.5 明確實(shí)參的范疇 394
23.6 模板構(gòu)造函數(shù):尾聲 395
第五部分 操作符 396
第24章 operator bool() 398
24.1 operator int() const 398
24.2 operator void *() const 399
24.3 operator bool() const 400
24.4 operator !() const 401
24.5 operator boolean const *() const 401
24.6 operator int boolean::*() const 402
24.7 在現(xiàn)實(shí)世界中操作 402
24.8 operator! 407
第25章 快速、非侵入性的字符串拼接 408
25.1 fast_string_concatenator 409
25.1.1 與用戶自定義的字符串類協(xié)同工作 409
25.1.2 將“拼接子”串起來 410
25.1.3 fast_string_concatenator類 411
25.1.4 內(nèi)部實(shí)現(xiàn) 413
25.2 性能 417
25.3 與其他字符串類協(xié)作 420
25.3.1 整合進(jìn)標(biāo)準(zhǔn)庫中 420
25.3.2 整合進(jìn)可改動的現(xiàn)存類中 420
25.3.3 與不可更改的類互操作 420
25.4 拼接提示 421
25.5 病態(tài)括號 422
25.6 標(biāo)準(zhǔn)化 423
第26章 你的地址是什么 424
26.1 無法得到真實(shí)的地址 424
26.1.1 STL式元素存放 424
26.1.2 ATL外覆類和CAdapt 425
26.1.3 獲取真實(shí)的地址 426
26.2 在轉(zhuǎn)換過程中發(fā)生了什么 427
26.3 我們返回什么 429
26.4 你的地址是什么:尾聲 431
第27章 下標(biāo)索引操作符 434
27.1 指針轉(zhuǎn)換與下標(biāo)索引操作符 434
27.1.1 選擇隱式轉(zhuǎn)換操作符 436
27.1.2 選擇下標(biāo)索引操作符 437
27.2 錯(cuò)誤處理 437
27.3 返回值 439
第28章 增量操作符 441
28.1 缺少后置式操作符 442
28.2 效率 443
第29章 算術(shù)類型 446
29.1 類定義 446
29.2 缺省構(gòu)造 447
29.3 初始化(值構(gòu)造) 447
29.4 拷貝構(gòu)造函數(shù) 450
29.5 賦值 450
29.6 算術(shù)操作符 451
29.7 比較操作符 452
29.8 訪問值 452
29.9 sinteger64 453
29.10 截?cái)唷⑻嵘约安紶枩y試 453
29.10.1 截?cái)唷?53
29.10.2 提升 455
29.10.3 布爾測試 455
29.11 算術(shù)類型:尾聲 456
第30章 短路 458
第六部分 擴(kuò)展C++ 460
第31章 返回值生命期 461
31.1 返回值生命期問題分類 461
31.1.1 局部變量 462
31.1.2 局部靜態(tài)對象 462
31.1.3 析構(gòu)后指針(Postdestruction Pointers) 462
31.2 為何按引用返回 462
31.3 解決方案1——integer_to_string 462
31.4 解決方案2——TSS 465
31.4.1 --declspec(thread) 466
31.4.2 Win32 TLS 466
31.4.3 平臺無關(guān)的API 469
31.4.4 RVL 470
31.5 解決方案3——擴(kuò)展RVL 470
31.5.1 解決線程內(nèi)的RVL-LS問題 471
31.5.2 RVL 472
31.6 解決方案4——靜態(tài)數(shù)組大小決議 472
31.7 解決方案5——轉(zhuǎn)換墊片 474
31.8 性能 476
31.9 RVL:垃圾收集的大勝利 477
31.10 可能的應(yīng)用 478
31.11 返回值生命期:尾聲 478
第32章 內(nèi)存 479
32.1 內(nèi)存分類 479
32.1.1 棧和靜態(tài)內(nèi)存 479
32.1.2 棧擴(kuò)張 480
32.1.3 堆內(nèi)存 481
32.2 兩者之間的折衷 481
32.2.1 alloca() 482
32.2.2 VLA 483
32.2.3 auto_buffer 483
32.2.4 使用auto_buffer 486
32.2.5 EBO,在哪里 487
32.2.6 性能 488
32.2.7 堆、棧以及其他 490
32.2.8 pod_vector 491
32.3 配置器 493
32.3.1 函數(shù)指針 493
32.3.2 配置器接口 494
32.3.3 每庫初始化(Per-library Initialization) 495
32.3.4 每調(diào)用指定(Per-Call Specification) 496
32.4 內(nèi)存:尾聲 496
第33章 多維數(shù)組 497
33.1 激活下標(biāo)索引操作符 498
33.2 運(yùn)行時(shí)確定大小 499
33.2.1 可變長數(shù)組 499
33.2.2 vector< ... vector ... > 500
33.2.3 boost::multi_array 501
33.2.4 fixed_array_1/2/3/4d 501
33.3 編譯期確定大小 505
33.3.1 boost::array 506
33.3.2 static_array_1/2/3/4d 506
33.4 塊訪問 508
33.4.1 使用std::fill_n() 509
33.4.2 array_size墊片 510
33.5 性能 512
33.5.1 運(yùn)行期確定大小 513
33.5.2 編譯期確定大小 514
33.6 多維數(shù)組:尾聲 515
第34章 仿函數(shù)和區(qū)間 516
34.1 語法混亂 516
34.2 for_all() 517
34.2.1 數(shù)組 518
34.2.2 命名 518
34.3 局部仿函數(shù) 520
34.3.1 手寫循環(huán) 520
34.3.2 自定義仿函數(shù) 521
34.3.3 內(nèi)嵌的仿函數(shù) 521
34.3.4 溫和一些 523
34.3.5 泛化的仿函數(shù):類型隧道(Type Tunneling) 524
34.3.6 再進(jìn)一步,走得太遠(yuǎn)了 526
34.3.7 局部仿函數(shù)和回調(diào)API 527
34.4 區(qū)間 529
34.4.1 區(qū)間概念 529
34.4.2 概念性區(qū)間 531
34.4.3 可迭代區(qū)間 533
34.4.4 區(qū)間算法和標(biāo)簽 533
34.4.5 過濾器 535
34.4.6 虛偽 536
34.5 仿函數(shù)和區(qū)間:尾聲 536
第35章 屬性 537
35.1 編譯器擴(kuò)展 539
35.2 可供選擇的實(shí)現(xiàn)方案 539
35.2.1 將屬性的實(shí)現(xiàn)分門別類 540
35.2.2 EMO 540
35.3 字段屬性 541
35.3.1 field_property_get 541
35.3.2 field_property_set 545
35.3.3 內(nèi)置式字段屬性:尾聲 546
35.3.4 field_property_get_external 546
35.3.5 field_property_set_external 547
35.3.6 Hack掉 547
35.4 方法屬性 548
35.4.1 method_property_get 548
35.4.2 method_property_set 555
35.4.3 method_property_getset 555
35.4.4 謹(jǐn)防無限循環(huán) 557
35.4.5 method_property_get_external 558
35.4.6 method_property_set_external 561
35.4.7 method_property_getset_external 562
35.5 靜態(tài)屬性 564
35.5.1 靜態(tài)字段屬性 564
35.5.2 內(nèi)置式靜態(tài)方法屬性 564
35.5.3 外置式靜態(tài)方法屬性 566
35.6 虛屬性 567
35.7 屬性的使用 568
35.7.1 泛化性 568
35.7.2 錯(cuò)誤診斷中的類型替換 569
35.8 屬性:尾聲 570
附錄A 編譯器和庫 572
A.1 編譯器 572
A.2 庫 573
A.2.1 Boost 574
A.2.2 STLSoft 574
A.2.3 其他庫 574
A.3 其他資源 575
A.3.1 期刊 575
A.3.2 其他語言 575
A.3.3 新聞組 576
附錄B “謙虛點(diǎn),別驕傲” 577
B.1 操作符重載 577
B.2 后悔DRY 579
B.3 偏執(zhí)式編程 579
B.4 精神錯(cuò)亂 580
附錄C Arturius 582
附錄D 隨書光盤 583
尾聲 584
參考書目 585
章節(jié)摘錄
版權(quán)頁: 插圖: 如果你沒有任何COM背景的話,上面的代碼對你來說可能會相當(dāng)陌生,但事實(shí)上它是相當(dāng)直觀的。它之所以能夠工作是因?yàn)閺母旧险f類也只不過是個(gè)結(jié)構(gòu),并且,如果該類定義了虛函數(shù)(或者派生自某個(gè)定義了虛函數(shù)的類)的話,那么其實(shí)例將會包含一個(gè)隱藏的vptr(指向vtable的指針)。vptr指向一個(gè)表,該表中包含了指向該類的所有虛函數(shù)的指針,因而被稱為虛函數(shù)表(vtable)。一般情況下,同一個(gè)類的所有實(shí)例共享同一份vtable。在上面的C代碼中,vtable是以結(jié)構(gòu)IObjectVTable來表現(xiàn)的,它包含了指向SetName()和GetName()函數(shù)的指針,這種函數(shù)指針跟其他的函數(shù)指針沒什么兩樣,只不過其第一個(gè)參數(shù)總是指向該接口的指針,即C++中的this指針。struct IObject中只有一個(gè)成員vtable,它是一個(gè)指針,指向該接口的虛函數(shù)表,即structIObjectVTable的一個(gè)實(shí)例。 正如我前面說過的,我們的6個(gè)Win32編譯器在這個(gè)布局方面完全一致?;蛟SWin32編譯器支持這種布局并非巧合,因?yàn)檫@種布局正是COM所使用的,而Win32編譯器要想得到流行的話必須支持COM。 盡管我們承認(rèn)這當(dāng)然是一個(gè)明顯而高效的對象布局模型,然而確實(shí)存在著一些編譯器不這么做。一個(gè)不支持這種布局的Win32編譯器就是GCC2.95(GCC3.2支持)。經(jīng)過一些“不足為外人道”的手法,探知GCC2.95使用的vtable布局是像這樣的: v1、v3和v4的值是0,因此我猜測這與pack問題有關(guān),v2看起來是指向某個(gè)地址跟SetName()和GetName()很靠近的函數(shù),但我不知道這個(gè)函數(shù)的精確特征。如此“特立獨(dú)行”的并非僅GCC2.95一家,Sun的C++編譯器1使用類似下面的這種布局: 所以我們現(xiàn)在有了一個(gè)不太理想的選擇。選擇之一是采用這種部分的解決方案,至少Win32上的現(xiàn)代編譯器看起來都支持這種方案。如果在其他平臺上試一下的話,可能也會發(fā)現(xiàn)類似的一致布局的情況,對此我們可以采取同樣的立場。 且慢!我們是不完美主義的實(shí)踐者,并且這種做法遠(yuǎn)沒達(dá)到預(yù)期的程度。我們需要尋找一種徹底的解決方案。 8.1.2動態(tài)操縱虛函數(shù)表 在我們試圖設(shè)計(jì)出一個(gè)完全可移植的方案之前,我暫且充當(dāng)一次不負(fù)責(zé)任的角色,向你展示一些“奇技淫巧”,借此你可以對C++對象布局動點(diǎn)手術(shù)。 可能你會覺得這里講的這些東西太高深,并擔(dān)心是否必須自己定義這些C虛函數(shù)表。通常你不必這么做,C++編譯器會為你打理好一切。 干預(yù)任何C++編譯器生成的類的虛函數(shù)表都不是明智之舉,因?yàn)槟銓λ娜魏胃深A(yù)都會在整進(jìn)程的生命期中反映在該類的所有實(shí)例身上。1但是在c里面你完全可以操縱你自己的虛函數(shù)表,這種能力在某些非常罕見的場合下可以被用來改變對象的運(yùn)行期特征(行為)。我并不建議你采取這種做法,它的主要作用在于可以學(xué)習(xí)c++實(shí)現(xiàn)相關(guān)的機(jī)理,但是作為用在產(chǎn)品軟件中的技術(shù)卻不大合適。不過,知道它是怎么做的倒也不算壞事。 基本上,這可以分為3個(gè)步驟。首先,你必須分配自己的虛函數(shù)表。這在C里面實(shí)現(xiàn),只不過是簡單地分配一份可用于保存虛函數(shù)表內(nèi)容的內(nèi)存塊而已。其次,你得從一個(gè)有效的對象中將虛函數(shù)表拷貝出來,這也是用c來實(shí)現(xiàn)的,只不過是在c++編譯單元中創(chuàng)建的對象身上進(jìn)行操作。最后,你可以改變你的新虛函數(shù)表中的成員,并將這個(gè)新的虛函數(shù)表掛到你要改變其行為的對象身上,這仍然是在C里面實(shí)現(xiàn)的,但目標(biāo)對象可以是c++編譯單元中創(chuàng)建的對象。所有這3個(gè)步驟可以被包裝在同一個(gè)函數(shù)中。
媒體關(guān)注與評論
“千萬不要被書名所誤導(dǎo)!這是一本擁抱(而非詆毀)C++的著作。它有著獨(dú)特的定位:為現(xiàn)實(shí)世界中的程序員提供切合實(shí)際的解決方案,以解決C++語言自身的各種“不完美”。 世界上沒有完美的編程語言。在本書中,Matthew Wilson不但為我們指出C++中諸多不完美之處,還提供了經(jīng)過實(shí)踐檢驗(yàn)的應(yīng)對技術(shù)和技巧,便于我們利用“不完美的C++”編寫出近乎完美的代碼——強(qiáng)健、高效、靈活、可移植、優(yōu)雅的代碼,而這些代碼在聲稱為“完美的語言”中往往更難實(shí)現(xiàn)?!? 本書對給出的每一個(gè)“不完美”都進(jìn)行了細(xì)致的探討:為什么說它是一個(gè)“不完美”?對其修復(fù)的指導(dǎo)思想是什么?有時(shí)候只是告誡你避免做些什么,給出一些約束和建議,更多的時(shí)候則為你提供現(xiàn)實(shí)的解決方案,這些方案往往離不開對現(xiàn)代模板編程技術(shù)的使用?!? 書中包含有許多你未曾聽過或用過的技術(shù),有些屬于作者的創(chuàng)新,有些則是對現(xiàn)有技術(shù)的精化,二者均被提升到“范式”的高度。例如:應(yīng)用程序二進(jìn)制接口(ABI)、墊片(Shim)、飾面(Veneer)、螺栓(Bolt-in)、區(qū)間(range)、屬性(property)等。不少主題難度大,此前為其他C++專家所忽略。要探討它們除了需要勇氣外,第一手經(jīng)驗(yàn)更是不可或缺。作為STLSoft庫的主創(chuàng)者,Matthew在舉例時(shí),對Windows API、MFC、ATL、COM以及UNIX等都是信手拈來?!? 除了豐富的實(shí)踐、扎實(shí)的理論以及縝密的邏輯外,Matthew的文筆流暢,語言幽默,說理直接,字里行間流露出過人的自信,使得本書極具閱讀趣味?!? 本書具有一定的閱讀門檻,目標(biāo)讀者為中、高級職業(yè)C++程序員。書中展示的代碼示例、編程技術(shù)往往在幾款甚至十幾款編譯器上進(jìn)行驗(yàn)證, 輔以表格對其各色特性加以比較,并針對不同編譯器所表現(xiàn)出的差異性而給出高效、可移植的解決方案——就像很多現(xiàn)實(shí)世界中的C++程序員應(yīng)該做(而沒做到)的那樣。如果你正在尋找一本真材實(shí)料的“C++實(shí)戰(zhàn)”參考書,本書不會讓你失望?!? 本書中文版由我和劉未鵬先生合譯。未鵬思維敏捷,技術(shù)、文筆俱佳,我很高興與他合作。 感謝陳冀康編輯給予的理解和支持。感謝朱艷的照料和熱愛。榮珅則常常用他的小拳頭亂砸書房的門,并大聲地叫“爸爸”,這種干擾讓我獲得了必不可少的休息時(shí)間?!? 已有的經(jīng)典名著使得C++新書問世難度加大,后來者若無過人之處就很難引起C++社群的注意,Imperfect C++、C++ Common Knowledge以及C++ Template Metaprogramming等佳作一經(jīng)問世便得到廣泛的關(guān)注。作為譯者(之一),我祝愿它們能夠帶給各位久違的快樂! ——榮耀 刀有很多種,有單刀,雙刀,樸刀,戒刀,鋸齒刀,砍山刀,鬼頭刀,雁翎刀,五鳳朝陽刀,魚鱗紫金刀?!? —— 古龍《飛刀,又見飛刀》 這里我們要說的刀,是瑞士軍刀,瑞士軍刀其實(shí)嚴(yán)格來說并不能算是一種刀,其功能的繁雜和精細(xì)已然超過了刀的范疇。它包含的工具一般有主刀、小刀、剪刀、開瓶器、木鋸、小改錐、拔木塞鉆、牙簽、小鑷子等,而在一些工具上還設(shè)計(jì)了多種功用,如開瓶器上,就具有開瓶、平口改錐、電線剝皮槽3種功用。隨著時(shí)代的發(fā)展,一些新興的電子技術(shù)也被引入瑞士軍刀中,如內(nèi)藏激光筆、電筒等。 瑞士軍刀是軍人在野外生存的必備工具,其小體積濃縮眾多實(shí)用功能的精心設(shè)計(jì)能夠?qū)⒁话训兜娜菹薨l(fā)揮到最大,絲毫不遜于《第一滴血》中藍(lán)博帶在身上的那把銳利的寒光閃閃的鋼刀。 那么現(xiàn)在你拿在手里的這本書就是一把瑞士軍刀! 這是一本非常特別的C++圖書,在市面上已經(jīng)存在的大量經(jīng)典C++書籍當(dāng)中,這本書的著眼點(diǎn)和寫作風(fēng)格使它顯得那么特立獨(dú)行和標(biāo)新立異,甚至有點(diǎn)另類。書中幾乎巨細(xì)靡遺地涵蓋了C++中大大小小的不完美之處,并以一系列成功案例證明C++的確不完美同時(shí)也提供了迂回之道、解決之道,再加上其用本主義的立場,正如同一把實(shí)用的瑞士軍刀,功能繁雜而面面俱到,實(shí)用之至。同其他C++著作不一樣,本書雖然尊重標(biāo)準(zhǔn),但同時(shí)又超越標(biāo)準(zhǔn),當(dāng)標(biāo)準(zhǔn)不能滿足需求或成為攔路石的時(shí)候,需求才是第一位的,于是有了作者所謂的“不完美主義的實(shí)踐者”以及“不完美工具箱”之說。此外,作者的所謂“苦行僧式編程”哲學(xué)在我看來也是極其實(shí)用的一種編碼方式! 我們以前看到的絕大部分C++書籍可說是統(tǒng)統(tǒng)走的“陽關(guān)大道”,然而Matthew這本書卻偏要走他的“獨(dú)木小橋”,蹊徑雖小,然則別有一番風(fēng)味和景觀。我們意識到原來C++中也存在著如此多大大小小的不完美之處,就像宮崎俊電影中的那些打滿補(bǔ)丁的海盜飛機(jī)一樣。Bjarne本就說過,C++是為“用本”而設(shè)計(jì)的,誠然!而本書最大的趣味就在于它并不去一味抱怨這些缺點(diǎn),而是積極地采取其他替代方案來達(dá)到同樣的目的,并借此展現(xiàn)出C++自由強(qiáng)大的一面! 作者M(jìn)atthew常用“survive”一詞來描述在編碼的現(xiàn)實(shí)世界中的境況,作為STLSoft庫的主要編寫者,他十幾年來積累的經(jīng)驗(yàn)在書中充盈四溢,很多我們平??床坏降姆矫娑紩凰舫鰜?,甚至連我這個(gè)譯者都覺得有點(diǎn)“啰嗦”。不過,對于喜歡他這種“嘮叨”講法的人,他那種辨證的嚴(yán)密論證法倒是能令你獲益頗多。另外,書中隨處可見具有作者個(gè)人特色的幽默,在大量平淡無奇的技術(shù)書籍當(dāng)中可算是一個(gè)亮點(diǎn)。 本書的一個(gè)小缺憾就是它不適合初學(xué)者,某些地方甚至對于中級讀者來說都有一定的難度,作者自己經(jīng)驗(yàn)非常豐富,因此有些地方就不加解釋地一帶而過,為此譯者適當(dāng)添加了一些譯注,以便讀者理解和閱讀?!? 最后,感謝榮耀先生在本書初譯的過程中一直給予的支持和信任,并容忍我總是延期交付各章譯稿。榮耀先生對技術(shù)的精益求精和一絲不茍也令我在翻譯的過程中獲益良多?!? 最大的感激要?dú)w于我的父母和我的爺爺,感謝他們一直以來對我的追求的支持和鼓勵(lì),沒有他們我無法想象能夠完成這項(xiàng)工作。 希望這本令我在翻譯過程中獲益匪淺的書也能夠給你帶來美妙而獨(dú)一無二的閱讀享受,Let’s dig in! ——劉未鵬
編輯推薦
《Imperfect C++中文版》是市面上唯一一本討論C++的不足之處,并給出解決方案的C++經(jīng)典圖書,榮獲Amazon五星級評價(jià)。由知名譯者榮耀與劉未鵬合譯,在技術(shù)開發(fā)者中擁有極大影響力。
名人推薦
千萬不要被書名所誤導(dǎo)!這是一本擁抱(而非詆毀)C++的著作。它有著獨(dú)特的定位:為現(xiàn)實(shí)世界中的程序員提供切合實(shí)際的解決方案,以解決C++語言自身的各種“不完美”。世界上沒有完美的編程語言。在本書中,Matthew Wilson不但為我們指出C++中諸多不完美之處,還提供了經(jīng)過實(shí)踐檢驗(yàn)的應(yīng)對技術(shù)和技巧,便于我們利用“不完美的C++”編寫出近乎完美的代碼——強(qiáng)健、高效、靈活、可移植、優(yōu)雅的代碼,而這些代碼在聲稱為“完美的語言”中往往更難實(shí)現(xiàn)。本書對給出的每一個(gè)“不完美”都進(jìn)行了細(xì)致的探討:為什么說它是一個(gè)“不完美”?對其修復(fù)的指導(dǎo)思想是什么?有時(shí)候只是告誡你避免做些什么,給出一些約束和建議,更多的時(shí)候則為你提供現(xiàn)實(shí)的解決方案,這些方案往往離不開對現(xiàn)代模板編程技術(shù)的使用。書中包含有許多你未曾聽過或用過的技術(shù),有些屬于作者的創(chuàng)新,有些則是對現(xiàn)有技術(shù)的精化,二者均被提升到“范式”的高度。例如:應(yīng)用程序二進(jìn)制接口(ABI)、墊片(Shim)、飾面(Veneer)、螺栓(Bolt-in)、區(qū)間(range)、屬性(property)等。不少主題難度大,此前為其他C++專家所忽略。要探討它們除了需要勇氣外,第一手經(jīng)驗(yàn)更是不可或缺。作為STLSoft庫的主創(chuàng)者,Matthew在舉例時(shí),對Windows API、MFC、ATL、COM以及UNIX等都是信手拈來。除了豐富的實(shí)踐、扎實(shí)的理論以及縝密的邏輯外,Matthew的文筆流暢,語言幽默,說理直接,字里行間流露出過人的自信,使得本書極具閱讀趣味。本書具有一定的閱讀門檻,目標(biāo)讀者為中、高級職業(yè)C++程序員。書中展示的代碼示例、編程技術(shù)往往在幾款甚至十幾款編譯器上進(jìn)行驗(yàn)證,輔以表格對其各色特性加以比較,并針對不同編譯器所表現(xiàn)出的差異性而給出高效、可移植的解決方案——就像很多現(xiàn)實(shí)世界中的C++程序員應(yīng)該做(而沒做到)的那樣。如果你正在尋找一本真材實(shí)料的“C++實(shí)戰(zhàn)”參考書,本書不會讓你失望。本書中文版由我和劉未鵬先生合譯。未鵬思維敏捷,技術(shù)、文筆俱佳,我很高興與他合作。感謝陳冀康編輯給予的理解和支持。感謝朱艷的照料和熱愛。榮珅則常常用他的小拳頭亂砸書房的門,并大聲地叫“爸爸”,這種干擾讓我獲得了必不可少的休息時(shí)間。已有的經(jīng)典名著使得C++新書問世難度加大,后來者若無過人之處就很難引起C++社群的注意,Imperfect C++、C++ Common Knowledge以及C++ Template Metaprogramming等佳作一經(jīng)問世便得到廣泛的關(guān)注。作為譯者(之一),我祝愿它們能夠帶給各位久違的快樂!——榮耀刀有很多種,有單刀,雙刀,樸刀,戒刀,鋸齒刀,砍山刀,鬼頭刀,雁翎刀,五鳳朝陽刀,魚鱗紫金刀?!琵垺讹w刀,又見飛刀》這里我們要說的刀,是瑞士軍刀,瑞士軍刀其實(shí)嚴(yán)格來說并不能算是一種刀,其功能的繁雜和精細(xì)已然超過了刀的范疇。它包含的工具一般有主刀、小刀、剪刀、開瓶器、木鋸、小改錐、拔木塞鉆、牙簽、小鑷子等,而在一些工具上還設(shè)計(jì)了多種功用,如開瓶器上,就具有開瓶、平口改錐、電線剝皮槽3種功用。隨著時(shí)代的發(fā)展,一些新興的電子技術(shù)也被引入瑞士軍刀中,如內(nèi)藏激光筆、電筒等。瑞士軍刀是軍人在野外生存的必備工具,其小體積濃縮眾多實(shí)用功能的精心設(shè)計(jì)能夠?qū)⒁话训兜娜菹薨l(fā)揮到最大,絲毫不遜于《第一滴血》中藍(lán)博帶在身上的那把銳利的寒光閃閃的鋼刀。那么現(xiàn)在你拿在手里的這本書就是一把瑞士軍刀!這是一本非常特別的C++圖書,在市面上已經(jīng)存在的大量經(jīng)典C++書籍當(dāng)中,這本書的著眼點(diǎn)和寫作風(fēng)格使它顯得那么特立獨(dú)行和標(biāo)新立異,甚至有點(diǎn)另類。書中幾乎巨細(xì)靡遺地涵蓋了C++中大大小小的不完美之處,并以一系列成功案例證明C++的確不完美同時(shí)也提供了迂回之道、解決之道,再加上其用本主義的立場,正如同一把實(shí)用的瑞士軍刀,功能繁雜而面面俱到,實(shí)用之至。同其他C++著作不一樣,本書雖然尊重標(biāo)準(zhǔn),但同時(shí)又超越標(biāo)準(zhǔn),當(dāng)標(biāo)準(zhǔn)不能滿足需求或成為攔路石的時(shí)候,需求才是第一位的,于是有了作者所謂的“不完美主義的實(shí)踐者”以及“不完美工具箱”之說。此外,作者的所謂“苦行僧式編程”哲學(xué)在我看來也是極其實(shí)用的一種編碼方式!我們以前看到的絕大部分C++書籍可說是統(tǒng)統(tǒng)走的“陽關(guān)大道”,然而Matthew這本書卻偏要走他的“獨(dú)木小橋”,蹊徑雖小,然則別有一番風(fēng)味和景觀。我們意識到原來C++中也存在著如此多大大小小的不完美之處,就像宮崎俊電影中的那些打滿補(bǔ)丁的海盜飛機(jī)一樣。Bjarne本就說過,C++是為“用本”而設(shè)計(jì)的,誠然!而本書最大的趣味就在于它并不去一味抱怨這些缺點(diǎn),而是積極地采取其他替代方案來達(dá)到同樣的目的,并借此展現(xiàn)出C++自由強(qiáng)大的一面!作者M(jìn)atthew常用“survive”一詞來描述在編碼的現(xiàn)實(shí)世界中的境況,作為STLSoft庫的主要編寫者,他十幾年來積累的經(jīng)驗(yàn)在書中充盈四溢,很多我們平常看不到的方面都會被他挑出來,甚至連我這個(gè)譯者都覺得有點(diǎn)“啰嗦”。不過,對于喜歡他這種“嘮叨”講法的人,他那種辨證的嚴(yán)密論證法倒是能令你獲益頗多。另外,書中隨處可見具有作者個(gè)人特色的幽默,在大量平淡無奇的技術(shù)書籍當(dāng)中可算是一個(gè)亮點(diǎn)。本書的一個(gè)小缺憾就是它不適合初學(xué)者,某些地方甚至對于中級讀者來說都有一定的難度,作者自己經(jīng)驗(yàn)非常豐富,因此有些地方就不加解釋地一帶而過,為此譯者適當(dāng)添加了一些譯注,以便讀者理解和閱讀。最后,感謝榮耀先生在本書初譯的過程中一直給予的支持和信任,并容忍我總是延期交付各章譯稿。榮耀先生對技術(shù)的精益求精和一絲不茍也令我在翻譯的過程中獲益良多。最大的感激要?dú)w于我的父母和我的爺爺,感謝他們一直以來對我的追求的支持和鼓勵(lì),沒有他們我無法想象能夠完成這項(xiàng)工作。希望這本令我在翻譯過程中獲益匪淺的書也能夠給你帶來美妙而獨(dú)一無二的閱讀享受,Let’s dig in!——?jiǎng)⑽殆i
圖書封面
圖書標(biāo)簽Tags
無
評論、評分、閱讀與下載