没有合适的资源?快使用搜索试试~ 我知道了~
Effective C++ Second Edition.pdf
需积分: 42 9 下载量 167 浏览量
2007-05-29
15:16:21
上传
评论
收藏 1.04MB PDF 举报
温馨提示
试读
202页
Effective C++ Second Edition(中文版)传说中很牛的
资源推荐
资源详情
资源评论
关于本电子书
制作本书的目的是为了方便大家的阅读。
感谢 lostmouse 为我们翻译了这么好的 C++名著,希望大家多多支持他,并希望他能继续给
我们带来更多更好的文章。
为了加强本书的完整性,特将侯老师翻译的前言和导读也加了近来。其余均为 lostmouse
翻译。
制作:
PROPHET (MSN:lzphd@hotmail.com欢迎志同道合的朋友互相交流)
来源:
http://blog.csdn.net/bat603
2006/05/29
善待周围的人,以感恩的心对待生活中的任何人和事。
译者简介:
Lostmouse 简介
认识 CSDN 已经很久了,但开始写技术文章不过是不久前的事,开辟这个专栏更是出于偶然。
因为工作方面的原因,不能保证自己一直会有大块的时间来维护这个专栏,但我会尽力。
至于 Lostmouse 本人,并非卡通中那只聪明可爱的小老鼠;相反,却是一只将至而立却还在
迷惘的老猫:眼神固然明亮坚定,内心深处却还不知道下一个目标在哪儿。猫的天性只是等
前言
這本書是多年來我對專業程式員所做的 C++ 教學課程下的一個自然產物。我發現,大部份
學生在一個星期的密集訓練之後,即可適應這個語言的基本架構,但要他們「將這些基礎架
構以有效的方式組合運用」,我實在不感樂觀。於是我開始嘗試組織出一些簡短、明確、容
易記憶的準則,做為 C++ 高實效性程式開發過程之用。那都是經驗豐富的 C++ 程式員幾
乎總是會奉行或幾乎肯定要避免的一些事情。
我最初的興趣在於整理出一些可被某種「lint-like 程式」施行的規則,最後我甚至領導一個
計劃,研究某種可將 C++ 原始碼中違反使用者指定條件之處檢驗出來的工具(你可以在
Effective C++ 網站上找到此研究的一份概要報告)。不幸的是在我尚未完成其完整原型之前,
這個研究計劃便結束了。幸運的是,目前市面上已有這類 C++ 檢驗工具(商品),而且不
只一個。
雖然我最初的興趣是在研究可被(某種工具)自動實施的程式設計準則,但我很快瞭解到那
個研究方向的侷限性。優秀的 C++ 程式員所奉行的準則,多數都難以「公式化」;要不就
是雖然它們有許多重要的例外情況,卻被程式員盲目地奉行不渝。這使我念頭一轉:某些東
西雖然不比電腦程式精準,但仍能比一本泛泛的 C++ 教科書更集中火力,更打到重點。這
個念頭的結果就是你手上這本書:一本內含 50 個有效建議(如何改善你的 C++ 程式技術
和你的設計思維)的書。
在這本書中,你會發現一些忠告,告訴你應該做些什麼,為什麼如此;告訴你不應該做些什
麼,又為什麼如此。基本而言當然 whys 比 whats 更重要,但檢閱一列列準則,也確實比強
記一本或兩本教科書更輕鬆更方便得多。
和大部份的 C++ 書籍不同,我的組織方式並非以語言特性做為依據。也就是說我並不在某
處集中討論 constructors(建構式),在另一處集中討論 virtual functions (虛擬函式),又
在第三個地方集中討論 inheritance(繼承機制)。不,不是這樣,本書的每一個討論主題都
剪裁合度地以一個個準則陳列出來。至於我對某特定語言性質的探討,散佈面積可能涵蓋整
本書。
這種作法的優點就是比較容易反映出「特意挑選 C++ 做為開發工具」的那些軟體系統的複
雜度。在那些系統之中,光只瞭解個別語言特性是不夠的。例如,有經驗的 C++ 程式員知
道,瞭解 inline 函式和瞭解 virtual destructors,並不一定表示你瞭解 inline virtual destructors。
身經百戰的開發人員都認知到,理解 C++ 各個特性之間的互動關係,才是有效使用這個語
言的最重要關鍵。本書組織反映出這一基本事實。
這種作法的缺點是,你恐怕必須前後交叉參考而非只看一個地方,才能發現我所說的某個
C++ 架構的全貌。為了將不方便性降至最低,我在書中各處放了許多交叉索引,書後並有
一份涵蓋全部範圍的索引。(譯註:為了協助讀者更容易掌握 Effective C++ 和 More Effective
C++ 二書,我以 Effective C++ CD 為本,為兩書的中文版額外加上兩書之間的交叉索引。
此乃原書所無。如果文中出現像條款 M5 這樣的參考指示,
M 便是代表 More Effective C++)
籌劃第二版期間,我改寫此書的雄心一再被恐懼所取代。成千上萬的程式員熱情擁抱
Effective C++ 第一版,我不希望破壞吸引他們的任何東西。但是自從我寫了第一版之後,
六年過去了,C++ 有了變化,C++ 程式庫有了變化(見條款 49),我對 C++ 的瞭解也有
了變化,乃至於 C++ 的用途也有了變化。許許多多的變化。對我而言,重要的是我必須修
訂 Effective C++ 以反映那些變化。我嘗試一頁一頁地修改內容,但是書籍和軟體十分類似,
局部加強是不夠的,唯一的機會就是系統化地重寫。本書就是重寫後的結果:Effective C++
2.0 版。
熟悉第一版的讀者,可能有興趣知道,書中的每一個條款都經過重新檢驗。然而我相信第一
版的結構至今仍是流暢的,所以整本書的結構並沒有改變。50 個條款中,我保留了 48 個,
其中某些標題稍有變化(附隨的討論內容亦復如此)。退休下來(被取代的)兩個條款是
32 和 49,不過原條款 32 的許多資訊被我移到如今煥然一新的條款 1 中。我將條款 41 和
42 的次序做了對調,因為這樣比較能夠適當呈現它們修訂後的內容。最後,我把上一版繼
承體系圖所採用的箭頭方向顛倒過來,以符合目前幾乎已經一致的習慣:從 derived classes
指往 base classes。我的 More Effective C++ 一書也採用相同習慣(本書最後列有該書摘要)。
本書提供的準則,離鉅細糜遺的程度還很遠,但是完成一個好的準則— 一個幾乎可於任何
時間應用於任何程式的準則,動手遠比動嘴困難得多。如果你知道其他準則,可以協助撰寫
有效的 C++ 程式,我非常樂意聽到你告訴我它們的故事。
此外,說不定你會覺得本書的某些條款不適合成為一般性忠告;或許你認為另有比較好的方
法來完成書中所說的任務;或許你認為某些條款在技術討論方面不夠清楚,不夠完全,抑或
有誤導之嫌。我衷心盼望你也能夠讓我知道你的這些想法。
Donald Knuth(譯註:經典書籍 The Art of Computer Programming, Volume I,II,III 的作者)
長久以來為挑出其書錯誤的熱心讀者準備有一份小小的報酬。這個故事傳為美談。追求完美
的精神令人佩服。看過那麼多倉促上市錯誤壘壘的 C++ 書籍後,我更是特別強烈地希望踵
隨 Knuth 的風範。因此,如果有人挑出本書的任何錯誤並告訴我— 不論是技術、文法、錯
別字、或任何其他東西— 我將在本書新刷的時候,把第一位挑出錯誤的讀者大名加到致謝
名單中。
請將你的建議、你的見解、你的批評、以及(喔…真糟…)你的臭蟲報告,寄至:
Scott Meyers
c/o Publisher, Corporate and Professional Publishing
Addison Wesley Longman, Inc.
1 Jacob Way
Reading, MA 01867
U. S. A.
或者傳送電子郵件到
ec++@awl.com。
我維護有本書第一刷以來的修訂記錄,其中包括錯誤更正、文字修潤、以及技術更新。你可
以從 Effective C++ 網站取得這份記錄。如果你希望擁有這份資料,但無法上網,請寄申請
函到上述地址,我會郵寄一份給你。
Scott Douglas Meyers Stafford, Oregon
July 1997
導讀
學會一個程式語言,是一回事兒;學會如何以此語言設計並實作出有效的程式,又是一回事
兒。C++ 尤其如此,因為它很不尋常地涵蓋了罕見的威力和豐富的表現力,不但建立在一
個全功能的傳統語言(C)之上,更提供極為廣泛的物件導向(object-oriented)性質,以及
對 templates 和 exceptions(異常狀態)的支援。
假以適當運用,C++ 是個可以讓你感受愉悅的夥伴。各種不同的設計方式,包括物件導向
型式和傳統型式,都可以直接在這個語言中表現並有效地實作出來。你可以定義新的資料型
別,它們和語言內建的型別表面上無分軒輊,實質上則更具彈性。明智地選用一些謹慎設計
的 classes — 自動完成記憶體管理、別名(aliasing)處理、初始化動作與清理動作、型別轉
換、以及軟體開發的其他難題與禍根— 可以使程式設計更容易,更直觀,更有效,更少錯
誤。是的,要寫出有效的 C++ 程式並不會太困難,如果你知道怎麼做的話。
如果沒有什麼訓練與素養,就冒然使用 C++,會導至做出來的碼不易理解、不易維護、不易
擴充、缺乏效率、而且容易出錯。
關鍵在於找出 C++ 可能絆倒你的狀況有哪些,然後學習如何避開它們。這正是本書的目的。
我假設你已經認識 C++ 並對它有某種程度的使用經驗。我提供一些準則,讓你更有效地使
用這個語言,使你的軟體容易理解、容易維護、容易擴充、效率高、而且行為如所預期。
我提出的忠告分為兩大類:一般性的設計策略,以及特殊的(比較難得一見的)語言性質。
設計方面的討論集中在如何對不同的方法(俾得以 C++ 達成某個目標)做取捨。如何在
inheritance(繼承)和 templates(範本)之間做選擇?在 templates 和 generic pointers(泛型
指標)之間?在 public inheritance(公開繼承)和 private inheritance (私有繼承)之間?在
private inheritance 和 layering(分層技術)之間?在 function overloading(函式多載化)和
parameter defaulting(參數預設值)之間?在 virtual function(虛擬函式)和 nonvirtual functions
(非虛擬函式)之間?在 pass-by-value (傳值)和 pass-by-reference(傳址)之間?一開始
就做出正確的決定是很重要的,因為不正確的選擇或許不會一下子就浮現影響,但是在開發
過程的後期,矯正它往往很困難、很花時間,很混亂,很令人沮喪,事倍功半,成本很高。
在你確切知道你要做什麼之後,把它做對,恐怕也不是件太容易的事。什麼是 assignment 運
算子的適當傳回型別?當 operator new 無法找出足夠的記憶體,它該有怎樣的行為?
destructor 何時應該被宣告為 virtual?你應該寫一個 member initialization list(成員初值列)
嗎?在如斯細節中努力,也頗具有決定性,因為如果不這樣,常會導至意料之外或神秘難解
的程式行為。更糟的是這類脫軌行為可能不會立即浮現,這些恐怖的碼或能通過品管檢驗,
卻仍然藏匿著許多未偵測出來的臭蟲— 不定時炸彈正等待引爆。
剩余201页未读,继续阅读
资源评论
YUJUN6688
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功