現(xiàn)在正處于互聯(lián)網(wǎng)公司的鼎盛期,而互聯(lián)網(wǎng)公司主要使用Java、C#等語言,因?yàn)檫@些語言學(xué)習(xí)成本低、安全性高,且有很多已經(jīng)寫好的模塊,可以直接調(diào)用,不需要造輪子。因此,如果你想進(jìn)入互聯(lián)網(wǎng)公司,那么并不建議花太大精力學(xué)習(xí)C/C++。至于C/C++的用途,C語言適合做嵌入式、操作系統(tǒng),C++則更擅長做機(jī)器學(xué)習(xí)、計算機(jī)視覺、GUI編程等。
作為一個把C/C++當(dāng)作畢業(yè)摯愛的童鞋,我說一下我的看法:
1.C++大致可以認(rèn)為是在C語言這種結(jié)構(gòu)化程序設(shè)計語言的基礎(chǔ)上,增加了面向?qū)ο筇匦浴R虼耍珻語言的基礎(chǔ)要掌握,包括輸入輸出、基本數(shù)據(jù)類型、指針、數(shù)組、字符串、函數(shù)、結(jié)構(gòu)體等。有一些容易混淆的概念,比如數(shù)組名和指針、字符串和字符數(shù)組,一定要辨析。
2.面向?qū)ο筇匦裕珻++如何實(shí)現(xiàn)封裝、繼承、多態(tài)。如果你熟悉Java語言,還可以比較C++和Java多態(tài)機(jī)制的區(qū)別。其他與類和對象相關(guān)的知識,還包括static關(guān)鍵字、const關(guān)鍵字、函數(shù)重載等。
3.數(shù)據(jù)結(jié)構(gòu)與算法、STL。數(shù)據(jù)結(jié)構(gòu)、算法,與編程語言無關(guān),是放之四海而皆準(zhǔn)的。對常見的數(shù)據(jù)結(jié)構(gòu)及其特點(diǎn)(時空復(fù)雜度、適用場景)應(yīng)非常熟悉。經(jīng)典的數(shù)據(jù)結(jié)構(gòu)都被寫進(jìn)了STL容器,常用的有vector、string、stack、queue、set、map等,去看看它們底層是如何實(shí)現(xiàn)的。而算法,常用的就是查找和排序,像STL中也提供了優(yōu)化的排序函數(shù),直接調(diào)用std::sort()就可以。
4.程序運(yùn)行時的內(nèi)存分配,尤其是棧和堆。理解棧和堆各自的特性,可以讓你寫出更安全、更快的代碼。
5.C++11以后的新特性。時代在進(jìn)步,C++也非復(fù)當(dāng)年吳下阿蒙。這些新特性,很多是提供語法糖,例如auto關(guān)鍵字、lambda表達(dá)式、序列for循環(huán)、智能指針;但也有些要求使用者對C++機(jī)制具備深刻的理解,如右值引用、移動語義,這些可以算是進(jìn)階內(nèi)容。
6.圖形界面編程。早期的MFC,現(xiàn)在的Qt,都是優(yōu)秀的GUI庫,可以做出漂亮的圖形界面,非常有成就感!
7.優(yōu)化代碼的意識。在保證代碼可讀性、可維護(hù)性的前提下,讓代碼更快、更省空間、更安全,是每個C++程序員追求的目標(biāo)。引用傳遞、右值引用、STL......都是為此而生。有時我們還需要用到操作系統(tǒng)甚至硬件方面的知識。優(yōu)化代碼的過程,也能不斷加深我們對于C++底層機(jī)制的理解。
以上其實(shí)也算是我在分享自己學(xué)習(xí)C++的過程吧