你真的懂C++嗎


  一年前寫的東西,整理了一下,貼出來。

      大學時期我眼中的C++和C語言一樣一樣的,因為課時不夠老師講C++的時候只講了前半部分語法(相當於C語言學了兩遍),關於面向對象部分的東西還沒講到課程就結束了,秉着混日子的學習態度后邊的也沒看。這也造成了我為期四五年的天真無知的認為我懂C++,直到近期翻看《STL源碼剖析》《Boost文檔庫》才老臉一紅有了自知之明。現在想來即使老師把后半部分面向對象講了也不算真正的懂C++(那破教材應該扔了,而且大學C++的課程時長應該翻三倍),C++的水太深了。
  站在程序員的角度來說,一門成熟的編程語言應該具備以下一些東西:簡潔易懂標准統一的語法語義,功能齊全的類庫,工業級的代碼規范和指導文檔。從這方面看C++還處於生長期,而漫長的C++標准制定期給它的成長帶來了很多羈絆(例如缺乏規范造成編譯器各自不兼容),而在它緩慢的成長的同時,一些新的編程語言后來者居上並帶來C++不具備的新特性,使得它為了追求兼容這些新特性而陷入更加痛苦漫長的標准制定期。它概念上的架構早已經確立,為了兼容新特性而產生的技巧上的東西對其本身沒有太大的影響。概念上,真正的C++包括了過程化C子語言,面向對象部分,泛型編程。后面兩者才是C++的靈魂所在。STL是這三部分的一個具體實現,一個類庫,類似於C#對.net。而關於模板元編程這個新特性,更傾向於把它歸結於一種編程技法,而很難提升到概念這一層。畢竟把運行期的工作提到編譯器這種做法在程序設計的時候並沒有通用的解(有一定的局限性,並不是所有的情況都可以這么干)。

  單純於語言來說,學習語言很簡單,掌握了語法就算掌握了一門語言,但是如何把這門語言說的漂亮,這才是作家(大師)與讀者(普通程序員)的區別。無論編程語言還是自然語言,每種語言都有自己獨特的魅力,“你好”“吃了嗎”這些司空見慣的語句凸顯不出語言的魅力,適當的技法應用才能讓語言生輝。通過近距離接觸大師級作品(源碼),你會發現語言獨特且強大的魅力。對於編程語言來說,每種設計思想和技術都相當於一種全新的文體或者修辭手法,而類庫相當於一些名著名言,是托生於些文體或修辭產生的名著名言,供后人引用調用。  STL是一個C++類庫,提供一些常用容器和算法,STL的設計師們設計這套類庫時創造了一些獨特的技術和設計理念,類似迭代器,仿函數等等,這些獨創的技術和理念才是STL的基石與靈魂,是STL最本質的東西。C++是一個仍在成長的語言(大批配套的類庫和先進的語言特性需要完善,C++的生態系統正在形成中),大批優秀的編程大師們用自己天才般的智慧推動它的穩步成長,而通過研究源碼了解它每一次成長的源動力會讓自己更加觸及它和它的創造者的靈魂,這對於一個孜孜追求進步的程序員來說是一個捷徑。從不質疑C#,Java之類語言的優越性,但一個苦心孤詣的程序員如果只是滿足於使用便捷的語言,那他永遠是個不入流的程序員。C++才是編程語言世界里那顆最耀眼的明星。 

      就針對STL架構而言,從功能上分包括以下幾個部分:容器,迭代器,算法,函數對象,適配器,Utility和Allocator。STL主要關乎容器和算法,其目標是容器和算法分離,而迭代器,函數對象等等都是為了實現這一目標而抽象出來的概念或者編程技法。單從應用上講,你只需要找一個工具書去了解一下容器和算法即可以很方便的在編程時調用。但是閱讀STL源碼可以讓你明白其實現細節以及編程技法,學習這些技法有助於提升你的編程技巧。boost做為一個標准庫的后備庫,是C++標准化進程的發動機之一,不折不扣的“准”標准庫。它提供了專家級的實驗性質C++源碼,如果感覺自己在C++領域已經到了一個瓶頸或者高處孤寒了,可以去閱讀一下STL和Boost的源碼。

      學習一個語言歸根到底是為了工程實踐。雖然工程實踐更加重視設計,架構,性能,等等,與選擇的語言相關性不太大,但是畢竟再大的工程也是又語言一磚一瓦構建起來的。人們會從一個又一個工程實踐中總結出來各種各樣的經驗,包括軟件開發模式,設計模式,軟件測試理論,等等,這也就是軟件工程這門課存在的理由。工程實踐還有一個非常重要的經驗總結--對於特定語言在工程實踐中的總結,比如怎樣在工程中更加有效的使用特定語言,常見的錯誤,針對特定語言更加合理的設計架構等等。Scot Meyer的《effective C++》就是這樣一本好書。。《effective C++》的種種條款或是提醒也好或是建議也好總結了大部分人都會犯的普遍性的錯誤,總結的很有條理性,而且挖掘定位的很精確。看完了這本書再去翻你保存的自認為很經典的源碼你會發現它們是如此薄弱,隨便拿出一條條款去檢測都能摟出一堆潛在的bug。雖然看了這本書你依然會犯錯,但至少當你意識到自己犯錯的時候能夠很快明白自己錯在哪了。對於一個經常與C++打交道的程序員這應該是一本枕邊書,隨時都應該拿來看看。

     

Reference:

http://www.sgi.com/tech/stl/

http://www.boost.org/(部分漢化手冊http://code.google.com/p/boost-doc-zh/downloads/list

《Effective C++:改善程序與設計的55個具體做法》

《STL 源碼剖析》

http://cppandbeyond.com/

http://www.artima.com/index.jsp

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM