怎么才能快速有效的學(xué)習(xí)c++
怎么才能快速有效的學(xué)習(xí)c++
C++儼然已成為一門貴族語言,成為了編程界最重要的語言之一。那么怎么才能快速有效的學(xué)習(xí)c++?以下是學(xué)習(xí)啦小編分享給大家的有效的學(xué)習(xí)c++的方法,希望可以幫到你!
有效的學(xué)習(xí)c++的方法
C++是最難的語言
這個(gè)世界上最難的編程語言可能非C++莫屬了。你千萬不要以為幾天就可以學(xué)好C++,C++的學(xué)習(xí)曲線是相當(dāng)BT的,你可以看看這篇文章。C++是一門很自由的語言,自由到了有點(diǎn)BT和恐怖的地步。我甚至認(rèn)為C++并不是一門成熟的編程語言,因?yàn)樘菀追稿e(cuò)了。所以,你一定要在一開始就要有很小心謹(jǐn)慎的態(tài)度,并把C++當(dāng)成一種難以訓(xùn)服的猛獸來看待。
多問“為什么要這樣”的問題
學(xué)習(xí)C++一定要多問幾個(gè)“為什么是這樣”,“憑什么要這樣”的問題。比如:很多人知道C++有拷貝構(gòu)造函數(shù)和初始化列表,但你真的知道為什么要有拷貝構(gòu)造函數(shù)?為什么要有初始化列表嗎?為什么要有template,為什么要有RTTI,為什么不是別的呢?難道就是為了讓一門語言變得Cool一些嗎?完全不是這樣的,C++中的任何一個(gè)feature都有些實(shí)實(shí)在在的原因,你一定要去了解為什么要把C++設(shè)計(jì)成這樣的原因,你才能學(xué)好C++。有空看看《C++演化和設(shè)計(jì)》一書。
看書,大量的C++書
你可以按如下先后順序閱讀
《C++ Primer》,這本初級(jí)讀本可能讓會(huì)你啃得很痛苦,所有的語言的特性和為什么都在里面了,好好讀讀。當(dāng)然由C++之父寫的《C++程序設(shè)計(jì)語言》也不錯(cuò)。兩本看一本就好了(我看的是前者)。
了解C++的語法僅僅是萬里長征的第一步,你還需要看看《Effective C++》和《More Effective C++》這兩本書并不厚,但我從02年就一直看到現(xiàn)在,每次讀我都有新的體會(huì),這兩本書太經(jīng)典了。如果你對(duì)C語言不熟,這兩本書會(huì)讓你回去補(bǔ)C語言的課。
Think in C++同樣是另一本經(jīng)典之極的書,學(xué)c++必讀,但是中文版的翻譯的很不好,所以還是去讀英文版的吧。
《C++沉思錄》同樣非常值得一讀,這里教的不是編程,而是思考的方法,這是相當(dāng)珍貴的。
《Exceptional C++》和《More Exceptional C++》讓你看看各種問題的解決方法和一些常見的經(jīng)典錯(cuò)誤。
《Advanced C++》和《Modern C++》可以讓你知道C++各種神奇的用法。
《泛型編程與STL》是把C++實(shí)踐到了極致的東西。很強(qiáng)大。STL——神一樣的模板庫(容器,算法和函數(shù)對(duì)象),不得不服。
《深入探索C++對(duì)象模型》讓你了解編譯器下的C++是什么樣的,讓你了解C++的性能并不差。這個(gè)對(duì)于C++的程序員太關(guān)鍵了。我以前寫過的《C++虛函數(shù)表解析》還有《C++對(duì)象內(nèi)存布局》屬于這個(gè)范疇。
和Java語言做對(duì)比
我個(gè)人以為Java對(duì)C++這個(gè)并不成熟的語言做了很多調(diào)整,規(guī)范和限制。所以,對(duì)比一下Java和C++,想一想,為什么一些東西在C++中可以做,但在Java中卻不行。比如:Java的異常是必需要catch的,不然就會(huì)編譯不通過。為什么Java不提供操作符重載?為什么Java會(huì)引入接口來做多重繼承?為什么Java沒有像C++那樣的I/O字符流?為什么Java不支持指針?為什么Java可以做到垃圾回收?等等。Java體現(xiàn)著很多面向?qū)ο笤O(shè)計(jì)的東西,學(xué)習(xí)Java有助于你學(xué)會(huì)怎么更好地使用C++來編程。
面向?qū)ο笤O(shè)計(jì)
雖然面向?qū)ο罂赡苁莻€(gè)騙局。但是我覺得面向?qū)ο笤O(shè)計(jì)中的一些實(shí)踐非常的不錯(cuò),比如,單一原則,依賴倒置原則,等等,都非常地經(jīng)典?!对O(shè)計(jì)模式》必需一讀,《面向?qū)ο蟮姆治龊驮O(shè)計(jì)》可以一讀。但不可以設(shè)計(jì)模式為中心來編程,而應(yīng)該是用設(shè)計(jì)模式來解藕。
類庫學(xué)習(xí)
看看MFC是怎么封裝Windows API的,看看ACE是怎么面向?qū)ο蟮?,看看boost是怎么玩面向?qū)ο蟮?,看看CPPUnit又是怎么設(shè)計(jì)的。當(dāng)然,Java的JDK中有太多的設(shè)計(jì)模式,可以參考。
C++11新語言
1.RAII和標(biāo)準(zhǔn)庫
以前學(xué)C和C++,在C/C++中的堆內(nèi)存的動(dòng)態(tài)分配,以往都是教條式的強(qiáng)調(diào)malloc/free、new/delete、new[]/delete[]一定要匹配使用!千萬不要忘記!而且不能free/delete多次!者雖然不是什么技術(shù)問題,但是人畢竟是人,難免不出錯(cuò)。而RAII的技巧,就是利用stack上的臨時(shí)對(duì)象生命期的性質(zhì),當(dāng)臨時(shí)對(duì)象超過作用域的時(shí)候析構(gòu)函數(shù)會(huì)被自動(dòng)調(diào)用,于是利用程序自動(dòng)管理的這一特點(diǎn),可以將資源的釋放操作封裝在一個(gè)臨時(shí)對(duì)象中自動(dòng)銷毀,改變以往的手動(dòng)申請(qǐng)和釋放的模式。在C++11中,幾乎絕大多數(shù)類型,通過一些技巧或者包裝,都可以保證其到達(dá)作用域結(jié)束的時(shí)候被正確的析構(gòu)掉,而且是異常安全的。所以理論上,通過C++11標(biāo)準(zhǔn)的程序,理想狀態(tài)下不需要new/delete方式來管理對(duì)象了,使用智能指針、智能鎖等工具重新組織你的工程,從資源管理的泥淖中解脫出來。
其次,據(jù)說C++新標(biāo)準(zhǔn)中有2/3的篇幅是關(guān)于容器和算法庫。當(dāng)然有人一直爭(zhēng)論這些容器和算法庫不應(yīng)當(dāng)作為一個(gè)語言的標(biāo)準(zhǔn)這種形式存在,否則語言的標(biāo)準(zhǔn)將會(huì)不斷的膨脹。但是作為實(shí)用主義來說,這些標(biāo)準(zhǔn)容器和標(biāo)準(zhǔn)庫的存在可以大大增加開發(fā)進(jìn)度,同時(shí)別人調(diào)試好的數(shù)據(jù)結(jié)構(gòu)和算法也更容易開發(fā)出穩(wěn)定的程序來。
2. Boost庫
前面說過,Boost庫算是C++標(biāo)準(zhǔn)的試驗(yàn)田,諸位C++大牛都會(huì)把特性想法在這里開發(fā),然后好的東西會(huì)被C++標(biāo)準(zhǔn)委員會(huì)吸納進(jìn)正式標(biāo)準(zhǔn),比如C++11中智能指針就是從Boost中引入的。但是如陳碩老師所言,Boost庫規(guī)模龐大,但也不能盲目盡信之,好的東西譬如如智能指針、noncopyable等可以直接用,免去自己制造垃圾輪子,而且可以借鑒取其實(shí)現(xiàn)思路和方法,以增長功力。但是也有些庫用到的技術(shù)晦澀難懂,和實(shí)際使用有所脫節(jié),而且可能效率很低。當(dāng)然這些甄別取舍也是門技術(shù),慚愧自己到達(dá)那份功力還路途遙遠(yuǎn)。
還有需要注意的是,很多的東西在Boost和C++11標(biāo)準(zhǔn)中都有一份,雖然大體功能相似,但是還是有些差異,比如:std::unique_ptr可以傳遞deleter函數(shù),但是boost::scoped_ptr卻不支持??磦€(gè)人感覺吧,但是建議不要混用,因?yàn)榧词箂td::shared_ptr和boost::shared_ptr等價(jià),但是函數(shù)調(diào)用參數(shù)卻不這么認(rèn)為。
3.編譯速度非常慢
C++的運(yùn)行速度不慢,但是由于現(xiàn)在的庫中引入了大量的模板類,而模板的解析、實(shí)例化、編譯等很很需要計(jì)算量。一個(gè)十來個(gè)文件的小項(xiàng)目在筆記本上要干一分多鐘,實(shí)在忍受不了。網(wǎng)上搜羅的解決方式有:
(1). PCH預(yù)編譯頭部
照網(wǎng)上的說法是建立一個(gè)頭文件xxx.hpp,包含在項(xiàng)目中常用穩(wěn)定的頭文件,然后編譯這個(gè)頭文件生成同名xxx.gch的預(yù)編譯頭結(jié)果,后續(xù)在項(xiàng)目中包含xxx.hpp就會(huì)直接使用xxx.gch預(yù)編譯結(jié)果,從而減少編譯時(shí)間。我照著做了,沒效果,在stackoverflow上面問了好久About g++ not working with pre-compiled headers pch,也沒人鳥我。
不知道是GCC的BUG還是我的姿勢(shì)不對(duì),后面試試Clang吧。我覺得這種預(yù)編譯頭還是挺有用的,如果有預(yù)編譯結(jié)果會(huì)得到優(yōu)化,如果沒有也能正常編譯,可惜這里暫時(shí)不能用。
(2). ccache緩沖
問了羅劍鋒,他說ccache應(yīng)該可以優(yōu)化編譯效率,不過我還沒試。
C++基礎(chǔ)到高級(jí)方法指南
C/C++入門階段
剛?cè)腴T的時(shí)候我們主要是學(xué)習(xí)培養(yǎng)編程思維和動(dòng)手能力,深刻理解面向過程和面向?qū)ο蟮乃枷敕椒?/p>
所以學(xué)習(xí)語言更為重要
C語言的學(xué)習(xí):
數(shù)據(jù)類型、變量、內(nèi)存布局、指針基礎(chǔ);字符串、一維數(shù)組、二維數(shù)組;一級(jí)指針,二級(jí)指針,三級(jí)指針,N級(jí)指針概念,指針數(shù)組和數(shù)組指針;結(jié)構(gòu)體、文件的使用;動(dòng)態(tài)庫的封裝和設(shè)計(jì);函數(shù)指針回調(diào)函數(shù)。
學(xué)習(xí)C++語言:
面向?qū)ο缶幊趟枷?類的封裝,構(gòu)造和析構(gòu)、靜態(tài)成員、對(duì)象管理;類的構(gòu)造(有參構(gòu)造函數(shù)、無參構(gòu)造、拷貝構(gòu)造、默認(rèn)構(gòu)造函數(shù))和析構(gòu);對(duì)象動(dòng)態(tài)管理、友元函數(shù)、友元類、操作符重載; C++編譯器對(duì)象管理模型分析;類對(duì)象的動(dòng)態(tài)管理(new/delete);友元函數(shù)和友元類;運(yùn)算符重載(一元運(yùn)算符、二元運(yùn)算符、運(yùn)算符重載難點(diǎn)、項(xiàng)目開發(fā)中的運(yùn)算符重載);類的繼承、多繼承及其二義性、虛繼承;多態(tài)(概念、意義、原理剖析、多態(tài)案例);虛函數(shù)、純虛函數(shù)、抽象類(面向抽象類編程思想案例);函數(shù)模板、類模板,模板的繼承。
C++類型轉(zhuǎn)換;C++輸入輸出流(標(biāo)準(zhǔn)I/O 文件I/O 字符流I/O);C++異常處理(異常機(jī)制、異常類型、異常變量、異常層次結(jié)構(gòu)、標(biāo)準(zhǔn)異常庫);利用一些IDE開發(fā)工具:諸如Windows平臺(tái)VC系列:VC++6.0(比較古老) ;Visual Studio2013, Visual Studio2015;Mac平臺(tái)的XCode系列,還有CodeBlock,另附一些高級(jí)編輯器Notepad++, EditPlus,UE等一些開發(fā)工具的常用設(shè)置和一些常見快捷鍵的使用。
二、C/C++開發(fā)進(jìn)階
在第二階段學(xué)習(xí)的時(shí)候,就是比較重要的了,C/C++開發(fā)的進(jìn)階之路,更是一個(gè)讓自己找份薪水比較體面的工作的籌碼。
C++進(jìn)階之STL:
STL = Standard Template Library,即標(biāo)準(zhǔn)模板庫。這是提高開發(fā)效率的極品工具。通過學(xué)習(xí)此階段,應(yīng)掌握泛型編程技巧,理解容器類在C++語言中的應(yīng)用模式,以及熟練掌握全部STL類的使用方法。
C++進(jìn)階之設(shè)計(jì)模式:
決定一個(gè)項(xiàng)目成敗最重要的因素是項(xiàng)目總體的設(shè)計(jì),通過本階段的學(xué)習(xí),可掌握面向?qū)ο缶幊讨兄匾囊画h(huán),是編碼前建模的技巧所在。單例模式;工廠模式;代理模式;迭代模式等,這些都是你要掌握的哦。
C++進(jìn)階之?dāng)?shù)據(jù)結(jié)構(gòu)基礎(chǔ):
這是所有編程語言中最應(yīng)該學(xué)習(xí)的部分,程序組成的基礎(chǔ)之一。順序存儲(chǔ)、鏈?zhǔn)酱鎯?chǔ)、循環(huán)鏈表;
雙向鏈表、棧(順序和鏈?zhǔn)?、隊(duì)列(順序和鏈?zhǔn)?;
棧的應(yīng)用、樹基本概念及遍歷、二叉樹;
排序算法、并歸算法、選擇、插入、快速、希爾。
以上這些內(nèi)容你知道嗎?
C++進(jìn)階之UI界面開發(fā):
掌握QT類庫構(gòu)架,圖形界面開發(fā)模型;
掌握QT開發(fā)技巧,消息機(jī)制,圖形處理;
掌握QT網(wǎng)絡(luò)編程,UDP,TCP使用方式;
掌握QT文件處理方式,序列化;
掌握QT在windows,linux,ios,android不同平臺(tái)下的移植技術(shù)
C++進(jìn)階之Unix/Linux網(wǎng)絡(luò)服務(wù)器:
掌握Unix/Linux平臺(tái)開發(fā)方式;
熟練使用系統(tǒng)調(diào)用;
熟練Unix/Linux內(nèi)存管理,進(jìn)程,線程調(diào)度;
熟悉網(wǎng)絡(luò)服務(wù)器開發(fā)方式,熟練編寫TCP,UCP網(wǎng)絡(luò)服務(wù)程序;
掌握同步/異步IO模型在網(wǎng)絡(luò)編程中的使用方式。
C++進(jìn)階之?dāng)?shù)據(jù)庫開發(fā):
掌握SQL語言的實(shí)用技巧。
Oracle,MySQL數(shù)據(jù)庫的使用方式。
如果你能熟練掌握以上列出的技能,具備解決復(fù)雜問題和技術(shù)難點(diǎn)的能力,而且你能獨(dú)立開發(fā)一些比較復(fù)雜的功能模塊,這個(gè)時(shí)候月薪過萬都是小意思了!
三、C++開發(fā)高級(jí)
這就是所謂的程序員大牛了,當(dāng)下炙手可熱的全棧開發(fā)工程師,既曉前端,又通后臺(tái)??焖俣ㄎ粏栴},解決問題對(duì)他們來說已是小菜一碟,就是人們常說的神秘大牛,只在公司技術(shù)攻關(guān)的時(shí)候才會(huì)才看到他們的身影。
?、俅穗A段軟件開發(fā)工作所需的知識(shí)和技能相對(duì)較難,高級(jí)軟件工程師編碼熟練度和規(guī)范性需要達(dá)到一定要求;
?、诰邆湟欢ǖ捻?xiàng)目能力(包括調(diào)試能力、文檔編寫能力、測(cè)試能力等)和綜合技術(shù)素質(zhì)(包括對(duì)軟件生命周期的理解、對(duì)設(shè)計(jì)模式的理解、必備的行業(yè)知識(shí)和經(jīng)驗(yàn)等);
③了解主流的后臺(tái)技術(shù)和前后端協(xié)作方式,能從全局角度理解項(xiàng)目的整個(gè)生命周期。
猜你喜歡:
2.程序設(shè)計(jì)基礎(chǔ)學(xué)習(xí)心得