出版時(shí)間:2006-1 出版社:人民郵電出版社 作者:Herb Sutter 頁數(shù):276 譯者:劉未鵬
Tag標(biāo)簽:無
內(nèi)容概要
軟件“風(fēng)格”所要討論的主題是如何在開銷與功能之間、優(yōu)雅與可維護(hù)性之間、靈活。性與過分靈活之間尋找完美的平街點(diǎn)。在本書中,著名的C++大師Herb Sutter給出了40個(gè)編程問題。其目的是為了使讀者不僅“知其然”,更要“知其所以然”,并幫助讀者在軟件開發(fā)中進(jìn)行正確的決策。本書是圍繞實(shí)際問題及其解決方案展開論述的,對一些至關(guān)重要的C++細(xì)節(jié)和相互關(guān)系提出了新的見解,為當(dāng)今的關(guān)鍵C++編程技術(shù)(如泛型編程、STL、異常安全等)提供了新的策略。 本書中,C++大師Herb sutter通過40個(gè)編程問題,使讀者不僅“知其然”,更要“知其所以然”,幫助程序設(shè)計(jì)人員在軟件中尋找恰到好處的折中,即討論如何在開銷與功能之間、優(yōu)雅與可維護(hù)性之間、靈活性與過分靈活之間尋找完美的平衡點(diǎn)。本書是圍繞實(shí)際問題及其解決方案展開論述的,對一些至關(guān)重要的C++細(xì)節(jié)和相互關(guān)系提出了新的見解,為當(dāng)今關(guān)鍵的C++編程技術(shù)(如泛型編程、STL、異常安全等)提供了新的策略。本書的目標(biāo)是讓讀者在設(shè)計(jì)、架構(gòu)和編碼過程中保持良好的風(fēng)格,從而使編寫的C++軟件更健壯、更高效。本書適合中高級C++程序員閱讀。
作者簡介
Herb Sutter ISO C++標(biāo)準(zhǔn)委員會(huì)主席,C++ Users Journal雜志特邀編輯和專欄作家。他目前在微軟公司領(lǐng)導(dǎo)NET環(huán)境下C++語言擴(kuò)展的設(shè)計(jì)工作。除本書外,他還撰寫了三本廣受贊譽(yù)的圖書: Exceptional C++ Style(中文版即將由人民郵電出版社出版)、Exceptional C++ Style和More Exceptional C++ Style。
書籍目錄
泛型編程與C++標(biāo)準(zhǔn)庫第1條 vector的使用第2條 字符串格式化的“動(dòng)物莊園”之一:sprintf第3條 字符串格式化的“動(dòng)物莊園”之二:標(biāo)準(zhǔn)的(或極度優(yōu)雅的)替代方案.第4條 標(biāo)準(zhǔn)庫成員函數(shù)第5條 泛型性的風(fēng)味之一:基礎(chǔ)第6條 泛型性的風(fēng)味之二:夠“泛”了嗎第7條 為什么不特化函數(shù)模板第8條 友元模板第9條 導(dǎo)出限制之一:基礎(chǔ)第10條 導(dǎo)出限制之二:相互影響,可用性問題以及準(zhǔn)則異常安全問題及相關(guān)技術(shù)第1l條 try和catch第12條 異常安全性:值得嗎第13條 對異常規(guī)格的實(shí)際考慮類的設(shè)計(jì)、繼承和多態(tài)第14條 順序,順序!第15條 訪問權(quán)限的使用第16條 (幾乎)私有第17條 封裝第18條 虛擬第19條 對派生類施加規(guī)則內(nèi)存和資源管理第20條 內(nèi)存中的容器之一:內(nèi)存管理的層次第21條 內(nèi)存中的容器之二:它到底有多大第22條 進(jìn)行new操作,也許會(huì)拋出異常之一:new的方方面面第23條 進(jìn)行new操作,也許會(huì)拋出異常之二:內(nèi)存管理中的實(shí)際問題優(yōu)化和效率第24條 常量優(yōu)化第25條 再論內(nèi)聯(lián)第26條 數(shù)據(jù)格式和效率之一:什么時(shí)候壓縮是真正重要的第27條 數(shù)據(jù)格式和效率之二:(甚至更少的)位操縱陷阱、缺陷和謎題第28條 不是關(guān)鍵字的關(guān)鍵字(或者:另一種注釋)第29條 這是初始化嗎第30條 要么double要么徹底完蛋第31條 狂亂的代碼第32條 小小的拼寫錯(cuò)誤?鬼畫符似的語言以及其他奇形怪狀的東西第33條 操作符,無處不在的操作符風(fēng)格案例研究第34條 索引表第35條 泛型回調(diào)第36條 構(gòu)造式union第37條 分解std::string之一:概觀std::string第38條 分解std::stnng之二:重構(gòu)std::string第39條 分解std::string之三:給std::str¨1g瘦身第40條 分解std::string之四:再論std::stmg參考文獻(xiàn)索引
章節(jié)摘錄
前言 布達(dá)佩斯,匈牙利的首都。一個(gè)炎熱的夏日傍晚。穿過美麗的多瑙河望去,余暉中的東岸景色優(yōu)美恬靜?! ”緯饷嫔仙嗜岷偷臍W洲風(fēng)光中,哪棟建筑首先映入你的眼簾?幾乎可以肯定,是照片左邊的國會(huì)大廈。這棟巨大的新哥特式建筑以它優(yōu)美的圓穹、直插天際的尖塔、不計(jì)其數(shù)的外墻雕塑以及其他華麗裝飾一下攫住了你的目光,而它更引人注目之處,在于它與四周建筑在多瑙河畔那些刻板的實(shí)用建筑形成了極其鮮明的對照?! 槭裁磿?huì)有這么大的差異呢?一方面,國會(huì)大廈是在1902年竣工的,而其他味同嚼蠟的建筑則大部分都是在二戰(zhàn)以后建成的。 “啊哈,”你可能會(huì)想,“這的確解釋了為什么差異如此之大。然而這與本書到底有什么關(guān)系呢?” 毫無疑問,風(fēng)格的表達(dá)與你在表達(dá)風(fēng)格時(shí)灌注的哲學(xué)和思維方式是有很大關(guān)系的,這一點(diǎn)不管對于建筑學(xué)還是對于軟件架構(gòu)來說都同樣適用。我相信你們都見過像封面上國會(huì)大廈那樣宏偉而華麗的軟件,我同樣相信你們也見過僅能工作而且一團(tuán)亂麻似的軟件。從一個(gè)極端的角度來說,我相信你也見過許多過分追求風(fēng)格反而弄巧成拙的華而不實(shí)之作和許多只顧盡快完成任務(wù)而毫無風(fēng)格的“丑小鴨”(而且永遠(yuǎn)也不會(huì)變成天鵝)?! ★L(fēng)格還是實(shí)用? 哪個(gè)更好? 不要太相信自己知道答案。一方面,除非你給出一個(gè)明確的標(biāo)準(zhǔn),否則“更好”只是一個(gè)無意義的評價(jià)。對什么更好呢?在哪些方面更好呢?另一方面,答案幾乎總是這兩者的平衡,最開始總是“這取決于……”?! ”緯懻摰氖侨绾卧谑褂肅++進(jìn)行軟件設(shè)計(jì)和實(shí)現(xiàn)的諸多細(xì)節(jié)方面找到最佳平衡點(diǎn),如果更好地理解所擁有的工具和設(shè)施,弄清它們應(yīng)該在什么時(shí)候應(yīng)用?! 】焖倩卮穑号c四周索然無味的建筑相比,封面上的國會(huì)大廈是更好的建筑嗎?其建筑風(fēng)格更好嗎?如果不加思索就給出答案,很可能你會(huì)說“當(dāng)然”,但是別忘了,你還沒有考慮其建造和修繕的代價(jià)呢: ? 建造。在1902年竣工之時(shí),它是當(dāng)時(shí)世界上最大的國會(huì)大廈。人們花費(fèi)了難以想像的時(shí)間、不計(jì)其數(shù)的人力物力來興建它,以至于許多人稱它為“白象(white elephant)”,意思是耗資過大的美麗事物??紤]這樣一個(gè)問題:比較起來,花費(fèi)同樣的投資能夠建造多少幢周圍那不美觀、單調(diào)、或許干脆是令人厭煩的實(shí)用建筑?如果你是在一個(gè)工程進(jìn)度壓力遠(yuǎn)比這座國會(huì)大夏建造時(shí)代要大得多的行業(yè)工作,你又會(huì)怎么做? ? 修繕。你們中那些熟悉這座建筑的人會(huì)注意到照片中的建筑正在進(jìn)行修繕翻新,而且這個(gè)工作已經(jīng)持續(xù)了好多年,其間又極有爭議地花費(fèi)了巨量的資金。然而除了最近的這輪昂貴的修繕之外,之前還有多次修繕,因?yàn)檫z憾的是,這座建筑外墻上的精美雕刻是由錯(cuò)誤的材料制成的,其材料太過柔軟了。在大樓建成后不久,這些雕刻成了人們持續(xù)進(jìn)行修繕的主要內(nèi)容,它們逐漸被替換為更為堅(jiān)固而耐久的材料,這些華麗之物的大規(guī)模修繕自從20世紀(jì)初開始就一直沒停過,持續(xù)了近一個(gè)世紀(jì)?! ≤浖_發(fā)中的情形也與此類似,重要的是在建造的代價(jià)和獲得的功能之間、在優(yōu)雅與可維護(hù)性之間、在發(fā)展的潛在可能與過分追求華麗之間尋求合理的平衡。 使用C++來進(jìn)行軟件設(shè)計(jì)和架構(gòu)時(shí),我們每天都得面對這些類似的權(quán)衡。在本書中討論的問題當(dāng)中有這樣幾個(gè)問題:使代碼成為異常安全的就意味著將它變得更好了嗎?如果是這樣的,那么這里所謂的“更好”是指什么意義上的呢?什么時(shí)候它可能不是“更好”的呢?在本書中你會(huì)得到明確的答案。封裝呢?封裝是否令軟件變得更好?為什么?什么時(shí)候封裝反倒不能令你的軟件變得更好?如果你想知道答案,繼續(xù)往下讀。內(nèi)聯(lián)是一項(xiàng)有益的優(yōu)化嗎?內(nèi)聯(lián)是什么時(shí)候進(jìn)行的呢?(你在回答這個(gè)問題的時(shí)候可得十分小心了。)C++中的模板導(dǎo)出(export)特性與封面上的國會(huì)大廈有什么共通之處呢?std::string跟多瑙河畔的巨型建筑又有何共通之處呢? 最后,在考慮了許多C++技術(shù)和特性之后,本書的最后,我們會(huì)用一整個(gè)部分來考察源自公開發(fā)布的代碼中的幾個(gè)實(shí)際例子,看看代碼的作者在哪些方面做得好,在哪些方面做得不好,以及什么樣的替代方案可能在實(shí)用性與良好的C++風(fēng)格之間取得更好的平衡。 我希望本書以及Exceptional C++系列的其他圖書能夠開闊你的視野,增加你有關(guān)許多細(xì)節(jié)及其相互關(guān)系的知識,讓你進(jìn)一步了解到如何在編寫自己的軟件時(shí)找到合理的平衡點(diǎn)?! ≌?jiān)倏匆谎鄯饷嫔系恼掌?,在照片的右上方,你?huì)看到一個(gè)熱氣球。如果我們乘坐那樣的熱氣球飛越城市的上空,整個(gè)城市的景色將盡收眼底。我們會(huì)看到風(fēng)格跟實(shí)用是如何相互影響相互依存的,我們也會(huì)知道如何去進(jìn)行權(quán)衡并找到合理的平衡點(diǎn),所有的決策將各得其所,構(gòu)成一個(gè)富于生機(jī)的整體?! ∈堑?,我想布達(dá)佩斯是一個(gè)偉大的城市——充滿著如此豐富的歷史底蘊(yùn),充滿著不盡的神秘喻義?! ゴ蟮奶K格拉底 古希臘哲學(xué)家蘇格拉底通過問問題來教他的學(xué)生們,他精心準(zhǔn)備的問題是為了引導(dǎo)并幫助學(xué)生從已知的知識引出結(jié)論,并說明他們所學(xué)的東西是如何彼此相關(guān)、如何與他們現(xiàn)有的知識有著千絲萬縷的聯(lián)系的。這種教學(xué)方式后來變得如此有名,以至于我們稱它為“蘇格拉底方法”。而從學(xué)生的角度來看,蘇格拉底的這種著名的教學(xué)方法能夠吸引我們,讓我們思考,并幫助我們從已知的東西出發(fā)去引出新的東西。 本書跟它的前面幾本書(Exceptional C++ [Sutter00]和More Exceptional C++ [Sutter02])一樣,正是借鑒了蘇格拉底的做法。本書假定你在編寫C++產(chǎn)品代碼已有一些經(jīng)驗(yàn),書中使用了一種問答的形式來告訴你如何有效地利用標(biāo)準(zhǔn)C++及其標(biāo)準(zhǔn)庫,特別地,我們將關(guān)注的中心放在如何用現(xiàn)代C++中實(shí)施可靠的軟件構(gòu)造上。書中的許多問題都是從我以及其他人在編寫C++產(chǎn)品代碼時(shí)遇到的問題當(dāng)中提煉出來的。問題的目標(biāo)是幫助你從已知的以及剛學(xué)到的東西出發(fā)得出結(jié)論,并展示它們之間如何關(guān)聯(lián)。書中給出的問題會(huì)展示如何對C++設(shè)計(jì)和編程問題作出理性的分析和判斷,其中有些只是常見問題,有些不是那么常見;有些是非常單純的問題,而有些則深?yuàn)W一些;另外還有幾個(gè)問題之所以放在書中只是因?yàn)椤驗(yàn)樗鼈儽容^有趣?! ”緯婕傲薈++的方方面面。我的意思并不是說它觸及了C++的每個(gè)細(xì)枝末節(jié)(那可需要多得多的篇幅了),我只不過是說它是從C++語言和庫特性這塊大調(diào)色板上取色,并描繪出一幅圖景,展示那些看似毫無瓜葛的特性如何編織到一起,從而構(gòu)成常見問題的一個(gè)個(gè)漂亮解決方案。另外,本書還展示了那些看似無關(guān)的部分是如何互相之間盤根錯(cuò)節(jié)、存在著千絲萬縷的聯(lián)系的(即便有時(shí)你也許并不希望它們之間有什么聯(lián)系),以及如何去處理這些復(fù)雜關(guān)系。你會(huì)看到一些關(guān)于模板和名字空間的討論,也會(huì)看到一些關(guān)于異常與繼承的討論,同樣,另外還有關(guān)于堅(jiān)實(shí)的類設(shè)計(jì)和設(shè)計(jì)模式的討論,關(guān)于泛型編程與宏技巧的討論等等。此外,還有一些實(shí)實(shí)在在的(而不是一些花邊新聞式的邊欄小字)條款是用來向你展示現(xiàn)代C++中的所有這些部分之間的相互關(guān)系的。 Exceptional C++ Style遵循了Exceptional C++和More Exceptional C++前兩本書的傳統(tǒng):它通過短小精悍的條款的組織形式,并將這些條款再進(jìn)一步分組為一個(gè)個(gè)的主題來介紹新東西。讀過我的第一本書的讀者會(huì)發(fā)現(xiàn)一些熟悉的主題,不過現(xiàn)在包含了新的東西,諸如異常安全、泛型編程以及優(yōu)化和內(nèi)存管理技術(shù)。我的幾本書在主題上有部分重疊,但內(nèi)容上并沒有重復(fù)。本書沿襲了對泛型編程和高效使用標(biāo)準(zhǔn)庫的一貫強(qiáng)調(diào)態(tài)度,包括一些重要的模板和泛型編程技術(shù)的討論?! 械拇蠖鄶?shù)條款最初出現(xiàn)在雜志專欄上以及網(wǎng)上,尤其是我為C/C++ Users Journal和Dr. Dobbs Journal,已??腃++ Report以及其他期刊所寫的專欄文章,另外還有我的Guru of the Week[GotW]問題63到86。不同的是本書中的材料與最初的版本相比經(jīng)過了重大的修訂、擴(kuò)展、校正和更新,因此這本書(以及www.gotw.ca網(wǎng)站上的勘誤表)應(yīng)該被當(dāng)成原先那些文章的最新而且權(quán)威的版本?! ☆A(yù)備知識 我假定讀者已經(jīng)知道一些C++的基礎(chǔ)知識。如果不是這樣,那就先去閱讀一些好的關(guān)于C++的介紹和概述的文章或書籍。像Bjarne Stroustrup的《The C++ Programming Language》[Stroustrup00]或者Stan Lippman和Josee Lajoie合著的《C++ Primer(第三版)》[Lippman98] 這樣的經(jīng)典是良好的選擇。接下來,一定要選擇一本Scott Meyers的經(jīng)典書籍《(More)Effective C++》[Meyers96,Meyers97]這樣的風(fēng)格指南,我發(fā)現(xiàn)這兩本書基于Web瀏覽方式的CD版本[Meyers99]比較方便實(shí)用?! ∪绾伍喿x本書 本書中的每一條都是以一個(gè)謎題或問題來展開的,都有一個(gè)介紹性的標(biāo)題,如下: ##. 條款的主題 難度:# 一段簡短的介紹性文字,說明該條將要討論的內(nèi)容?! l款主題大致告訴你本條討論的是什么,通常后面會(huì)跟有介紹性的/回顧性的問題[JG問題,JG是指新來的、級別較低的軍官(少尉)],然后就是主要問題(即Guru問題)。注意,難度系數(shù)只是我對特定主題對大多數(shù)讀者而言的難度所作的一個(gè)大致推測,這就是說你可能會(huì)發(fā)現(xiàn)一個(gè)難度為7的問題對你來說卻比一個(gè)難度為5的問題要來得簡單。實(shí)際上我的前兩本書:Exceptional C++ [Sutter00]和More Exceptional C++ [Sutter02]就曾不斷地收到一些讀者來信說:“嗨!第N條比它實(shí)際上要更難(簡單)!”不同的人對于“簡單”的評價(jià)標(biāo)準(zhǔn)各有不同。所謂難度系數(shù)只是因人而異的,任何條款的難度實(shí)際上都是取決于你所掌握的知識和經(jīng)驗(yàn),而其他人則可能覺得它更容易或更難。不過大多數(shù)情況下應(yīng)當(dāng)將我給出的難度系數(shù)作為一個(gè)合理的指示,讓你能夠知道下面會(huì)出現(xiàn)什么問題。 你可能會(huì)選擇從頭至尾按順序閱讀本書,這很好,但是不是非要這么做。你可能決定讀某個(gè)特定部分的所有條款,因?yàn)閷υ摬糠值闹黝}特別感興趣;這也沒關(guān)系。一般來說書中的所有條款都是基本獨(dú)立的,除非標(biāo)注有“之一”、“之二”等的條款之間才會(huì)有緊密聯(lián)系。因此你在閱讀本書的時(shí)候完全可以以跳躍式的方式,順著條款中的交叉引用(包括對我前兩本書的引用)來閱讀。惟一需要注意的地方就是,標(biāo)注了“之幾”的連續(xù)幾個(gè)章節(jié)之間互有關(guān)聯(lián),構(gòu)成了一個(gè)主題,除此之外其他條款你完全可以自由選擇閱讀?! 〕俏易⒚髂扯未a是一個(gè)完整的程序,否則它就不是。記住,代碼示例通常只是從一個(gè)完整程序中摘取出來的一小段代碼,不要期望它們都能夠獨(dú)立編譯。一般來說你得為其添上一副骨架才能夠使其成為一個(gè)完整的可編譯的程序?! ∽詈螅P(guān)于書中的URL:網(wǎng)上的東西總是在變,尤其是那些我無權(quán)干涉的東西。因此隨意將某些網(wǎng)站地址放在一本刊印的書籍中可不大妥當(dāng),因?yàn)榭峙略跁队≈坝行┑刂肪鸵呀?jīng)作廢了,更不用說在這本書在你書架上躺了幾年之后了。所以說,當(dāng)我在書中引用其他人的文章或網(wǎng)址的時(shí)候,我給出的地址是鏈接到我自己網(wǎng)站(即www.gotw.ca)上相關(guān)內(nèi)容的地址,后者我是可以控制的,因此我可以在我網(wǎng)站上的相關(guān)網(wǎng)頁上隨時(shí)作相應(yīng)更新,讓其中的相關(guān)地址指向?qū)嶋H存在的網(wǎng)頁。幾乎所有在書中引用到的其他人的作品我都放在參考書目里了,而且還在我的網(wǎng)站上也放置了一份副本,其中的鏈接都是有效的。如果你發(fā)現(xiàn)本書中的鏈接無效了,請發(fā)電子郵件向我告知,我會(huì)在網(wǎng)站上更新相關(guān)的鏈接(如果我可以找到新地址的話),或者注明鏈接已經(jīng)失效(如果我無法找到新地址的話)。無論如何,雖說書一旦印刷便白紙黑字,不可再改,但我網(wǎng)站上的相關(guān)內(nèi)容會(huì)保持更新。
媒體關(guān)注與評論
本書是圍繞實(shí)際問題及其解決方案展開論述的,對一些至關(guān)重要的C++細(xì)節(jié)和相互關(guān)系提出了新的見解,為當(dāng)今的關(guān)鍵C++編程技術(shù)(如泛型編程、STL、異常安全等)提供了新的策略。讀者會(huì)在書中找到下列問題的答案?! た梢詮腟TL本身學(xué)習(xí)哪些庫設(shè)計(jì)的知識? ·如何避免削弱甚至損害模板代碼的通用性? ·為什么不應(yīng)該對函數(shù)模板進(jìn)行特化?正確的做法是什么? ·異常安全如何超越TRY和CATCH語句? ·什么情況下應(yīng)當(dāng)“泄漏”一個(gè)類的私有成分,怎么做? ·如何讓一個(gè)類不受版本變動(dòng)的影響? ·使用標(biāo)準(zhǔn)庫容器的實(shí)際內(nèi)存開銷是多少? ·如何使用CONST才能真正優(yōu)化代碼? ·內(nèi)聯(lián)對程序性能有何影響? ·為什么有些看似錯(cuò)誤的代碼實(shí)際上卻能夠通過編譯且運(yùn)行得很好?為什么我們要關(guān)心這種情況? ·STD::STRING的設(shè)計(jì)有什么問題? 本書使讀者能夠在設(shè)計(jì)、架構(gòu)和編碼的過程中保持良好的風(fēng)格,從而編寫出更健壯和更高效的C++軟件。
圖書封面
圖書標(biāo)簽Tags
無
評論、評分、閱讀與下載
Exceptional C++ Style中文版 PDF格式下載