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