(一)我現(xiàn)在理解的C++
種種原因,很多精力要投入到j(luò)ava的學(xué)習(xí)和使用中去了,想形成一個學(xué)習(xí)C++的系列文章,沒有什么風(fēng)格,也沒有什么時間表,想到哪就去寫。這里把以前自己另外一個ID發(fā)表的一篇文章的一部分作為這個系列的第一篇,算是開頭吧。
學(xué)習(xí)C++重在理解其各種語言設(shè)施所代表的語義,以及C++所能表示的語義所代表的設(shè)計思想。首先從宏觀上入手,你需要明白的是C++是程序設(shè)計語言的本質(zhì)。在此我把C++最重要的性質(zhì)寫下來:C++是一門靜態(tài)類型檢查,基于C內(nèi)存模式,支持四種基本程序設(shè)計范型的語言。注意,這里說明了三個本質(zhì)特性,靜態(tài)說明了語言的類型檢查性質(zhì),基于C內(nèi)存模式告訴我們在C++中所有與內(nèi)存有關(guān)的操作都需要程序員自己來負責,這樣就帶來了很多設(shè)計程序時的需要注意的地方,而理解支持的四種基本范型卻是理解各種語言設(shè)施的基礎(chǔ)。然后記住C++的最大的一點設(shè)計哲學(xué),也是其貫穿應(yīng)用C++的一條本質(zhì),我引用《C++ PRIMER》中文版前言內(nèi)的一句話表示--“C++的基礎(chǔ)是各種設(shè)施,它們讓用戶能夠通過定義新的數(shù)據(jù)類型來擴展語言本身,這些新類型可以與內(nèi)置類型一樣的使用方式(如何理解這句話是關(guān)鍵,我的理解是:用戶定義類型可以在任何使用內(nèi)置類型的時候做為其替代,再具體點說就是用戶定義類型可以象內(nèi)置類型那樣可以被聲明,其對象可以被初始化,可以相互復(fù)制,可以象內(nèi)置類型對象那樣和很多操作符一起使用,可以被作為參數(shù)傳遞給函數(shù),可以作為函數(shù)的返回值,可以作為容器的操作對象,用戶定義類型可以和內(nèi)置類型一樣作為模板的參數(shù)),掌握這些設(shè)施(哪些設(shè)施?就是讓用戶定義類型可以和內(nèi)置類型一樣方便使用的設(shè)施,包括什么?構(gòu)造,拷貝,解構(gòu)函數(shù),操作副重載.....)的第一步就是理解基本語言(什么是基本語言?就是C++中better c部分)。
在此,我還想提出一點十分重要的概念:一門語言的最本質(zhì)的東西就是其類型系統(tǒng),任何語言都有自己的獨特的類型系統(tǒng),學(xué)習(xí)C++就是學(xué)習(xí)他的類型系統(tǒng)。所以首先需要徹底明白什么是數(shù)據(jù)類型這個概念。這樣你的思路就清楚了,你有選擇,從每一種C++支持的設(shè)計范型入手學(xué)習(xí)。
結(jié)構(gòu)化設(shè)計-----也就是C++中的better c部分,你需要在C的基礎(chǔ)上學(xué)會函數(shù)重載和引用這兩個最重要的語言新特心性。
基于對象----你需要建立C++最強大的概念--類,也就是用戶定義類型,這其實就是數(shù)據(jù)結(jié)構(gòu)里面接觸的抽象數(shù)據(jù)類型的概念,以及合理構(gòu)造使用類的一系列語言措施。并始終記住,在C++進行設(shè)計時用類來表示我們需要表示的概念。類也是C++抽象機制里面最核心的概念。
面向?qū)ο?---在這里你需要知道繼承和多態(tài)這樣的OO概念,以及句柄類這樣常見的設(shè)計技術(shù),這里你需要明白你開始進入了對接口編程的階段。同時你要學(xué)會OO思想,C++的一些設(shè)施只是為了把OO思想在語言所支持的語義中充分的表示出來。但是在這里,同時你需要明白的C++能表示的語義是受到其當初語言設(shè)計原則限制的(什么原則?靜態(tài)類型檢查,不為不需要的東西付出代價,選擇權(quán)在程序員手上語言本身不去強迫程序員的做出選擇),也就是說C++所能表示的OO思想可以稱為具有C++特色的OO思想了。這樣的OO思想和JAVA所代表的純OO哪個更好?沒有定論,因為他們本身的設(shè)計理念就不一樣。
泛型設(shè)計----這里你需要明白最重要的一點是C++的temlate機制無論其開始建立的初衷是什么,現(xiàn)在他所代表的真實含義是:編譯時類型推導(dǎo),也就是編譯時多態(tài),由此明白了泛型的核心---把各種類型當作一種抽象條件的具體化,C++有措施可以定義抽象條件嗎?沒有,所以這些條件只能定義在我們自己的心中,但我們可以把具體化的類型當作一種抽象條件實現(xiàn)在template機制中去,從而使tempalte成為比類型推導(dǎo)機制更進一步的東西,那就是抽象條件的推導(dǎo)。也就是說,我們不再把template接受的參數(shù)看成是類型,而是把template看成是一種接受抽象條件的機制,無論其類型如何,只要這種類型滿足tempalte所接受的抽象條件就可以作為參數(shù)傳遞進去,這樣就代表了一種泛型的思想-----類型不再是根本,抽象條件才是,類型不過是抽象條件的外衣和在C++中的實現(xiàn)方式而已。在結(jié)合基于對象和泛型設(shè)計這兩種抽象設(shè)計模式的技術(shù)上誕生的工業(yè)產(chǎn)品就是---STL。
(二)書的誘惑
《C++程序設(shè)計語言》:如果你只買一本C++書,這本就是你的選擇,作者Bjarne就是讓你做出這樣選擇的全部理由,沒有人能比他更了解什么樣才是真正的使用C++編程了,有人說到這本書語言晦澀,或者對與初學(xué)者此書不適合,對此評論我頗不以為然,我看的是中文版,起碼在我看來語言描敘非常到位,我喜歡這樣的技術(shù)描敘風(fēng)格。全書的核心就是告訴你如何去用正確的觀念編寫正確的C++的代碼。強烈推薦。
《C++語言設(shè)計與演化》:這本書也是我同時擁有中英兩版的兩本書之一(另外一本是《設(shè)計模式》)。如果在得到上面的那本書之后你需要第二本,那么在我看來這就是你的選擇,作者同樣是Bjarne,他將在這本書中告訴你C++的起源與發(fā)展,語言原則與本質(zhì),各種特性加入的理由和考量,以及幾乎一切關(guān)于C++有趣的故事。我閱讀過中英兩版,都是強烈推薦。
《C++標準程序庫》:在AMAZON上面關(guān)于C++書籍評論最為火暴的一本。全書對于標準程序庫的介紹可謂深入淺出,而且全書都是從實際運用出發(fā),書中例子簡單卻非常說明問題,加上一些圖表的陳列,使其概念十分清晰,而且從手冊和學(xué)習(xí)兩方面看都有其存在價值。強烈推薦。
《EFFECTIVE C++ 中文版》:無須多說,在任何C++書籍推薦目錄中都可以找到這本書的身影,盛名之下必無虛士。主要強調(diào)的是運用C++的各種特性的時候所必須注意的地方,以及一些比較通用的設(shè)計手段。其短小精悍的語言自然非常適合快節(jié)奏的現(xiàn)代風(fēng)格,個人就十分喜歡Meyer的寫作方式。強烈推薦。
《MORE EFFECTIVE C++ 中文版》:做為上本書的姐妹篇,一樣的寫作風(fēng)格,一樣的寫作目的。只是個人認為和其姐姐相比,存在差距,主要是信息量沒有《EFFECTIVE C++ 中文版》那么大,主要說到了一些C++的設(shè)計慣用手法。推薦。
《C++ PRIMER 中文版》:同樣是出自大師之手,作者LIPPMAN,作為早期C++編譯器的實現(xiàn)者之一,對與C++的了解以及該如何論序都有自己的獨到見解。做為C++的百科全書和《C++程序設(shè)計語言》有著一樣的地位。但是前者更強調(diào)的是C++的語法和其語義,而后者則是以如何用C++進行合理設(shè)計做為描敘的中心。全書構(gòu)思十分巧妙,書的一開始就直接進入C++的主題,前面五章都用類設(shè)計一個數(shù)據(jù)結(jié)構(gòu),讓讀者完全明白了各種用戶定義類型所代表的抽象能力,然后直接進入第六章標準庫中的容器類,這樣的設(shè)計讓讀者十分清楚的建立容器和類這兩個C++中十分重要的概念。這樣的設(shè)計針對有一定基礎(chǔ)的C++讀者來說可以說是非常有效果的。但是對于初學(xué)者來說,這確實不是一本合適的書籍,因為一上來太多的名詞會把剛剛接觸C++的人嚇著的。推薦。
《C++沉思錄》:非常有特點的一本書,全書假設(shè)讀者已經(jīng)通曉C++語言,重點告訴讀者C++的概念以及一些C++的設(shè)計手段,比如用C++到底為什么會比C或者其他過程語言更好?(書中給出的答案是,因為只有對象才有能力保持一定的狀態(tài),而算法沒有這樣的能力),如何進行抽象數(shù)據(jù)類型的程序設(shè)計,如何理解多態(tài),如何通過代理隱藏繼承,如何進行引用技數(shù),為了效率如何進行緩時拷貝,以及模板技術(shù)是如何發(fā)展演進最后構(gòu)成成STL庫的。閱讀感覺和《C++程序設(shè)計語言》一樣,思想性非常強,讀這樣的書很累,腦子必須一直思考問題,思考作者里面提出的問題和他提出的解決方式。這本書最大的特點是非常直接的把C++語言的核心暴露出來-----三種抽象模型和極其語言設(shè)施本身對這三種抽象模型的支持。而《C++沉思錄》給我的更深層思考是什么才是運用C++最合理的方式。推薦。
《C++ STL中文版》:很樸實,不花俏,但是價值很高。個人認為其主要價值體現(xiàn)在以下幾個方面:1,對于STL的實現(xiàn)關(guān)鍵iterator一般都使用了兩種方式描敘,一種比較老式的函數(shù)方法,一種是新的?traits技巧,這樣讀者可以非常清楚的知道技術(shù)的演進。2,提供了一個STL LITE版本,閱讀這樣的代碼對自己的提高非常大。3,書中提供的測試模塊對于讀者來說也是非常有的一章,對于想擴展STL的,可以按照上面提供的方法測試自己的STL組件。缺點:裝訂比較粗糙,與大師之作的地位不相稱。推薦
《C++ PRIMER PLUS 中文版》:一本思想性不是很強,技巧性不是很強的書,但是對于初學(xué)者來說非常合適的書。其中許多論序方式都和具體化,總體來說,這本書是我看過的C++書籍里面最合適初學(xué)者的。推薦。
《深度探索C++對象模型》:這也是一本比較特別的書,告訴你編譯器是如何安排處理對象的內(nèi)存空間的,以及一些OO特性是如何實現(xiàn)的。不認為這是一本C++必須讀物,算是課后讀物應(yīng)該比較合適吧,因為有時間了解C++的OO實現(xiàn)還不如花點時間搞清楚OO理論的本質(zhì)概念:type theory。推薦。
《C++設(shè)計新思維——泛型編程與設(shè)計模式之應(yīng)用》:可謂C++中的奇書。這樣的一本書,很難讓人做出正確的評價與推薦指數(shù)(尤其是以我這個實用和人生本就應(yīng)該享樂為人生觀的人來說~:),因為全書所代表的思想前衛(wèi)到了有點不切實際的地步,模式+泛型—多么高雅的組合。我個人的觀點是,只有一部分人需要閱讀此書,他們就是所謂的real c++ fans,暫且不提C++本身是否遇到了困難,就其書中所代表的設(shè)計思想,對于C++沒有一點感情的程序員(感情就是以愛好為基礎(chǔ),而不是以攢錢為前提),我想對于這樣的設(shè)計技術(shù)總會有暈的感覺,而一般程序員多半都不會喜歡這樣的感覺~:)。推薦。
《對象揭秘:Java、Eiffel和C++》:從書名就可以看出這本書不僅僅和C++有關(guān)系??梢哉f全書就是對C++的一次批判吧(書也起源與作者的一篇批判C++的文章)。有時候聽聽另外一種聲音對自己保持清醒的頭腦是非常有幫助的,對待一個人,對待一本書以及對待一門程序設(shè)計語言都是如此。這本書好象不是很火,大概跟其宣傳不是很到位,或者同能同時了解這三門語言并比較關(guān)心這些語言深層次的優(yōu)略的讀者比較少有關(guān)系吧,在我看來這本書包含了許多對象與類型方面的理論,最為出彩的就是作者抓住Bjarne的“在C++中一個類就是一個類型”這樣的“錯誤”言論狠批的論證過程??催@本書另外一個好處是能教會大家該如何去合理的辯駁自己的對手~:)。推薦。
《大規(guī)模C++程序設(shè)計》:書在手上很久了,可一直沒有仔細看,這也是評論之前必須說明的??傮w看來書中涉及的很多東西都鮮見于其他讀本。不管AMAZON上的評論是否是這本書比較過時,起碼它介紹的許多對與我來說都是我所不知道不了解的,別人說過時是他的事情。而我,還是推薦。
《STL和泛型編程》:難得的一本關(guān)于泛型編程的理念書籍,同樣也是作為手冊和學(xué)習(xí)兩用,但是其手冊不是使用手冊,而是概念手冊,對于設(shè)計自己的STL組件,這本書有非常好的幫助,雖然網(wǎng)上有篇STL的文檔,其中的70%內(nèi)容和這本書雷同,但此書仍不失可讀性。推薦。
《C++編程思想 第二版》:非常一般的書,是的這就是我對這本很多人奉為名著的評論,至于為什么是這樣的評論,或者你不相信我說的是客觀話,在你買了之后看完就知道了。一般。
《Essential C++中文版》:總感覺這本書定位不是很清楚,因為對于初學(xué)者來說其開始就涉及了太多的名詞,初學(xué)者看這本書,幾乎就不要指望能很好的入門。而對于進階者來說,其內(nèi)容并無新意,對于C++高手來說,這樣的小讀本,根本就沒有閱讀的必要,也許是LIPPMAN+JJHOU的盛名吧,但我覺得這次算是有虛士了~:)。一般。
《STL源碼剖析》:侯SIR的大陸兩本著作之一,但在我心中其質(zhì)量好象并不如很多人說的那樣好,就同類作品《C++ STL中文版》相比較內(nèi)容略現(xiàn)單薄,并且三章之后很多東西都給人以堆砌的感覺,而且大部分精彩的材料都出自《STL和泛型編程》一書,給人感覺書中侯SIR自己的東西并不多,但第二章對于內(nèi)存管理有很好的論敘表現(xiàn),并且裝訂精良,尤其是那些圖更是侯SIR的拿手好戲,但總體感覺有點華而不實。一般。
后面列出兩本不推薦的,具體原因也就不再分析。
《高質(zhì)量程序設(shè)計指南--C++/C語言》,《C++編碼規(guī)范》
另外兩本常見的C++書籍:
《Exceptional C++中文版》,《More Exceptional C++中文版》我本人并沒有閱讀過,但其名聲不小,而且加之曾經(jīng)給此書作者Herb Sutter通郵件的經(jīng)歷,那種考慮到時差都不到24個小時的回信率以及在信中耐心的對技術(shù)講解的態(tài)度,同樣向大家推薦這兩本書,因為在我看來Herb Sutter能力無須考慮加上這樣待人的態(tài)度,其作品理所值得大家閱讀。
是的,上面就是我大半年來看過的C++的書籍,肯定不少人要嘲笑我的個書呆子了~:),其實我確實就是一個書呆子,至于是否需要看這么多書,我個人意見是不需要,不然我還給出推薦等級干什么?選擇自己需要的就是最好。引用曾經(jīng)有人說到的---評書其實就是個“如人飲水,冷暖自知”的事情。真正的書評在哪里?各自的心里。