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