我從去年11月份開(kāi)始自學(xué)C++(本人現(xiàn)在做C#開(kāi)發(fā)),現(xiàn)在把我這10來(lái)個(gè)月學(xué)習(xí)體會(huì)寫(xiě)出來(lái)和大家分享。
1。關(guān)于要不要學(xué)習(xí)C++?(結(jié)論:要學(xué),一定要學(xué)!)
如今在網(wǎng)上很多為要不要學(xué)C++爭(zhēng)的不可開(kāi)交,因?yàn)楝F(xiàn)在JAVA,C#,。NET都炒的很火,特別是JAVA,大有炸平廬山,停止地球轉(zhuǎn)動(dòng)之勢(shì)。用林銳同志的話說(shuō),其實(shí)JAVA只是C++外甥,跑到舅舅身上撒了一泡尿而已。首先,我們從JAVA 的來(lái)歷上來(lái)說(shuō),JAVA的設(shè)計(jì)初衷是用來(lái)給家用電器設(shè)計(jì)程序使用的,最初設(shè)計(jì)者想用C++,但覺(jué)得C++太復(fù)雜,就在C++的基礎(chǔ)上做了一些簡(jiǎn)化,設(shè)計(jì)出了JAVA,它的設(shè)計(jì)思想是跨平臺(tái),所以必須先在運(yùn)行平臺(tái)上安裝虛擬機(jī),然后把源程序編譯成中間語(yǔ)言在運(yùn)行。這是一個(gè)優(yōu)點(diǎn),但我們說(shuō)任意優(yōu)點(diǎn)都是建立在缺點(diǎn)上的,JAVA的缺點(diǎn)就是運(yùn)行速度慢,這對(duì)于某些系統(tǒng)來(lái)說(shuō)是致命弱點(diǎn)。況且,JAVA中沒(méi)有指針,對(duì)于制作系統(tǒng)軟件來(lái)說(shuō),這更是無(wú)法饒恕的。再來(lái)看C++。C++產(chǎn)生于美國(guó)貝爾實(shí)驗(yàn)室,就是發(fā)明電話那個(gè)公司。設(shè)計(jì)初衷是用來(lái)改進(jìn)C的開(kāi)發(fā)效率,C是面向過(guò)程的語(yǔ)言,開(kāi)發(fā)效率底,貝爾實(shí)驗(yàn)室有大量的C程序員,所以只要在開(kāi)發(fā)效率上提高一點(diǎn)點(diǎn),就可以節(jié)約數(shù)目龐大的成本。C是什么東西?是用來(lái)代替匯編編寫(xiě)操作系統(tǒng)的語(yǔ)言,用C++代替C,可以得出兩個(gè)結(jié)論:第一,C++必須具有同C相當(dāng)?shù)膱?zhí)行速度;第二,C++必須比C具有較高的開(kāi)發(fā)效率。執(zhí)行速度方面,C++的設(shè)計(jì)者的思想就是在改進(jìn)開(kāi)發(fā)效率的同時(shí)盡量不增加C++的系統(tǒng)開(kāi)銷(xiāo),當(dāng)然有些地方非增加開(kāi)銷(xiāo)不可,也把開(kāi)銷(xiāo)控制在最小程度內(nèi)。具非權(quán)威研究報(bào)告,C++比C的執(zhí)行開(kāi)銷(xiāo)多出不到10%。開(kāi)發(fā)效率方面,C++引進(jìn)了面向?qū)ο髾C(jī)制,庫(kù)機(jī)制,最大程度上實(shí)現(xiàn)了代碼重用,這是軟件開(kāi)發(fā)人員的福音。C++在改進(jìn)C的開(kāi)發(fā)效率的同時(shí),對(duì)C的缺陷做了一些修補(bǔ)。C的優(yōu)點(diǎn)在C++中都得到了很好的保留,C的缺點(diǎn)在C++中都有了改進(jìn),有了更好的解決辦法。而且,為了現(xiàn)有的大量C程序維護(hù),C++還全面兼容了C。縱觀當(dāng)今程序語(yǔ)言家族,我覺(jué)得只有C可以C++相提并論,門(mén)當(dāng)戶對(duì),其它語(yǔ)言都無(wú)法和C++相提并論。無(wú)論從什么角度來(lái)說(shuō),C++都算的上語(yǔ)言中的老大。
如今,網(wǎng)上有很多關(guān)于C++的爭(zhēng)論,其實(shí)爭(zhēng)論的人都是一些不知情的人,絕大多數(shù)是學(xué)校里的學(xué)生,我也曾經(jīng)這樣。在學(xué)校里的時(shí)候,不知道究竟應(yīng)該學(xué)習(xí)什么,要是遇到好的老師還可以,遇到垃圾老師,垃圾學(xué)校那就更糟糕。如今,什么MCSE,CCNA,CIW等等認(rèn)證漫天飛,把人搞的昏頭昏腦,其實(shí)這都是認(rèn)證公司炒的。社會(huì)上需要的是有真才實(shí)學(xué)的人,而不是需要證書(shū)。
我從大二開(kāi)始學(xué)習(xí)編程,一開(kāi)始學(xué)習(xí)VB,后來(lái)學(xué)習(xí)DELPHI,再后來(lái)學(xué)習(xí)C#,再后來(lái)學(xué)習(xí)C++,繞了個(gè)大圈子,最后還是繞回來(lái)了。而且重新學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu),操作系統(tǒng),學(xué)習(xí)軟件工程,學(xué)習(xí)大學(xué)本科的基本課程,重新讀外國(guó)的程序設(shè)計(jì)名著,而這些以前在大學(xué)是不屑一顧的。勸如今還在學(xué)校的師弟師妹們,努力學(xué)習(xí)C++。
2。為什么要學(xué)習(xí)學(xué)習(xí)C++
1)C++的程序員身價(jià)普遍較高,當(dāng)然,前提是你必須是高手。我所在的城市,那些公司根本就招不到合格的C++程序員,一方面C++程序員要求高,學(xué)習(xí)C++的人越來(lái)越少了。當(dāng)然,懷著這個(gè)目的,你或許永遠(yuǎn)無(wú)法成為C++高手,但我把這個(gè)原因放在最前面,可以給大家一個(gè)很明確的激勵(lì),當(dāng)你接觸C++后,發(fā)現(xiàn)從學(xué)習(xí)中獲得樂(lè)趣比高的工資更有動(dòng)力;
2)C++的優(yōu)勢(shì)是用來(lái)開(kāi)發(fā)大型軟件,從中可以學(xué)到很多優(yōu)秀的軟件設(shè)計(jì)思想。C++不是軟件開(kāi)發(fā)的首選工具,一般說(shuō)來(lái),大多人更愿意學(xué)習(xí)和使用VB,為什么,簡(jiǎn)單。簡(jiǎn)單的另一個(gè)方面是功能的局限。微軟公司恨不的所有人都學(xué)VB,只有他一家會(huì)C++。容易上手,大家都喜歡學(xué),喜歡用,很多人拿一本200頁(yè)的書(shū),看個(gè)兩三個(gè)星期,就覺(jué)得自己是個(gè)程序員了,可以開(kāi)發(fā)軟件了,而且覺(jué)得做出來(lái)的東西很不錯(cuò)。當(dāng)軟件規(guī)模大到一定程度的時(shí)候,其他語(yǔ)言就越來(lái)越無(wú)法駕馭,這時(shí)C++的優(yōu)勢(shì)就體現(xiàn)出來(lái)了。你說(shuō)做個(gè)成績(jī)管理系統(tǒng),人事查詢系統(tǒng),用VB,DELPHI,C#,JAVA都行,但是例如銀行,電信,保險(xiǎn),操作系統(tǒng),數(shù)據(jù)倉(cāng)庫(kù),圖形處理,編譯系統(tǒng),較底層的軟件時(shí),其他工具幾乎是無(wú)法完成的。就說(shuō)C++的指針,JAVA沒(méi)有,在遇到數(shù)據(jù)量交大的數(shù)據(jù)排序,搜索,動(dòng)態(tài)內(nèi)存分配時(shí),它就沒(méi)有辦法了。所以說(shuō),學(xué)習(xí)C++,不僅僅是學(xué)到的一種語(yǔ)言,還學(xué)習(xí)了優(yōu)秀的軟件設(shè)計(jì)思想。
3)學(xué)習(xí)C++可以學(xué)習(xí)到計(jì)算機(jī)底層的理論,即使不是用C++開(kāi)發(fā),對(duì)計(jì)算機(jī)運(yùn)行機(jī)制的理解,對(duì)建制穩(wěn)定的系統(tǒng),對(duì)運(yùn)用其他語(yǔ)言,也是一種促進(jìn)。這一點(diǎn),我是在學(xué)習(xí)過(guò)程中體會(huì)到的,所以,要說(shuō)出個(gè)大家可以接受的理由來(lái)較難,大家以后學(xué)習(xí)就知道了。
3。怎樣學(xué)習(xí)C++?
首先,我們必須承認(rèn),學(xué)習(xí)要講究方法,有捷徑。其次,我們還得承認(rèn),學(xué)習(xí)要下苦功,要?jiǎng)?wù)實(shí)。上小學(xué)的時(shí)候,書(shū)上有個(gè)故事,是關(guān)于王羲之學(xué)習(xí)書(shū)法的:王獻(xiàn)之問(wèn)他父親王羲之,學(xué)習(xí)書(shū)法的秘訣是什么,他父親把他帶到后院,指著18口大水缸說(shuō),你如果把這里的水都寫(xiě)完了,就知道書(shū)法的秘訣在那里了。這個(gè)故事相信很多人都還記得。前幾天看梁肇新(豪杰公司老板)的《高手箴言》,他說(shuō)如果你如果愿意利用5年時(shí)間來(lái)成為高手,那么你只要兩三年就會(huì)成為高手,如果你想一年成為高手,那么你5年也成不了高手。學(xué)習(xí)要切忌浮躁,要腳踏實(shí)地。我曾經(jīng)很浮躁,結(jié)果一直呆在菜鳥(niǎo)堆里,當(dāng)半年前我靜下心來(lái)學(xué)習(xí)C++,才感覺(jué)有真正的進(jìn)步。現(xiàn)在做WEB開(kāi)發(fā),雖然我從來(lái)不看WEB開(kāi)發(fā)的書(shū),但是我的同事遇到問(wèn)題時(shí),我經(jīng)常能一下說(shuō)出問(wèn)題的所在。因?yàn)槟憧磫?wèn)題的角度變了。所以,學(xué)習(xí)C++的第一個(gè)方法是:切忌浮躁。其實(shí)學(xué)任何東西都一樣,欲速則不達(dá)。從基本數(shù)據(jù)類(lèi)型看起,從基本流程控制語(yǔ)句寫(xiě)起。
其次,教材很重要,要看經(jīng)典名著。
其次,教材很重要,要看經(jīng)典名著,而且如果英語(yǔ)好,最好看原版英文教材。
經(jīng)典之所以成為經(jīng)典,是因?yàn)榻?jīng)歷了考驗(yàn)沉淀下來(lái)的東西。去年9月份,當(dāng)我打算轉(zhuǎn)向C++的時(shí)候,曾向我一位同事咨詢,他向我推薦了《C++編程思想》,還說(shuō)叫我一定要讀。當(dāng)我讀完前面三到四章的時(shí)候,就發(fā)覺(jué)自己找到了感覺(jué)。接下來(lái),我一口氣讀完了整本書(shū),當(dāng)然其中很多東西還是無(wú)法真正理解,這是一本很深邃的書(shū)。廢話少說(shuō),我現(xiàn)在把我自己看過(guò)的C++參考書(shū)籍列出來(lái):
1)《C++入門(mén)經(jīng)典》,原名《The C++ Language Begeining》,作者Ivor Horton 此書(shū)淺顯易懂極適合入門(mén),書(shū)中包括最基本的程序設(shè)計(jì)知識(shí),例如基本數(shù)據(jù)類(lèi)型,流程控制語(yǔ)句,函數(shù)設(shè)計(jì)。即使沒(méi)有任何程序設(shè)計(jì)基礎(chǔ)的人,看著也不覺(jué)得累。書(shū)中一些很有特色的事例,能促進(jìn)和加深讀者的理解。但此書(shū)的代碼風(fēng)格實(shí)在有些糟糕。
2)《C++編程思想》,原名《Thinking in C++》,作者Bruce Eckell, 此書(shū)的名氣就不在這里說(shuō)了.此書(shū)最新版本(第三版)開(kāi)頭部分增加了幾章講C語(yǔ)言的部分,然后把讀者逐漸引向C++,在討論語(yǔ)言的一個(gè)特性時(shí),往往總是先講解在C中的解決方法,然后討論這中方法的局限和不足之處,再討論C++中的解決方法.據(jù)我的感受,此書(shū)作者的初衷是引導(dǎo)C程序員走向C++,但后來(lái)發(fā)現(xiàn)大多數(shù)新生代程序員,非美國(guó)的程序員不一定懂C,于是就在第三版中加入了介紹C的部分. 此書(shū)最大的特點(diǎn)是, 作者善于透過(guò)語(yǔ)言現(xiàn)象,看看屏風(fēng)后面究竟發(fā)生了什么(例如,顯示出生成的匯編語(yǔ)言).消化好這本書(shū),C++水平上一個(gè)大臺(tái)階;
3)《C++高效編程》,原名《Effect C++》。此書(shū)重點(diǎn)探討C++的一些技術(shù)死角,我只看過(guò)其中很少的一些章節(jié),在此不作過(guò)多評(píng)論;
4)《C++ Primer》,作者Stanley B.Lippman,此書(shū)還沒(méi)有讀過(guò),接下來(lái)讀這本書(shū)。我在網(wǎng)上找了一點(diǎn)對(duì)此書(shū)特點(diǎn)的描述:對(duì)C++基本概念和技術(shù)全面而且權(quán)威的闡述,對(duì)現(xiàn)代C++編程風(fēng)格的強(qiáng)調(diào),使本書(shū)成為C++初學(xué)者的最佳指南;對(duì)于中高級(jí)程序員,本書(shū)也是不可或缺的參考書(shū)。第4版不再?gòu)?qiáng)調(diào)低層編程技術(shù),而把中心轉(zhuǎn)向標(biāo)準(zhǔn)庫(kù)的使用。書(shū)中很早就開(kāi)始介紹標(biāo)準(zhǔn)庫(kù),示例也已經(jīng)重新改寫(xiě),充分利用了標(biāo)準(zhǔn)庫(kù)設(shè)施。我們也對(duì)語(yǔ)言主題敘述的先后次序進(jìn)行了重新編排,使講解更加流暢;
5)《C++編程語(yǔ)言》,原名《C++ Program Language》,作者乃C++的發(fā)明者被譽(yù)為C++之父的Bjarne Stroustrup,此書(shū)我只讀了一部分,說(shuō)實(shí)話,有些難。此書(shū)的作者就是C++的創(chuàng)始人,發(fā)明者,知識(shí)非常淵博,其思想深度遠(yuǎn)遠(yuǎn)在前面幾位之上。如果你想知道C++究竟能做什么,C++那些希奇古怪的特性為什么那樣設(shè)計(jì),那你就去參考這本書(shū)。另外,閱讀此書(shū)時(shí),你還會(huì)為作者那種深邃的思想,博大的胸懷感覺(jué)到一種發(fā)自內(nèi)的快樂(lè),舒暢。書(shū)中還講到了很多大型系統(tǒng)設(shè)計(jì)的方法和技巧。總之,不讀此書(shū),是作為程序員的一大遺憾。我建議先閱讀《C++編程思想》,再參考此書(shū)。因?yàn)椤禖++編程思想》的作者說(shuō),他寫(xiě)這本書(shū)的目的就是為了大家能夠參考《C++編程語(yǔ)言》這本書(shū);
6)《C++高質(zhì)量編程》,作者林銳。此書(shū)不屬于經(jīng)典名著,但我也比較推薦這本書(shū)。作者不象國(guó)內(nèi)其他作者那樣迂腐功利,而是從一個(gè)程序員的角度,介紹他在以往開(kāi)發(fā)過(guò)程中遇到的問(wèn)題和積累的經(jīng)驗(yàn),這本書(shū)很薄,但其中的思想方法很有用。且語(yǔ)句詼諧幽默,閱讀起來(lái)很輕松;
任何一本書(shū),都有他的可取之處;任何一本書(shū),都無(wú)法解決在學(xué)習(xí)中遇到的所有問(wèn)題;任何一本書(shū),都無(wú)法替代人的智慧和經(jīng)驗(yàn)。但是好的教材,可以起到好的指導(dǎo)效果,可以使學(xué)習(xí)少走彎路。但我不怎么建議看比較薄(600頁(yè)以下)的書(shū),因?yàn)閷?duì)于C++來(lái)說(shuō),這樣的篇幅根本就說(shuō)不清楚,也不建議看國(guó)內(nèi)作者的教材,你發(fā)現(xiàn)大多是從上面所說(shuō)的書(shū)中抄下來(lái)的。
4。C++和VC的區(qū)別
目前我們所說(shuō)的C++,通常意義上指標(biāo)準(zhǔn)C++,就是美國(guó)C++標(biāo)準(zhǔn)委員會(huì)發(fā)布的C++。它定義了一些基本的語(yǔ)言規(guī)范語(yǔ)言特性,定義了一個(gè)框架,還有一個(gè)標(biāo)準(zhǔn)庫(kù)。雖然產(chǎn)生于UNIX下,但它不屬于某一個(gè)平臺(tái),某一個(gè)廠商,某一個(gè)編譯器。它是一種統(tǒng)稱(chēng),一種概念。VC是微軟公司在WINDOWS平臺(tái)下的一種開(kāi)發(fā)工具,本質(zhì)上和VB,C#沒(méi)有什么區(qū)別,只是較之底層一些。VC支持標(biāo)準(zhǔn)C++,但不百分之百支持。一般來(lái)說(shuō),學(xué)習(xí)C++可以使用VC的編譯環(huán)境,但是必須要使用標(biāo)準(zhǔn)庫(kù)。還有其他一些C++編譯器例如C++ BUIDER,就是Borland公司生產(chǎn)的WINDOWS下的C++編譯器,GCC是LINUX下的常用的C++編譯器。估計(jì)在蘋(píng)果機(jī)下也有相應(yīng)的C++編譯器,因?yàn)镃++處理圖形系統(tǒng)是其特長(zhǎng)。
要學(xué)習(xí)C++,就不要從VC學(xué)起,學(xué)習(xí)VC無(wú)法學(xué)到真正的C++編程思想,而你只是學(xué)會(huì)了使用類(lèi)庫(kù)而已。C++的特性是什么?C++本質(zhì)是什么?C++的精華是什么?我覺(jué)得總結(jié)成一句話:利用面向?qū)ο蟮乃枷耄鉀Q大型系統(tǒng)的開(kāi)發(fā)問(wèn)題。
5。學(xué)習(xí)C++的重點(diǎn)
如果你學(xué)習(xí)過(guò)C或者了解C,那么在學(xué)習(xí)C++的時(shí)候更容易受C的影響,記住,C是面向過(guò)程的語(yǔ),C++是面向?qū)ο蟮恼Z(yǔ)言。如果你學(xué)習(xí)過(guò)C,那么學(xué)習(xí)C++的重點(diǎn)是掌握C++的新特性,C與C++的區(qū)別,C++的面向?qū)ο筇匦裕瑖L試用C++的風(fēng)格去編寫(xiě)程序,用C++的技術(shù)去解決問(wèn)題。或許你認(rèn)為C很不錯(cuò),但在C++可能有更好的解決辦法;
如果你學(xué)習(xí)過(guò)JAVA,C#或DELPHI,那么你應(yīng)該對(duì)面向?qū)ο髾C(jī)制很熟悉。但是,C++中的面向?qū)ο髾C(jī)制和上述幾種語(yǔ)言有所區(qū)別,例如多重繼承。最好嘗試在沒(méi)有用戶界面的環(huán)境下編寫(xiě)程序,還有,指針是C++的精華之一,所以必須掌握;
如果你沒(méi)有編程基礎(chǔ),那就直接從C++學(xué)起,這樣就沒(méi)有其他語(yǔ)言的干擾和影響。祝賀你,一開(kāi)始就接觸了這樣一種偉大的語(yǔ)言;
我覺(jué)得,C++的重點(diǎn)可以用三個(gè)詞來(lái)描述:指針,面向?qū)ο螅瑯?biāo)準(zhǔn)庫(kù)。
最后,在這里同所有學(xué)習(xí)C++的程序員共勉,不要擔(dān)心學(xué)習(xí)C++會(huì)被淘汰,我所在的單位還有大量的Informix程序員,而且日子過(guò)的很舒服。我小時(shí)候?qū)W書(shū)法,老師常對(duì)我說(shuō)一句話就是:字寫(xiě)的好,哪怕拿一根筷子在嘴巴里咬幾下,都寫(xiě)的好看,而不在于用什么筆。用C++之父Bjarne Stroustrup的話來(lái)說(shuō):只要你在使用電腦,你就直接或間接使用了C++。
讓我們共同學(xué)習(xí),共同進(jìn)步,相互交流,相互促進(jìn)。