在談論 C++ 的歷史那麼必須先得了解 C 的歷史,那麼咱們先來看一段來自於 <<C專家編程>> 對 C 語言史前階段的簡單闡述:html
Ken Thompson(左), Dennis Ritchie (右)程序員
聽上去有些荒謬,C 語言居然源於一個失敗的的項目.1969 年,通用電氣、麻省理工、學院和貝爾實驗室聯合建立了一個龐大的項目 -- Multics 工程。該項目的目的是建立一個操做系統,當是顯然遇到了麻煩: 它不但沒法交付原先所承諾的快速而便捷的在線系統,甚至連一點有用的東西都沒弄出來.雖然開發小組最終勉強讓 Multics 開動起來,但他們仍是陷入了泥塘,就像 IBM 在 OS/360 上面同樣.他們試圖創建一個很是巨大的操做系統,可以應用於規模很小的硬件系統中.Mutics 成了總結工程教訓的寶庫,但它同時也爲 C 語言體系 "小即便美" 鋪平了道路.
小心灰意冷的貝爾實驗室的專家們撤離 Multics 工程後,他們又去尋找其餘任務.其中一名叫 Ken Thompson 的研究人員對另外一個操做系統很感興趣,他爲此好幾迴向貝爾管理層提議,但均遭否決.在等待官方批准時,Thompson 和他的同事 Dennis Ritchie 自娛自樂,把 Thompson 的 "太空旅行軟件" 移植到不太經常使用的 PDP-7 系統上.太空旅行軟件模擬太陽系統的主要星體,把它們顯示在圖形屏幕上.並建立了一架航天飛機,它可以飛行並降落到各個行星上.於此同時, Thompson 加緊工做,爲 PDP-7 編寫了一個簡易的新型操做系統.它比 Multics 簡單的許多,也輕便許多.整個系統都是用匯編寫的.Brian Kernighan 在 1970 年給它取名爲 Unix,自嘲笑總結了從 Multics 中獲取得的那些不該該作的教訓.shell
然而上面所述的好像和 C 語言沒有太大的關係.好吧是的,到目前爲止所說的都是爲引出下面的正文.來看一段中文 wikipedia 對 C 語言的wikipedia編程
而 C 語言最先是由丹尼斯·裏奇爲了在 PDP-11 電腦上運行的 Unix 系統所設計出來的編程語言,第一次發展在 1969 年到 1973 年之間.之因此被稱爲 "C" 是由於 C 語言的不少特性是由一種更早的被稱爲 B 語言的編程語言中發展而來.早期操做系統的核心大多由彙編語言組成,隨着 C 語言的發展,C 語言已經能夠用來編寫操做系統的核心.1973年,Unix 操做系統的核心正式用 C 語言改寫,這是 C 語言第一次應用在操做系統的核心編寫上.編程語言
其實在 1970 年, Thompson 發現 BCPL 太慢了,並且缺少運行時的支持,他將 BCPL 進行了實驗性的修改,併爲它起了一個有趣的名字 B 語言,意思是將 CPL 語言進行壓縮,提煉出它的精華.B 是 BCPL 的一個簡化版,並且被設計成專門用來進行系統編程,但它依然不能知足程序員們的要求:它的字符處理機制太醜陋了,並且浮點數運算被實現得並非很理想,處理指針時開銷太大.模塊化
過了兩年即 1972 年,當 PDP-11 進入貝爾實驗室時,Thompson 的同伴,一樣在貝爾實驗室的 Dennis Ritchie,在從 BCPL 中抽取了一些共性放入 B 語言中,對 B 進行了改進,而且在裏面加入了數據類型,他把這個擴展的語言稱爲 NB(New B).隨後,他又繼續對新語言進行大量修改,彷佛能夠用新的名字來從新命名它了,因而他取了 B 後面的那個字母做爲這種語言的名字,這就是 C 語言.(曾幾什麼時候,人們猜想 C 的後裔會被命名爲 P──BCPL 的第三個字母,而不是 D,但現在最顯見的 C 的後裔語言是叫 C++.).那麼下圖即是 C 語言大概的發展史:函數
後來有進過一段的時間 C 語言在此基礎上獲得了一些改進和發展.造成了一系列對應的體系.體系以下(若想看每一個標準中對 C 語言的改進, 點這裏):學習
在 c 語言風靡一時的時候,因爲 Dennis Ritchie 相信程序員可以作好本身的事情因此沒有作出過多的假定.因此開發團隊的專業水平會致使程序的可讀性,以及維護性與擴展性有着天壤之別.因而有些人便但願引入一些特性來緩解這個問題.讓程序的具備更好的模塊化和可維護性.因而在 1983 年 Stroustrup 的 C++ 橫空出世. 來看看 C++ 是如何由來的.下面引入一段在 wikipedia 的 C++ 發展史:google
Bjarne Stroustrup編碼
Stroustrup 工做起於1979年的 C with Classes.這個構思起源於 Stroustrup 作博士論文時的一些程序撰寫經驗.他發現 Simula 具有很利於大型軟件開發的特色,但 Simula 的運行速度太慢,沒法對現實需求發揮功效;BCPL 雖快得多,但它過於低級的特性,使其不適於大型軟件的開發.當 Stroustrup 開始在貝爾實驗室工做時,他有分析 UNIX 核心關於分散式計算的問題.回想起他的博士論文經驗,Stroustrup 開始爲 C 語言加強一些相似 Simula 的特色.之因此選擇 C,是由於它適於各類用途、快速和可移植性.除了 C 和 Simula 以外,同時也從其它語言中取得靈感,如 ALGOL 6八、Ada、CLU 以及 ML.剛開始時,類型、派生類、存儲類型檢查、內聯和默認參數特性,都是經過 Cfront 引入 C 語言之中.1985 年 10 月出現了第一個商業化發佈.
1983 年,C with Classes 改命名爲 C++.加入了新的特性,其中包括虛函數、函數名和運算符重載、參考、常數、用戶可控制的自由空間存儲區控制、改良的類型檢查,以及新的雙斜線 (//) 單行註解風格.1985 年,發佈初版《C++程序設計語言》,提供一個重點的語言參考,至此還不是官方標準.1989 年,發佈了 Release 2.0.引入了多重繼承、抽象類型、靜態成員函數、常數成員函數,以及成員保護.1990 年,出版了 The Annotated C++ Reference Manual.這本書後來成爲標準化的基礎.稍後還引入了模板、異常處理、命名空間、新的強制類型轉換,以及布爾.
C++ 引進了一些列新的特性.用類來讓程序具備更好的模塊化,更好的可讀性.用靜態檢查來排錯.用模板來解決代碼複用的問題.若還想初略地瞭解下 C++ 的特性能夠 點這裏.下圖是 C++ 的大概的發展:
隨着時間的推移,C++ 也造成了一系列對應的體系.體系以下:
看完 C 與 C++ 的發展由來也能夠看出 C 與 C++ 最初的設計初衷,其實每一門語言的設計,都有它的權衡.到底它是設計者怎樣的願景,語言也會在其願景的特定條件下體現出明顯的優點.熟不用其長避其短.語言的特性也同樣.例如 C++ 的衆多特性同樣.它們都有其最適合的使用場景.在編程中應該根據場景而選擇性的使用其中的特性 (而選擇合適的技術去開發而不是選擇最熟練的技術來開發,每每也是最難的).從而提供程序總體的可讀性,維護性與擴展性.固然程序的質量,不取決於語言而取決於編碼者的編碼水平.因此這裏不討論 C 與 C++ 孰優孰劣.
不過 C++ 的特性衆多.就像個怪胎.每一個特性要是用的好的話也是能夠 "一招鮮,吃遍天" 的.可是本人不是太同意這種作法即是.放鬆一下.下面來幅 coolshell 21天教你學會C++ 的趣圖,有興趣的朋友能夠點擊上面連接查看原文:
因爲 C++ 的特性衆多若想要一一精通的話也是須要很多時間的.下面即是程序員自信心曲線圖.一樣也來至於 coolshell 中的 C++程序員自信心曲線圖 (有興趣的朋友能夠 點這裏)
其實,我的感受 C++ 爲一門特性很是多的語言而且它的特性相互不影響.因此這些特色致使你要在特定場景下選擇合適的特性使用,不然可能會出現運行效率低下且難以維護的窘境.因此想要可以優雅的使用它或稱爲一名合格的 C++ 程序員必須付出一段艱辛的學習過程,去了解編譯器和類揹着你作了不少你不知道的事,例如去了解虛函數表,瞭解多重繼承 (不太建議使用),瞭解宏和模板等等,讓它稱爲你所使用的一種高效的開發語言.最好拋棄能夠在十幾天就能搞定它的想法哈.好了上一趣圖做爲全文結束.