天天看點

C++進階之路

C++是最難的語言。這個世界上最難的程式設計語言可能非C++莫屬了。你千萬

不要以為幾天就可以學好C++,C++的學習曲線是相當BT的,你可以看看這篇文章。C++是一門很自由的語言,自由到了有點BT和恐怖的地步。我甚至認為C++并不是一門成熟的程式設計語言,因為太容易犯錯了。是以,你一定要在一開始就要有很小心謹慎的态度,并把C++當成一種難以訓服的猛獸來看待。 · 多問“為什麼要這樣”的問題。學習C++一定要多問幾個“為什麼是這樣”,“憑

什麼要這樣”的問題。比如:很多人知道C++有拷貝構造函數和初始化清單,但你真的知道為什麼要有拷貝構造函數?為什麼要有初始化清單嗎?為什麼要有template,為什麼要有RTTI,為什麼不是别的呢?難道就是為了讓一門語言變得Cool一些嗎?完全不是這樣的,C++中的任何一個feature都有些實實在在的原因,你一定要去了解為什麼要把C++設計成這樣的原因,你才能學好C++。有空看看《C++演化和設計》一書。

· 看書,大量的C++書。你可以按如下先後順序閱讀(下面這些書,我花了大約

4-5年的時間,今天我還在随時溫習)

o 《C++Primer》,這本初級讀本可能讓會你啃得很痛苦,所有的語言

的特性和為什麼都在裡面了,好好讀讀。當然由C++之父寫的《C++程式設計語言》也不錯。兩本看一本就好了(我看的是前者)。

o 了解C++的文法僅僅是萬裡長征的第一步,你還需要看看《Effective

C++》和《MoreEffective C++》這兩本書并不厚,但我從02年就一直看到現在,每次讀我都有新的體會,這兩本書太經典了。如果你對C語言不熟,這兩本書會讓你回去補C語言的課。

o Think in C++同樣是另一本經典之極的書,學c++必讀,但是中文版

的翻譯的很不好,是以還是去讀英文版的吧。

o 《C++沉思錄》同樣非常值得一讀,這裡教的不是程式設計,而是思考的方

法,這是相當珍貴的。

o 《ExceptionalC++》和《More Exceptional C++》讓你看看各種問

題的解決方法和一些常見的經典錯誤。

o 《AdvancedC++》和《Modern C++》可以讓你知道C++各種神奇

的用法。

o 《泛型程式設計與STL》是把C++實踐到了極緻的東西。很強大。STL——

神一樣的模闆庫(容器,算法和函數對象),不得不服。

o 《深入探索C++對象模型》讓你了解編譯器下的C++是什麼樣的,讓

你了解C++的性能并不差。這個對于C++的程式員太關鍵了。我以前寫過的《C++虛函數表解析》還有《C++對象記憶體布局》屬于這個範疇。 · 和Java語言做對比。我個人以為Java對C++這個并不成熟的語言做了很多

調整,規範和限制。是以,對比一下Java和C++,想一想,為什麼一些東西在C++中可以做,但在Java中卻不行。比如:Java的異常是必需要catch的,不然就會編譯不通過。為什麼Java不提供操作符重載?為什麼Java會引入接口來做多重繼承?為什麼Java沒有像C++那樣的I/O字元流?為什麼Java不支援指針?為什麼Java可以做到垃圾回收?等等。Java展現着很多面向對象設計的東西,學習Java有助于你學會怎麼更好地使用C++來程式設計。 · 面向對象設計 。雖然面向對象可能是個騙局。但是我覺得面向對象設計中的一

些實踐非常的不錯,比如,單一原則,依賴倒置原則,等等,都非常地經典。《設計模式》必需一讀,《面向對象的分析和設計》可以一讀。但不可以設計模式為中心來程式設計,而應該是用設計模式來解藕。

· 類庫學習。看看MFC是怎麼封裝Windows API的,看看ACE是怎麼面向對

象的,看看boost是怎麼玩面向對象的,看看CPPUnit又是怎麼設計的。當然,Java的JDK中有太多的設計模式,可以參考。

希望沒有吓到大家,并歡迎大家補充。

—————更新2011/03/30 19:20————

更新幾個觀點:

· 1)我不擅長寫書評,是以推薦的這些書可能會讓你有點看點沒有感覺,你可以

上豆瓣或是China-pub上看看書評。

第2/3頁

· 2)C++有很多奇淫技巧,有的很BT,包括虛函數表,也許會有人覺得有點沒

意思,但我覺得很有意思,一方面可以了解一門語言的實作細節,另一方面可以開闊思路。我從學習這些知識中受益很多。

·

· 3)上述是我的個人的學習曆程,我覺得對我很有效,是以是經驗之談。 4)這類的文章在網上有很多很多,我不是第一個寫這樣的文章,我也不是寫得

最好的,我并不希望用長篇大論來談論什麼。隻是想給大家了解一下大概的學習樣子。畢竟,C++博大精深,任何一篇文章都無法說好。不如就簡單一些。

怎麼學習C++?該先看什麼書,後看什麼書?衆說紛纭,下面是二篇網上流傳的文章。

C++學習之路

(一)語言入門:

《C++ Primer》

最新版本:第三版(第四版國外已上架,國内一些網上書店也在預訂中)

适合有豐富C經驗,缺乏C++經驗的。不過我個人一直認為此書帶着過于強烈的C語言的痕迹,對于C++的學習未必是好事。

《The C++ Programming Language》/《C++程式設計語言》

最新版本:第三版特别版

簡稱TC++PL,有其他語言的豐富經驗的。(也有人簡稱之為“TCPL”,但需與另一本《The C Programmer Language》區分開來)

《Essential C++》

《Accelerated C++》

這兩本薄一些,都是不錯的選擇。《Accelerated C++》本人沒有讀過,從各方面的評價來看,完全值得推薦。

以上幾本書都有相應的中文版,而且翻譯的品質都不錯。上面的書未必都需要讀一遍,但無論如何,TC++PL是應該閱讀的。

(二)進階A:

這個路線側重于語言本身

《Effective C++》

最新版本:第二版(第三版國外已上架,國内一些網上書店也在預訂中)

簡稱EC。C++程式員必讀!很多時候,我們說C++聖經不是指TC++PL,而是這一本。《The Pragmatic Programmer》一書中寫到:“一旦你發現自己要參與C++項目的開發,趕快跑(不要走)到書店去購買Scott Mayer的《Effective C++》,可能還要《More Effective C++》”。

《C++ Coding Standards: 101 Rules, Guidelines, and BestPractices》/《C++ 程式設計規範》

個人認為此書應為C++程式員必備的案頭書。幾乎Effective系列和Exceptional系列都在這裡得到了總結。最新的模版、異常的業界經驗都在這裡的到了展現。可能的唯一缺陷就是對一個新手而言,關于“為什麼這麼做”的問題,解釋的不夠。

我的看法是:如果你不了解其中的條款,記憶,并且照做;如果你了解其中的條款,我猜你一定會同意書中的觀點。我認為這本書中的内容至少在2009年以前都不會過時,人們将廣為傳誦它制定的101條戒律。

還不知道他的簡稱,也許“101”會成為一個候選者?

提到《Effective C++》,那麼另外三本書一一浮出水面:

《More Effective C++》

《Exceptional C++》

《More Exceptional C++》。

新書《Exceptional C++ Style》也是值得一看的好書。

上述幾本書,一本也不應該放過。

個人建議上述書籍按順序閱讀。并且,在将來反複閱讀這幾本書。

(三)進階B:

這個路線側重于程式庫。

《The C++ Standard Library》/《C++标準程式庫—自修教程與參考手冊》

聽說過STL嗎?這本書會教你最基本的,也是最重要的STL的使用。這本書,應該是必讀的。

《Effective STL》

會使用STL還不夠,還必須知道什麼時候選擇什麼STL元件,這是STL使用的必讀書。

《Generic Programming and the STL: Using and Extending theC++ Standard Template Library》/《泛型程式設計與STL》。

這本書理論性較強,但是真的很嚴謹,而且并不是非常難懂。了解其中對于Concept的解釋,将是非常重要的。

《C++ STL》

這不是講述使用程式庫的,而是講述程式庫實作原理的。腸胃不好的,需要慢慢吸收。

這個路線的書,仍然是建議按順序閱讀。

進階A、進階B兩個路線應該是可以并行的。

其他進階參考書

提出這些參考書,隻是避免争議,也為開闊視野,筆者并不曾完全讀過所有的。

《Thinking in C++》/《C++程式設計思想》

這本書及其中文版傳言好壞都有,沒有認真看過,不做評價,如果确有興趣,不妨嘗試一下該書。

以下幾本書基本上涉及的都是語言本身,大體上可以按照以下的順序閱讀。

《C++必知必會》

如果早一年,這本書将是重量級的,然而它被101和《Exceptional C++ Style》蓋過一頭。

《C++ Gotchas: Avoiding Common Problems in Coding andDesign》/《C++程式設計陷阱》

這又是一本我未曾讀過,而且廣受好評的書。

《STL 源碼剖析》

這本書我剛到手,就被人"借"走,以至于到現在也沒有看過。看過這本書的朋友,可以給一個合适的評價。

進階:

《The Design and Evolution of C++》/《C++語方的設計和演化》

簡稱D&E,内容并不艱深,Bjarne的書,僅此,就值得一讀。

前段時間,互動網曾8塊一本(人民币)賤賣此書,現在好像沒了。

《Inside The C++ Object Model》/《深度探索C++對象模型》

C程式員讀後一定會覺得C++原來并不神秘。

《C++ Template》

在閱讀STL、Boost或者Loki的源代碼之前,請仔細閱讀本書,它可以減輕一些閱讀的煩惱。這本書是讨論C++模版的權威。

《Modern C++ Design Generic Programming and Design PatternsApplied》/《C++設計新思維——泛型程式設計與設計模式之應用》

簡稱MCD。在閱讀MCD之前,建議先閱讀一下《C++ Template》。

《對象揭秘:Java、Eiffel和C++》

你對C++不滿嗎?這本書可以部分地幫你完成抱怨的目标。也許它還可以讓你不迷信C++。

最後,一份C++标準文檔也是應該加以咀嚼的。

還有一些書籍,并不能簡單的歸于C++,也難以在純粹的書本學習中加以掌握。《Design Patterns》/《設計模式》一書就歸于此類。

所有上述的書籍,要麼談論C++語言本身,要麼談論STL的,要麼兼而有之(當然嚴格講STL也是C++語言非常重要的一部分)。偶爾,某些書中條目也會涉及實際工程。這些書并不是C++軟體開發的全部,但是他們很重要。閱讀這些書,未必需要化費太多的精力,有時候是會困難,但也有時候會很快速。

最後,程式設計語言并非計算機科學技術的全部,尤其對于在校的學生來說,打好基礎、開闊視野都是非常重要的。

================================================================

c++書籍推薦

第一篇

一些同學問我,如何學好C++,我沒有别的辦法給你們,唯一的辦法就是讀書,讀大

量的書,就可以解決。要把C++作為日常語言,而不是一種程式語言,這樣就好辦了。

有人又要問我,那麼我應該讀什麼書才好?沒有時間怎麼辦?

我隻能對你們說,沒時間的話,就别學C++了,做你們喜歡做的事。生活中沒有

C++,也同樣美好。

如果你準備學,一定要學好,那麼我開個書單,應該問題不是甚大。

首先肯定要讀一讀Bjarne Stroustrup的The Design and Evolution of C++,了解

一下這個語言的曆史。接下來就可以看别的書了,但要不停地回頭看這本書,看到

你不斷地學到的新技術是怎麼樣一點點地被接納到這個語言中去的。

第一本書因人而異,基礎好一些的,可以看Stanley B. Lippman的C++ Primer,這

本書非常地巨大,你打星号的部分可以不要看。基礎不太好的,可以看Stanley B.

Lippman的Essential C++,這本書份量要輕得多,不過四個C++的範型都講了,而

且講得非常清楚。

第二本應該停止技術層面的東西,靜下心來看看Pike和Kernighan的The Practice

of Programming,好好地整理一下,在程式設計中應該有哪些注意的事項。這本

非常薄的booklet,可以說是程式員必讀的指南。

第三本書,就應該是Bruce Eckel寫的、候捷譯的Thinking in C++,這本書每過

半年我就要重讀一遍。可以說每一章都是寫得發人深省的,這本書讓我感覺到了

技術運用的非常高的境界,但是語言非常平實,隻要認真地讀,即使基礎不行,

也一定可以懂。我在教課的時候,就是用這本書(面對的學生是零基礎)。 

要更上一層的話,就要慢一步,先要把握C++設計習慣的良好。這是Scott

Meyers的Effective C++和More Effective C++帶給我們的無盡收益。我More

Effective C++買不起,隻好花了10塊錢影印裝訂了一本"線裝本",看起來像葵花

寶典(;-))。這兩本書是真正的經典,作者對C++的純熟,使得語言的風格讀起來

簡直是如饴甘甜,就像他站在對面在講課。我手中有這兩本書的原版CD,如果有興

趣,可以發E-mail到[email protected]或在飲水思源投條兒給gaobo索要,隻要您提供

CD光牒我就給免費燒。如果你已經深刻地了解了Effective C++和More Effective

C++,那你可以發現,你在衆人中已經是雞群之鶴。可以指導項目運作了,可以編

寫一切你想做的程式了,可以指出别人看起來不錯的代碼的大小問題了。如果你能

一眼看出有人的代碼是對應于"條款27"或"條款M6",那你可真是讓本人刮目了。

我已經講了,如果要寫程式,EC++和MEC++的境界已經足以使你自如應付,可是如

果你還不滿足,想關注一些理論層面的問題,或是想看看實作的代碼,你就不應該

錯過這幾本好極了的書。我是說Herb Sutter的Exceptional C++和More

Exceptional C++,這兩本書的難度是非常大的,我對每一條的閱讀筆記都是十多

頁。特别是泛型程式設計的部分,這兩本書旁征博引,極盡深入探讨之能事,每每

看懂一條,都抹汗一次,大感酣暢淋漓;還有侯捷的 STL源碼剖析 ,以實際的

例子一點點地講解一個STL是怎麼樣實作的,我是剛開始讀,不發表評論;而

Stanley B. Lippman,Cfront的實作者之一,執筆寫出Inside the C++ Object

Model,我隻有一個字,就是基本帥呆了。我從中了解了無數的編譯器解釋源代碼

的細節,以及記憶體配置設定的細節,呵呵,這些都知道了,我還怕什麼呢?最近得到

了另一Cfront實作者、C++标準委員會Koenig的 C++沉思錄,看起來非常不錯,這

裡也推薦給大家,但我也沒看完,亦無發言權。 

最後最後,你們,未來的C++理論家們,可要記住,Bjarne Stroustrup的The C++ 

Programming Language無論如何也應該讀個四五遍!這是一切C++的書本的源泉。

如果還覺得不夠,就向C++标準委員會訂購一本C++标準。 

一切中國大陸作者的書,一概不要看(包括我的)。一切VC++或講特定的編譯器的

書,一概不要看。如果需要補C語言的課,買一本非常小的K&R的The C

Programming Language足矣,其它的書一概不要看。不要先學C,再學C++,而要直

接學C++。你不是先學古文,再學白話的,對不對?是以相信我,直接來更容易。

以上文字,皆為原創,本人願意為每個字負責。

第二篇

好久未來C闆了,原因這段時間一直在研究兩本書,看得自己不敢多說一句話。

1、《Effective STL》

訂購:http://www.cnforyou.com/query/bookdetail.asp?viBookCode=8537

作者:Scott Meyers

出版社:中國電力出版社

  一開始欺負這本書比較薄,想快點看完,但不久就發現自己已經翻不動了。直

到看完最後一個字,才發現一個基本的事實:薄的不是這本書,而是自己的見識。

  有關STL的書也讀了不少,正如讀《Effective C++》以前,有關C++的書也讀了

不少。Meyers的書總是給人一種脫胎換骨的提升感覺,他總能在大家以為老生常談

的地方挖出意想不到的新意,并指出一些一般人習以為常的東西其實存在種種危機,

或是在一些看來完全等價的選擇中,為特定的場合選擇最有效的(Most

Effective)那一種。而且他的切入口總是讓人看得懂的(不像Stroustrup的書,

第一句話就要琢磨半天),但是他總是會選擇幾個拓展點,并把它們分析得淋漓盡

緻,這時候就需要一段代碼一段代碼甚至是語句粒度地閱讀了——當然,最後總是

看得懂,這和讀者的閱讀程度總是正比,這會給人極大的成就感。可以說,在STL

實踐的書籍,無書可出其右(當然在STL實作方面,我還是要向大家推薦侯捷的

《STL源碼剖析》)。

  讀完這本書後,和Pascal就産生明顯的距離感了。這裡我仍然要說:請熱愛

Delphi!我還是更願意寫“var s:set of char;”而不是

“set <char*, less<char*>, allocator<char*> > s”,;-)。

2、《Modern C++ Design》

訂購(中文):http://www.cnforyou.com/query/bookdetail.asp?viBookCode=8184

訂購(影印):http://www.cnforyou.com/query/bookdetail.asp?viBookCode=8319

作者:Andrei Alexandrescu

譯者:侯捷、於春景

出版社:華中科技大學出版社(中文)

    中國電力出版社(影印)

  讀完這本書的第一頁,我就知道自己放不下它了,但我也知道,我的苦難經曆

又要多上一筆了。用C++實作設計模式,已經是骨灰級的難度,但這本書明顯還在講

一個template的對象模型的問題,這在我讀《Inside the C++ Object Model》時是

屢攻不下的難點。不過,出乎意料的是這本書居然使我具有一些概念了,而且動手寫

出了一個SmartPointer。

  這本書我還遠不能說我讀懂了,但是确乎是讀完了。如果你還沒有讀過對象模型

和設計模式的書,我認為需要讀一讀。否則,直接看這本書根本就是受罪。最近,有

一些朋友也注意到設計模式的重要性了,可能從明年起我在《電腦報》上要發表一些

文章,屆時請朋友們指教吧。

另外就是Effective C++點評繼續寫,我現在覺得更惶恐,但是信心也更足了。

c++

繼續閱讀