出版時(shí)間:2012-7 出版社:人民郵電出版社 作者:Martin D.Carroll,Margaret A.Ellis 頁(yè)數(shù):267 字?jǐn)?shù):371000 譯者:陳偉柱
Tag標(biāo)簽:無(wú)
前言
一切事物都將得到檢驗(yàn)并因此被稱(chēng)為問(wèn)題。 Edith Hamilton 這本書(shū)的主要目的在于:展示如何以C++編程語(yǔ)言編寫(xiě)可重用代碼—就是說(shuō),根據(jù)不同的需要,在不經(jīng)過(guò)修改,或者經(jīng)過(guò)很少修改的前提下,可重用代碼可以很容易地應(yīng)用到5個(gè)、50個(gè)甚至500個(gè)程序當(dāng)中,而且這些程序往往是不同程序員編寫(xiě)的,可能運(yùn)行在不同的系統(tǒng)上。在整個(gè)闡述的過(guò)程中,我們的目的并不在于爭(zhēng)論是否所有的代碼都是可重用的,也不在于說(shuō)明可重用代碼能夠解決所有的程序問(wèn)題。顯然,不論是對(duì)程序員而言,還是對(duì)可重用代碼本身而言,提高代碼的重用性都是需要代價(jià)的;通常只有當(dāng)我們有理由相信所給代碼在將來(lái)有可能會(huì)被重用時(shí),我們才會(huì)付出這些重用的代價(jià)。因此,本書(shū)的目的在于詳細(xì)分析重用性的這些代價(jià),于是當(dāng)你面對(duì)是否編寫(xiě)可重用代碼的選擇時(shí),可以從容地做出明智的決定。 關(guān)于本書(shū) 本書(shū)主要面向的讀者是:那些希望從書(shū)中包含的許多深層C++編程見(jiàn)解中受益的讀者,或者是那些需要或希望學(xué)習(xí)如何編寫(xiě)可重用代碼的讀者。在論述過(guò)程中,我們假設(shè)讀者已經(jīng)知道如何編寫(xiě)正確的C++代碼。 C++語(yǔ)言至今還沒(méi)有經(jīng)過(guò)標(biāo)準(zhǔn)化(譯注:本書(shū)寫(xiě)作于1995年,C++于1997年標(biāo)準(zhǔn)化),任意兩個(gè)不同的編譯器實(shí)現(xiàn)支持的語(yǔ)言幾乎都是不同(稍微不同或者相差很大)的。當(dāng)我編寫(xiě)這本書(shū)的時(shí)候,并沒(méi)有一個(gè)編譯器實(shí)現(xiàn)可以完全支持ANSI/ISO C++標(biāo)準(zhǔn)中最終定義的整個(gè)語(yǔ)言特性;而且,就算對(duì)同類(lèi)型的編譯器而言,前后版本實(shí)現(xiàn)的語(yǔ)言特性也不盡相同。于是,編寫(xiě)一本對(duì)所有編譯器都適用的書(shū)是很困難的,或者是不可能的。因此,當(dāng)我們討論或使用一些不能被主流C++編譯器所實(shí)現(xiàn)的特性時(shí),我們將會(huì)另加說(shuō)明?!? 當(dāng)聲明本書(shū)中的代碼例子被認(rèn)為合法時(shí),我們所指的合法性是以1994年9月份ANSI/ISO C++的工作文件(有時(shí)候也稱(chēng)為“標(biāo)準(zhǔn)草案”)[ANS94]為依據(jù)的。而且,在我們的代碼例子里,我們將盡量避免使用那些我們認(rèn)為在最終ANSI/ISO C++標(biāo)準(zhǔn)公布之前,很有可能會(huì)被刪除或者進(jìn)行重大修改的語(yǔ)言特性?!? 要跟蹤C(jī)++語(yǔ)言的演化,有幾個(gè)資源是可以利用的。Internet討論組comp.lang.c和comp. std.c++主要致力于C++的討論?;ヂ?lián)網(wǎng)中還有一個(gè)關(guān)于C++的主頁(yè)?!《杉~約SIGS出版社定期發(fā)行的C++ Report,也經(jīng)常會(huì)刊登許多C++程序員感興趣的文章。至于學(xué)習(xí)C++的書(shū)籍,Lippman的[Lip91]和Stroustrup的[Str91]是最佳的學(xué)習(xí)教材?!? 任何關(guān)于重用性的完整討論都會(huì)涉及軟件開(kāi)發(fā)的一些其他主題,如接口的設(shè)計(jì)、實(shí)現(xiàn)的效率、可移植性、沖突等。在書(shū)中的論述中,我們假設(shè)讀者對(duì)軟件開(kāi)發(fā)已經(jīng)有所了解;因此,我們只注重于那些應(yīng)用于可重用代碼的主題,而不是那些應(yīng)用于一般軟件開(kāi)發(fā)的主題?!? “每本教材都會(huì)撒謊”,這是我們老師非常喜歡的一句諺語(yǔ)。在這里,她實(shí)際要表達(dá)的意思是:每本教材為了教學(xué)的簡(jiǎn)化性和明確性,都必須簡(jiǎn)化書(shū)中的內(nèi)容,從而都會(huì)歪曲所要表達(dá)的信息。顯然,即使在需要簡(jiǎn)化的前提下,我們還是應(yīng)該用抓住眾多細(xì)節(jié)間的本質(zhì)信息的方法來(lái)表述每個(gè)主題,這本書(shū)也不例外。于是,對(duì)于某些主題,即使有些讀者已經(jīng)對(duì)這個(gè)主題的方方面面都有所了解,我們還是希望他們能夠和我們一起共同探討該主題的內(nèi)容。而且,對(duì)于一些主題內(nèi)容的省略,我們也希望能夠得到這些讀者的諒解。 選擇與建議 設(shè)計(jì)和編寫(xiě)可重用代碼將會(huì)涉及許多選擇(即在多種實(shí)現(xiàn)方案中選定某種方案),而某些選擇的決定又是左右為難的。通常,對(duì)于這些選擇,并沒(méi)有完全確定或者正確的答案—無(wú)論你做出哪個(gè)選擇,每個(gè)選擇都是有代價(jià)的。我們將討論各種不同選擇方案的優(yōu)點(diǎn)和缺點(diǎn),從而讓將來(lái)可重用代碼的編寫(xiě)者可以從容地做出明智的決定?!? 有時(shí),對(duì)于某個(gè)給定的決定,我們會(huì)認(rèn)為某種風(fēng)格或者方法要優(yōu)于其他所有的風(fēng)格或者方法。于是,當(dāng)遇到這種情況時(shí),我們會(huì)明確地建議采用這種風(fēng)格或者方法,并給出支持這種風(fēng)格或者方法的詳細(xì)理由。然而,在大多數(shù)情況下,只有C++程序庫(kù)的設(shè)計(jì)者,才能決定哪種方法對(duì)程序庫(kù)用戶而言是最好的?!? 這本書(shū)的一個(gè)目的在于:詳細(xì)并且清楚地給出編寫(xiě)可重用代碼的大多數(shù)重要選擇。如果我們忽略了某些重要的選擇,那么我們?cè)嘎勂湓?。? 書(shū)中大多數(shù)關(guān)于選擇的討論都會(huì)提到效率。雖然我們并不認(rèn)為效率是所有可重用C++代碼最重要的設(shè)計(jì)目標(biāo),因?yàn)閷?duì)于許多程序庫(kù)設(shè)計(jì)而言,譬如擴(kuò)展性、靈活性等其他特性將會(huì)比效率更加重要;但我們?cè)谖恼轮杏痔幪幪岬叫?,這是因?yàn)樾蕦?huì)和可重用C++代碼的其他每個(gè)可取的特性都相互制約。既然對(duì)效率已經(jīng)花費(fèi)了這么多筆墨,我們也希望可以給出所有和效率相互制約的因素。 代碼例子 我們希望這本書(shū)的價(jià)值在于:與剛開(kāi)始讀這本書(shū)之前相比,當(dāng)你讀完這本書(shū)的時(shí)候,你將知道更多關(guān)于如何編寫(xiě)可重用代碼的知識(shí)。因此,我們使用了大量的例子,而且許多例子的代碼是來(lái)自于現(xiàn)實(shí)中已經(jīng)存在的代碼,因?yàn)?,那些不是取材于真?shí)代碼的例子,不足以闡明實(shí)際編程中會(huì)出現(xiàn)的問(wèn)題,也不足以說(shuō)明實(shí)際編程中使用的各種技術(shù)。在這里,我們只是為了闡明重用性的目的而利用這些代碼?!? 為了節(jié)省篇幅,成員函數(shù)的主體通常都是在類(lèi)的聲明中給出;即使在重用性的代碼設(shè)計(jì)中,這些函數(shù)也不會(huì)被實(shí)現(xiàn)為內(nèi)聯(lián)函數(shù)。例如,讀者不應(yīng)該從下面的類(lèi)定義語(yǔ)句中得出:函數(shù)f是內(nèi)聯(lián)函數(shù)(就是說(shuō)實(shí)際上f不是內(nèi)聯(lián)函數(shù))的結(jié)論?!? class Z { void f() { //... } }; (關(guān)于如何決定某個(gè)函數(shù)是否應(yīng)該實(shí)現(xiàn)為內(nèi)聯(lián)函數(shù),我們將在4.4.1節(jié)討論這個(gè)問(wèn)題) 當(dāng)提到模板成員函數(shù)的時(shí)候,在不致引起混淆的前提下,我們通常都會(huì)省略模板參數(shù)。例如,我們將把下面代碼中的成員函數(shù)f: template class X { void f(); }; 表示為X::f,而不是X::f?!? 通常,現(xiàn)實(shí)程序庫(kù)例子中給出的類(lèi)大多是模板,而在書(shū)中,為了能夠使閱讀更加容易,并且有利于更加清楚地表述每個(gè)主題,我們就進(jìn)行了簡(jiǎn)化。相似地,現(xiàn)實(shí)程序庫(kù)中的嵌套類(lèi)也并不都如嵌套語(yǔ)法所定義的那樣,但是,當(dāng)我們?cè)跁?shū)中給出一個(gè)嵌套類(lèi)的時(shí)候,我們將不使用前置聲明語(yǔ)法。例如,我們將如下編寫(xiě)嵌套類(lèi): class X { class Y { //... }; //... }; 而不是如下編寫(xiě)嵌套類(lèi): class X { class Y; //... }; class X::Y { //... }; 雖然前置聲明語(yǔ)法能夠提高可重用代碼的可讀性,但是許多C++編譯器都不能實(shí)現(xiàn)這種語(yǔ)法。 現(xiàn)今,任何我們可用的編譯器,都還沒(méi)有實(shí)現(xiàn)新的強(qiáng)制轉(zhuǎn)型(cast)語(yǔ)法。這個(gè)語(yǔ)法是一個(gè)很新的C++特性(針對(duì)于編寫(xiě)這本書(shū)的時(shí)候),我們也還不具備應(yīng)用這個(gè)語(yǔ)法的充分經(jīng)驗(yàn),因此,我們?cè)跁?shū)中沒(méi)有使用這個(gè)語(yǔ)法?!? 術(shù)語(yǔ) 在本文中,我們將使用程序庫(kù)概念來(lái)表示可重用代碼的集合。我們也經(jīng)常互換地使用程序庫(kù)和可重用代碼這兩個(gè)概念。另外,當(dāng)我們說(shuō)“編寫(xiě)”代碼段的時(shí)候,我們的意思是“設(shè)計(jì)和實(shí)現(xiàn)”這段代碼。 我們將使用編譯程序來(lái)指代任何程序或者任何把源代碼翻譯成可執(zhí)行代碼的程序集合。翻譯將包括:預(yù)處理C++使之成為另一種語(yǔ)言,然后把這種語(yǔ)言編譯或者匯編成可執(zhí)行代碼?!? 為了行文簡(jiǎn)潔,我們?cè)谖恼轮惺褂玫幕?lèi),不僅用來(lái)表述其他類(lèi)的基類(lèi),而且還表述這個(gè)類(lèi)可讓其他類(lèi)派生自該類(lèi)?!? C++操作符 ostream& operator(istream& i,T& t); (對(duì)于某個(gè)給定的類(lèi)型T)提供了T類(lèi)型的流插入和流輸出操作符。為了和通常的使用習(xí)慣保持一致,我們把它們分別叫做T的輸入操作符和輸出操作符?!? 關(guān)于模板和模板實(shí)例化的術(shù)語(yǔ),C++社區(qū)仍然有許多不一致的意見(jiàn)。不同的人可能會(huì)使用術(shù)語(yǔ)模板類(lèi)、類(lèi)模板、實(shí)例化、實(shí)例、特化等中的一個(gè),來(lái)描述不同(或者相似)的事物。這些術(shù)語(yǔ)準(zhǔn)確而且標(biāo)準(zhǔn)的定義最后將由ANSI/ISO C++委員會(huì)來(lái)決定。下面說(shuō)明了我們?cè)诖藭?shū)中如何使用這些概念: 類(lèi)模板:形如templateX的模板,其中X為類(lèi)的定義?!? 函數(shù)模板:形如templatef的模板,其中f為函數(shù)的定義?!? 類(lèi)模板特化:當(dāng)類(lèi)模板的參數(shù)被實(shí)際參數(shù)替代時(shí),而得到的類(lèi)。 函數(shù)模板特化:當(dāng)函數(shù)模板的參數(shù)被實(shí)際參數(shù)替代時(shí),而得到的函數(shù)。 實(shí)例化:產(chǎn)生特化的過(guò)程。 模板類(lèi):我們不使用這個(gè)術(shù)語(yǔ)。 模板函數(shù):我們不使用這個(gè)術(shù)語(yǔ)。 例如,考慮下面的類(lèi)模板: template class X { //... }; 類(lèi)X和類(lèi)X就是這個(gè)模板的兩個(gè)特化。另外,特化通常是隱式定義的,如: template class X { /*...*/}; X x; //X就是隱式定義的。 偶爾,某些C++程序員也會(huì)顯式定義特化,例如: templateclass X { /*...*/ }; class X {/*...*/}; //X在這里顯式定義?!? x x; 而許多人把特化這個(gè)術(shù)語(yǔ)僅僅看成是顯式特化,這是不正確的。雖然我們定義的這些術(shù)語(yǔ)都是非常相似的,但我們相信,ANSI/ISO很快將會(huì)給出這些術(shù)語(yǔ)很好的定義?!? 通常,在不會(huì)引起混淆的前提下,我們會(huì)使用“類(lèi)”來(lái)代替“類(lèi)模板”,“函數(shù)”來(lái)代替“函數(shù)模板”。 致謝 在這本書(shū)的創(chuàng)作過(guò)程中,許多人通過(guò)多種方式支持過(guò)我們。我們?cè)谶@里對(duì)他們表示衷心的感謝。 這本書(shū)的評(píng)審者所做出的貢獻(xiàn)和該書(shū)的價(jià)值幾乎是等同的。我們特別感謝那些對(duì)我們要求嚴(yán)格的評(píng)論者,他們總是相信我們可以做得更好。這其中包括Tom Allocco、Manuel Bermudez、James Coggins、Keith Gorlen、Tony Hansen、Chris Hornick、Peter Juhl、Brian Kernighan、Andrew Koenig、Eason Kung、Rao Kuimala、Doug Lea、Stan lippman、Tom Lyon、Glen McCluskey、Barbara Moo、Rob Murray、Jishnu Mukerji、Scott Myers、Steve Pendergrast、Ed Schiebel、Jonathan Schilling、Jonathan Shopiro、Bjarne Stroustrup、Steve Vinoski、Jedy Ward和Clay Wilson?!? 我們也收到了許多讀者很有用的反饋信息,他們是Dag Bruck,Rich Kempinski,Josee Lajoie,Deborah McGuinness,David C.Oliver,Jeffrey Persch,Ellia Weixelbaum和兩個(gè)分別叫做Lars和Steve的網(wǎng)友?!? 這本書(shū)的許多觀點(diǎn)首次來(lái)自于我們?cè)O(shè)計(jì)C++標(biāo)準(zhǔn)組件庫(kù)的實(shí)踐,這個(gè)組件庫(kù)最初是由貝爾實(shí)驗(yàn)室開(kāi)發(fā)的。因此,我們要感謝我們的同事們關(guān)于這個(gè)項(xiàng)目的許多有深度的討論。他們是John Tsner, Andrew Koenig, Dennis Mancl, Rob Murray, Jonathan Shopiro,Alex Stepanov, Terry Weitzen和Nancy Wilkinson?!? 如果沒(méi)有C++,那么這本書(shū)(也包括其他的許多書(shū))肯定是不會(huì)存在的。因此我們非常感謝Bjarne Stroustrup給我們帶來(lái)了這樣一個(gè)我們最喜歡的編程語(yǔ)言。另外也感謝ANSI/ISO C++標(biāo)準(zhǔn)委員會(huì)的所有成員,正是因?yàn)樗麄冏巫尾痪氲墓ぷ鳎ㄍ际亲栽付覠o(wú)功利的),才能使整個(gè)C++社區(qū)生機(jī)煥發(fā)?!? 感謝在我們這本書(shū)的編寫(xiě)過(guò)程中,我們這本書(shū)的審訂者—Marha Currie,Barbara Moo和John Spicer—感謝他們的支持和鼓勵(lì)。也感謝我們的雇主—貝爾實(shí)驗(yàn)室和UNIX系統(tǒng)實(shí)驗(yàn)室(現(xiàn)在是Novell UNIX系統(tǒng)小組)—感謝他們給了我們編寫(xiě)這本書(shū)的機(jī)會(huì),而且還感謝他們?yōu)槲覀兲峁┑臅r(shí)間、硬盤(pán)空間、打印紙等?!? 我們非常感謝來(lái)自Addison-Wesley的大力支持。其中,充滿活力的Tom Stone和生性樂(lè)觀的Debbie Lafferty都是很好的合作伙伴。另外,Lyn Dupre給了我們最好的編輯指導(dǎo),書(shū)的設(shè)計(jì)者Juliet Silveri的工作總是一絲不茍,Pat Daly是一個(gè)很專(zhuān)業(yè)的編輯,Roberta Clark對(duì)我們的草稿進(jìn)行了校對(duì)。我們還要感謝John Wait,正是因?yàn)樗回瀳?jiān)持讓Martin編寫(xiě)一本關(guān)于C++和重用的書(shū),才會(huì)有這本書(shū)的誕生。然后,也很感謝Jim DeWolf,他為我們提供了暖氣和空調(diào),這筆支付也是不菲的,從而給我們帶來(lái)了一個(gè)很好的環(huán)境和開(kāi)端?!? 衷心感謝Tom Reinhardt,他可以說(shuō)是世界上最好的外科臨床醫(yī)學(xué)家。也感謝我們的朋友Paul Lustgarten,他是我們以前的房東,很慷慨地允許我們時(shí)時(shí)占用他的電話線。還感謝David Wooley,正是他讓Martin在大學(xué)中進(jìn)入到BASIC編程領(lǐng)域中來(lái)的。真誠(chéng)地感謝Marybeth為我們拍了書(shū)背面的那張照片。 最后,但也是很重要的,我們真誠(chéng)感謝我們的家人和朋友,他們和我們度過(guò)了這本書(shū)編寫(xiě)過(guò)程中的許多酸甜苦辣的日子,并且時(shí)時(shí)刻刻給予我們支持與關(guān)懷?!?
內(nèi)容概要
《C++代碼設(shè)計(jì)與重用》全面展示如何使用C++編寫(xiě)可重用的代碼,從而提高程序員的開(kāi)發(fā)效率。全書(shū)分為12章。包括重用性基本概念、類(lèi)設(shè)計(jì)、擴(kuò)展性、效率、錯(cuò)誤、沖突、兼容性、繼承、移植性、程序庫(kù)等和重用相關(guān)的諸多話題。每一章的最后,通過(guò)總結(jié)和練習(xí)幫助你鞏固概念、加深理解,參考文獻(xiàn)和相關(guān)資料為你指明了深入學(xué)習(xí)的方向。
《C++代碼設(shè)計(jì)與重用》適合有一定C++經(jīng)驗(yàn)的程序員閱讀,也可供以提高代碼重用性為專(zhuān)門(mén)學(xué)習(xí)方向的讀者參考。
作者簡(jiǎn)介
Martin Carroll是AT&T貝爾實(shí)驗(yàn)室的技術(shù)人員,他曾經(jīng)用好幾年的時(shí)間致力于設(shè)計(jì)和實(shí)現(xiàn)可重用的C++程序庫(kù),包括AT&T標(biāo)準(zhǔn)組件庫(kù)(Standard Components Library)。他在Rutgers大學(xué)獲得計(jì)算機(jī)科學(xué)博士學(xué)位。
Margaret Ellis 是The Annotated C++ Reference Manual的合著者(另一個(gè)作者是大名鼎鼎的C++之父Bjarne Stroustrup),她主要致力于AT&T貝爾實(shí)驗(yàn)室、UNIX系統(tǒng)實(shí)驗(yàn)室和美國(guó)Novell公司的編譯器開(kāi)發(fā)。她曾獲得加州大學(xué)計(jì)算機(jī)專(zhuān)業(yè)的碩士學(xué)位。
書(shū)籍目錄
第1章 重用性介紹 1
1.1 什么是重用性 1
1.1.1 提取代碼來(lái)作為重用 2
1.1.2 可重用代碼的基本特性 2
1.2 重用的神話 3
1.3 重用的障礙 4
1.3.1 非技術(shù)障礙 4
1.3.2 技術(shù)障礙 5
1.4 希望是否尚存 6
1.5 這本書(shū)能給我們帶來(lái)什么 7
l.6 練習(xí) 8
1.7 參考文獻(xiàn)和相關(guān)資料 9
第2章 類(lèi)的設(shè)計(jì) 11
2.1 抽象性 11
2.2 正規(guī)函數(shù) 12
2.3 Nice類(lèi) 14
2.4 存在最小標(biāo)準(zhǔn)接口嗎 15
2.4.1 缺省構(gòu)造函數(shù) 16
2.4.2 賦值運(yùn)算符 17
2.4.3 拷貝構(gòu)造函數(shù) 18
2.4.4 相等運(yùn)算符 18
2.4.5 析構(gòu)函數(shù) 18
2.5 淺拷貝和深拷貝 19
2.6 接口一致性 22
2.7 轉(zhuǎn)型 25
2.7.1 多重所有權(quán)(Multiple Ownership) 26
2.7.2 敏感轉(zhuǎn)型 26
2.7.3 不敏感轉(zhuǎn)型 28
2.7.4 轉(zhuǎn)型數(shù)目(Fanout) 28
2.8 const關(guān)鍵字的使用 29
2.8.1 抽象const對(duì)比位元const 29
2.8.2 最大限度地使用const 31
2.8.3 對(duì)const不安全的解釋 32
2.9 總結(jié) 33
2.10 練習(xí) 34
2.11 參考文獻(xiàn)和相關(guān)資料 37
第3章 擴(kuò)展性 39
3.1 擴(kuò)展性的權(quán)衡 39
3.2 擴(kuò)展性和繼承 40
3.2.1 只繼承基類(lèi)的接口 41
3.2.2 只繼承基類(lèi)的實(shí)現(xiàn) 42
3.2.3 同時(shí)繼承基類(lèi)的接口和實(shí)現(xiàn) 43
3.3 繼承語(yǔ)義(Semantie) 43
3.4 繼承的障礙 45
3.4.1 非虛成員函數(shù) 45
3.4.2 過(guò)度保護(hù) 47
3.4.3 模塊化不足 48
3.4.4 friend關(guān)鍵字的使用 51
3.4.5 成員變量過(guò)多 52
3.4.6 非虛(Nonvirtual)派生 52
3.4.7 妨礙繼承的成員函數(shù) 53
3.5 派生賦值問(wèn)題 55
3.6 允許入侵(用戶修改源代碼)繼承 57
3.7 總結(jié) 58
3.8 練習(xí) 58
3.9 參考文獻(xiàn)和相關(guān)資料 60
第4章 效率 61
4.1 效率和重用性 61
4.2 程序創(chuàng)建時(shí)間 62
4.2.1 編譯時(shí)間 62
4.2.2 實(shí)例化時(shí)間 64
4.3 代碼大小 69
4.3.1 源文件分割 69
4.3.2 外聯(lián)的(outlined)inline 71
4.3.3 模板特化大小 71
4.4 運(yùn)行時(shí)間 72
4.4.1 內(nèi)聯(lián)(inlning) 72
4.4.2 虛函數(shù) 74
4.4.3 返回引用 76
4.5 空閑存儲(chǔ)空間(free-store)和堆??臻g(stack space) 78
4.5.1 使用高效的算法 79
4.5.2 盡可能快地釋放空閑資源 80
4.5.3 靜態(tài)對(duì)象 81
4.5.4 龐大的對(duì)象 82
4.6 效率的權(quán)衡 83
4.6.1 實(shí)現(xiàn)更加困難 84
4.6.2 使用更加困難 86
4.7 總結(jié) 86
4.8 練習(xí) 87
4.9 參考文獻(xiàn)和相關(guān)資料 89
第5章 錯(cuò)誤 91
5.1 可重用代碼中的錯(cuò)誤 91
5.2 錯(cuò)誤檢測(cè) 92
5.2.1 函數(shù)前提條件 93
5.2.2 表示不變性 93
5.3 處理錯(cuò)誤 95
5.3.1 程序庫(kù)變量 95
5.3.2 解決問(wèn)題 95
5.3.3 程序退出或者程序終止(Exit or Abort) 96
5.3.4 拋出異常 96
5.3.5 返回錯(cuò)誤值 97
5.3.6 創(chuàng)建Nil值 98
5.3.7 把無(wú)效的數(shù)據(jù)解釋為有效的數(shù)據(jù) 99
5.3.8 允許不確定的行為 99
5.4 資源限制(Resource-Limit)錯(cuò)誤 100
5.4.1 堆棧溢出 100
5.4.2 用完空閑存儲(chǔ)空間 101
5.4.3 文件系統(tǒng)限制 102
5.5 異常安全性 103
5.5.1 不一致的狀態(tài) 104
5.5.2 資源泄漏 105
5.6 總結(jié) 106
5.7 練習(xí) 107
5.8 參考文獻(xiàn)和相關(guān)資料 110
第6章 沖突 111
6.1 全局名稱(chēng) 111
6.1.1 翻譯單元 112
6.1.2 類(lèi)的定義 112
6.1.3 函數(shù)和數(shù)據(jù)的定義 114
6.1.4 程序庫(kù)的蘊(yùn)涵意義 114
6.1.5 命名約定 115
6.1.6 namespace(名字空間)結(jié)構(gòu) 117
6.2 宏名稱(chēng) 118
6.2.1 宏名稱(chēng)沖突 118
6.2.2 去掉宏 119
6.2.3 宏的命名約定 121
6.3 環(huán)境名稱(chēng) 121
6.4 Unclean程序庫(kù) 122
6.5 Good-Citizen程序庫(kù) 123
6.6 總結(jié) 123
6.7 練習(xí) 124
6.8 參考文獻(xiàn)和相關(guān)資料 125
第7章 兼容性 127
7.1 向后和向前兼容性 127
7.2 兼容性的形式 128
7.3 理論源代碼兼容性 129
7.4 實(shí)際源代碼兼容性 130
7.5 鏈接兼容牲 131
7.6 運(yùn)行兼容牲 133
7.7 進(jìn)程兼容性 134
7.8 文檔化不兼容性 135
7.9 非文檔化特性 135
7.10 總結(jié) 136
7.11 練習(xí) 137
7.12 參考文獻(xiàn)和相關(guān)資料 142
第8章 繼承體系 143
8.1 根數(shù)目、深度和扇出數(shù) 143
8.2 體系類(lèi)型 146
8.2.1 直接體系 146
8.2.2 接口體系 147
8.2.3 對(duì)象工廠(Object Factory) 149
8.2.4 句柄體系 151
8.3 模板還是繼承 154
8.3.1 指針操縱 155
8.3.2 派生要求 156
8.3.3 實(shí)現(xiàn)不需要的函數(shù) 157
8.4 總結(jié) 158
8.5 練習(xí) 159
8.6 參考文獻(xiàn)和相關(guān)資料 161
第9章 移植性 163
9.1 有編寫(xiě)可移植代碼的必要嗎 163
9.1.1 可移植性的優(yōu)缺點(diǎn) 163
9.1.2 目標(biāo)代碼和創(chuàng)建過(guò)程的可移植性 164
9.2 不斷發(fā)展的語(yǔ)言定義 165
9.2.1 沖突 165
9.2.2 實(shí)現(xiàn)的完整性 166
9.3 不確定的行為 166
9.3.1 排列方式和補(bǔ)全(padding) 167
9.3.2 地址操縱 168
9.4 合法但不可移植的代碼 169
9.4.1 實(shí)現(xiàn)性定義的行為 169
9.4.2 未經(jīng)指定的行為 170
9.5 實(shí)現(xiàn)依賴性 171
9.6 可移植的數(shù)據(jù)文件 172
9.7 模板實(shí)例化 173
9.7.1 自動(dòng)的實(shí)例化器 173
9.7.2 人工實(shí)例化 177
9.8 運(yùn)行期程序庫(kù) 179
9.9 其他移植性問(wèn)題 180
9.10 總結(jié) 181
9.11 練習(xí) 182
9.12 參考文獻(xiàn)和相關(guān)資料 184
第10章 使用其他程序庫(kù) 185
10.1 為何要重用其他程序庫(kù) 185
10.2 使用其他程序庫(kù)的缺點(diǎn) 186
10.2.1 獲得可重用程序庫(kù) 186
10.2.2 效率 187
10.2.3 沖突 187
10.2.4 版本同步 188
10.3 自含式(Self-Contained)程序庫(kù) 190
10.3.1 實(shí)現(xiàn)困難 190
10.3.2 使用困難 191
10.3.3 效率 192
10.3.4 隔離 192
10.4 總結(jié) 193
10.5 練習(xí) 193
第11章 文檔編制 195
11.1 文檔編制和重用性 195
11.2 設(shè)計(jì)文檔 196
11.3 使用指南 196
11.3.1 對(duì)讀者的背景知識(shí)了如指掌 197
11.3.2 用抽象的觀點(diǎn)來(lái)編寫(xiě) 197
11.3.3 先解釋普通用法 198
11.3.4 一次只解釋一個(gè)事物 198
11.3.5 解釋用法,不解釋設(shè)計(jì)思路 199
11.3.6 簡(jiǎn)單清楚地編寫(xiě) 199
11.3.7 準(zhǔn)確地使用語(yǔ)言 199
11.3.8 使用普遍接受的術(shù)語(yǔ) 200
11.3.9 深刻理解重載的術(shù)語(yǔ) 200
11.3.10 給出合法的、無(wú)錯(cuò)誤的代碼 201
11.3.11 保持簡(jiǎn)短的代碼段 201
11.3.12 避免使用太大的函數(shù) 201
11.3.13 提供在線實(shí)例 202
11.4 參考手冊(cè) 203
11.4.1 抽象化 203
11.4.2 語(yǔ)法接口 203
11.4.3 函數(shù)語(yǔ)義 205
11.4.4 模板參數(shù)約束 206
11.5 總結(jié) 207
11.6 練習(xí) 207
11.7 參考文獻(xiàn)和相關(guān)資料 208
第12章 其他話題 209
12.1 靜態(tài)初始化問(wèn)題 209
12.1.1 構(gòu)造和析構(gòu)的時(shí)刻 210
12.1.2 程序庫(kù)的蘊(yùn)含意義 211
12.1.3 初始化函數(shù) 213
12.1.4 初始化檢查 214
12.1.5 初始化對(duì)象 216
12.1.6 雙構(gòu)造 217
12.2 局部化開(kāi)銷(xiāo)原則 218
12.2.1 局部化開(kāi)銷(xiāo)和C++ 219
12.2.2 局部化開(kāi)銷(xiāo)和程序庫(kù) 219
12.3 內(nèi)生類(lèi)和外生類(lèi) 220
12.4 迭代器 222
12.5 類(lèi)耦合 224
12.6 推遲決定 226
12.7 總結(jié) 229
12.8 練習(xí) 229
12.9 參考文獻(xiàn)和相關(guān)資料 232
中英文術(shù)語(yǔ)對(duì)照表 233
參考文獻(xiàn) 261
媒體關(guān)注與評(píng)論
最早知道這本書(shū),是在Scott Meyers著名的More Effective C++ 書(shū)籍推薦列表里。在談到這本書(shū)的時(shí)候,Meyers說(shuō):“有意撰寫(xiě)程序庫(kù)的人,若沒(méi)有讀過(guò)此書(shū),那只能是匹夫之勇。”而Francis Glassborow則說(shuō),大多數(shù)程序庫(kù)設(shè)計(jì)者應(yīng)該搬過(guò)小板凳來(lái),像小學(xué)生那樣學(xué)習(xí)這本書(shū)?!? 用C++的人,歷來(lái)以能撰寫(xiě)出重用性好的程序庫(kù)而引以為傲。然而,撰寫(xiě)可用的程序庫(kù)已屬不易,撰寫(xiě)可重用的程序庫(kù)更是專(zhuān)家級(jí)任務(wù),以至于有人感嘆道,重用是C++程序員們的“圣杯”—總在嚷嚷著,卻始終得不到。其實(shí)何止C++如此,在其他語(yǔ)言中,重用又何嘗不是令人膽怯的挑戰(zhàn)!只不過(guò)C++編譯語(yǔ)言的本質(zhì)與人們對(duì)C++程序性能的嚴(yán)苛要求,使得用C++編寫(xiě)可重用組件更為困難。這樣一個(gè)艱難的主題,敢于涉足已經(jīng)是非常有勇氣了,而能得到Meyers等人如此高的評(píng)價(jià),則非C++中的頂尖人物傾力而為不可。事實(shí)上,作者M(jìn)artin Carroll和Margaret Ellis正是這樣的頂尖人物。他們是AT&T實(shí)驗(yàn)室的研究人員,從20世紀(jì)80年代中期開(kāi)始就處于C++演化和發(fā)展的中心,長(zhǎng)期從事編譯器和基礎(chǔ)庫(kù)的開(kāi)發(fā)工作,積累了普通程序員無(wú)法比擬的經(jīng)驗(yàn)。特別值得一提的是,Margaret Ellis曾與Bjarne Stroustrup合作撰寫(xiě)了C++早期的經(jīng)典著作ARM(The Annotated C++ Reference Manual),是C++社群里最受尊敬的巾幗英雄之一。在這本書(shū)中,兩位作者把自己多年來(lái)撰寫(xiě)可重用庫(kù)的經(jīng)驗(yàn)和教訓(xùn)高濃度地總結(jié)起來(lái),給出了很多具有深刻洞察力的建議。雖然從此書(shū)英文版出版至今已有幾年的時(shí)間,但是書(shū)中的真知灼見(jiàn)仍然值得我們一再學(xué)習(xí)體會(huì)。我甚至認(rèn)為,即使你不打算撰寫(xiě)程序庫(kù),甚至不是C++程序員,認(rèn)真閱讀這本書(shū)都是很有好處的。畢竟這本書(shū)來(lái)自具有豐富實(shí)戰(zhàn)經(jīng)驗(yàn)的頂尖專(zhuān)家之手,而這樣的書(shū)實(shí)在是太少了?!? 譯者陳偉柱是我的好朋友,在C++、Java、模式和重用等方面都有比較深刻的理解。他對(duì)待此書(shū)翻譯工作的態(tài)度極為認(rèn)真,正是這一點(diǎn)令我對(duì)這本書(shū)的翻譯質(zhì)量很有信心。原書(shū)作者是以技術(shù)扎實(shí)而謙恭簡(jiǎn)和著稱(chēng)的,他們的文字也是平實(shí)簡(jiǎn)練而深富內(nèi)涵的,我認(rèn)為偉柱的為人和他的文字也具有這樣的特點(diǎn)。因此,我衷心希望讀者也能以平實(shí)謙和的心態(tài)認(rèn)真、扎實(shí)地閱讀和學(xué)習(xí)此書(shū),并祝愿大家能有滿意的收獲?!? ——孟巖
編輯推薦
Scott Meyers與Francis Glassborow鼎力推薦的頂尖圖書(shū),“大多數(shù)程序庫(kù)設(shè)計(jì)者應(yīng)該搬過(guò)小板凳來(lái),像小學(xué)生那樣學(xué)習(xí)這本書(shū)”。在這本書(shū)中,兩位作者把自己多年來(lái)撰寫(xiě)可重用庫(kù)的經(jīng)驗(yàn)和教訓(xùn)高濃度地總結(jié)起來(lái),給出了很多具有深刻洞察力的建議。認(rèn)真閱讀吧,因?yàn)檫@本書(shū)來(lái)自具有豐富實(shí)戰(zhàn)經(jīng)驗(yàn)的頂尖專(zhuān)家之手,而這樣的書(shū)實(shí)在是太少了。
圖書(shū)封面
圖書(shū)標(biāo)簽Tags
無(wú)
評(píng)論、評(píng)分、閱讀與下載
250萬(wàn)本中文圖書(shū)簡(jiǎn)介、評(píng)論、評(píng)分,PDF格式免費(fèi)下載。 第一圖書(shū)網(wǎng) 手機(jī)版