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