一、C++發展
C++語言由C語言發展而來,是以面向對象為主要特征的語言。它是20世紀80年代初由貝爾實驗室的BjarenStroustrup博士發明的,最初稱為“帶類的C”,1983年正式命名為C++。有一個關于C++名字的笑話是,當你使用后綴++時,附加只發生在運算之后(因此,它應該是++C,而不是C++,這個笑話是說時下某些程序員還在以使用C的方式使用C++,這通常被一些權威著作認為是不正確的)。
C++語言發展大概可以分為三個階段:第一階段從80年代到1995年。這一階段C++語言基本上是傳統類型上的面向對象語言,并且憑借著接近C語言的效率,在工業界使用的開發語言中占據了相當大份額;第二階段從1995年到2000年,這一階段由于標準模板庫和后來的Boost等程序庫的出現,泛型程序設計在C++中占據了越來越多的比重。同時由于Java、C#等語言的出現和硬件價格的大規模下降,C++受到了一定的沖擊;第三階段從2000年至今,由于以Loki、MPL(Boost)等程序庫為代表的產生式編程和模板元編程的出現,C++出現了發展歷史上又一個新的高峰,這些新技術的出現以及和原有技術的融合,使C++已經成為當今主流程序設計語言中最復雜的一員。
1983年,C with Classes改命名為C++(++是C語言中的自增操作符)。加入了新的特性,其中包括虛函數、函數名和運算符重載、參考、常量、用戶可控制的自由空間存儲區控制、改良的類型檢查,并恢復了雙斜線(//)單行注釋(之后C99也支持了這種注釋)。
1985年,發布第一版《C++程序設計語言》,提供一個重點的語言參考,至此還不是官方標準。
1989年,發布了Release 2.0。引入了多重繼承、抽象類別、靜態成員函數、常量成員函數,以及成員保護。1990年,出版了《The Annotated C++ Reference Manual》。這本書后來成為標準化的基礎。稍后還引入了模板、異常處理、名字空間、新的強制類型轉換,以及布爾類型。
隨著C++語言的演變,也逐漸演化出相應的標準程序庫。最先加進C++標準庫的是流I/O庫,其用以取代傳統的C函數,如printf和scanf。隨后所引入的程序庫中最重要的便是標準模板庫,簡稱STL。
多年后,ISO委員會于1998年對C++標準化。在官方發布1998標準的若干年后,委員會處理缺陷報告,并于2003年發布一個C++標準的修正版本。2005年,一份名為《Library Technical Report 1》的技術報告發布。雖然還不是官方標準的一部分,不過它所提供的幾個擴展可望成為下一版C++標準的一部分。
目前最新的C++標準是2020年12月發布的ISO/IEC 14882:2020[5],又稱C++20。
原來版本中來不及引入的內容,以及語言機制中發現的一些缺陷,都在新的版本中得以彌補和發展。新版標準中引入了無序容器,以及彌補原版標準中對hash容器的缺漏:新版標準支持移動構造函數和移動賦值運算符,以減小特定場景下對象拷貝的性能開銷。新版本標準不僅在語法上增加了大量的特性,而且在標準庫里也引入大量設施,使得標準庫對于C++語言的重要性遠超從前。學習新的C++風格,不是一朝一夕,熟練掌握rvalue reference、move 語義,了解unique_ptr、shared_ptr和weak_ptr的完整用法,明智的使用function/bind和lambda機制,學習C++ Concurrency的新技術,對于初學者的話更不簡單。
二、經驗淺談
我們再來說說C++的應用領域,目前有三大類∶
第一類就是我們目前見到的各種桌面應用平尤其 Windows桌面軟件,如QQ、安全類殺毒類軟件、各種瀏覽器等;
另外就是一些基礎軟件和高級語言的運行時環境,如大型數據庫軟件、Java虛擬機、C#的CLR、Python編譯器和運行時環境等;
第三類就是一些業務型應用軟件的后臺,像游戲的服務器后臺,如魔獸世界的服務和一些企業內部的應用系統。
說的比較抽象,我們舉個例子,要開發一個類似電驢的軟件,軟件界面如下圖:
操作系統選擇Windows,使用語言C++,這款產品的實現技術分為UI和網絡通信部分。
(1)UI部分:需要對Windows的窗口、對話框、消息產生、派發與處理機制進行學習了解,根據上圖的軟件功能,大致分為三大模塊,即資源、下載和分享。這三大塊可以使用Windows Tab控件去組織。
(2)網絡通信部分:有兩大塊,第一個是程序啟動時與服務器交互;第二個是文件下載與分享的P2P網絡。
同學們面臨的的一個重要任務就是快速掌握新的C++風格和工具。C++同時支持4種不同的編程風格:面向過程、基于對象、面向對象和泛型編程,還可以加上一種“基于組件”的風格,這么多的風格共存于一種語言就是其強大抽象機制的證明。
在實踐中,不必全面地使用C++語言的各種特性,而應根據工程項目的實際情況,比如動態類型信息、虛擬繼承、異常等特性的使用有待商榷。通常使用C++語言的一個子集就夠了。盡管在工程中使用C++子集,但全面地學習C++語言還是有必要的,畢竟C++語言是一個整體,并且C++標準庫自身全面地使用了C++語言的各種特性。
最后說下面試問題,如果你是想進入大型互聯網公司的應屆生,應該優先好好準備算法和數據結構以應對面試,這是大型互聯網公司面試頻率最高的考察范圍;如果是社會人士參加C++職位的面試,如果是大型互聯網公司,雖然社招問的更多的是項目經驗,但適當準備一些基礎的算法和數據結構知識也是非常有用的。