C++歷史背景
C ++編程語(yǔ)言的歷史可以追溯到1979年,當時(shí)Bjarne Stroustrup為博士學(xué)位論文進(jìn)行了一些開(kāi)發(fā)。在Stroustrup可以使用的所有單詞中,有一種被稱(chēng)為Simula的語(yǔ)言,顧名思義,它可能是一種主要為仿真而設計的語(yǔ)言。Simula 67語(yǔ)言是Stroustrup使用的變體,被認為是支持面向對象編程范例的主要語(yǔ)言。Stroustrup發(fā)現這種范例對包裝開(kāi)發(fā)很有幫助。但是,Simula語(yǔ)言對于實(shí)踐和實(shí)際使用而言太慢了;
隨后不久,Bjarne Stroustrup希望通過(guò)支持面向對象范例來(lái)增強C。他深入研究了Smalltalk的OO實(shí)現,以獲取有關(guān)實(shí)現的想法。但是他不愿意為此放棄性能,因此他開(kāi)始從事“C with Classes (帶有類(lèi)的C) ”的工作,希望C ++代碼運行時(shí)應具有與C代碼相似(或更好)的性能。
第一個(gè)帶有類(lèi)別編譯器的C稱(chēng)為Cfront,它是從稱(chēng)為CPre的C編譯器派生而來(lái)的。它曾經(jīng)是一個(gè)旨在將帶有類(lèi)別代碼的C轉換為通用C的程序。值得注意的目的是Cfront主要是用C用類(lèi)編寫(xiě)的,從而創(chuàng )建了一個(gè)自舉的編譯器(可以自行編譯的編譯器) 。Cfront后來(lái)在1993年被放棄,但是Cfront對未來(lái)的編譯器和Unix操作系統的實(shí)現產(chǎn)生了巨大影響。
1983年,語(yǔ)言的名稱(chēng)從“帶有類(lèi)的C”更改為C ++。C語(yǔ)言中的++運算符是用于遞增變量的運算符,它使您可以深入了解Stroustrup如何看待該語(yǔ)言。在此期間添加了許多新功能,其中最引人注目的是虛函數,函數重載,帶有&符號的引用,const關(guān)鍵字和使用兩個(gè)正斜杠的單行注釋。
1985年,Stroustrup引用了名為“ C ++編程語(yǔ)言”的語(yǔ)言。已出版。同年,C ++被實(shí)現為商業(yè)產(chǎn)品。該語(yǔ)言尚未正式標準化,因此使該書(shū)成為非常重要的參考。該語(yǔ)言在1989年再次進(jìn)行了更新,以包括受保護的成員和靜態(tài)成員,以及從多個(gè)類(lèi)的繼承.
1990年,發(fā)行了《帶注釋的C ++參考手冊》。同年,Borland的Turbo C ++編譯器將作為商業(yè)產(chǎn)品發(fā)布。Turbo C ++添加了許多其他庫,這些庫會(huì )對C ++的開(kāi)發(fā)產(chǎn)生相當大的影響。盡管Turbo C ++的最后一個(gè)穩定版本是2006年,但該編譯器仍被廣泛使用。
1998年,C ++標準委員會(huì )發(fā)布了第一個(gè)C ++ ISO / IEC 14882:1998國際標準,其非正式名稱(chēng)為C ++ 98。據說(shuō)《帶注釋的C ++參考手冊》對標準的制定產(chǎn)生了很大的影響。還包括標準模板庫,該模板庫于1979年開(kāi)始概念開(kāi)發(fā)。2003年,該委員會(huì )對1998年標準所報告的多個(gè)問(wèn)題做出了回應,并對其進(jìn)行了相應的修訂。更改的語(yǔ)言稱(chēng)為C ++ 03。
2005年,C ++標準委員會(huì )發(fā)布了一份技術(shù)報告(稱(chēng)為T(mén)R1),詳細介紹了他們計劃添加到最新C ++標準中的各種功能。新標準被非正式地稱(chēng)為C ++ 0x,因為它有望在第一個(gè)十年結束之前的某個(gè)時(shí)間發(fā)布。具有諷刺意味的是,新標準要到2011年年中才會(huì )發(fā)布。直到那時(shí)為止,已經(jīng)發(fā)布了幾份技術(shù)報告,并且一些編譯器開(kāi)始為新功能添加實(shí)驗性支持。
2011年中,新的C ++標準(稱(chēng)為C ++ 11)完成。Boost庫項目對新標準產(chǎn)生了重大影響,其中一些新模塊直接來(lái)自相應的Boost庫。一些新功能包括正則表達式支持,全面的隨機化庫,新的C ++時(shí)間庫,原子支持,標準線(xiàn)程庫 ,一種新的for循環(huán)語(yǔ)法,提供的功能類(lèi)似于某些其他語(yǔ)言中的foreach循環(huán),auto關(guān)鍵字,新的容器類(lèi),對聯(lián)合和數組初始化列表以及可變參數模板的更好支持。
2014年,C ++ 14(也稱(chēng)為C ++ 1y)作為C++11的一個(gè)小擴展發(fā)布,主要功能是錯誤修復和小的改進(jìn),國際標準投票程序草案于2014年8月中完成,加強lambda函數,constexpr和類(lèi)型推導特性;
2017年,發(fā)布C++17標準,C++17提供了很多東西。增強了核心語(yǔ)言和庫;
2020年,發(fā)布C++20標準,推出了很多重量級功能,其中比較重要:
Concepts:概念改變了我們思考和編程模板的方式。它們是模板參數的語(yǔ)義類(lèi)別。它們使您可以直接在類(lèi)型系統中表達您的意圖。如果出了什么問(wèn)題,您會(huì )收到清晰的錯誤消息。
Ranges library:新的ranges庫使它可以直接在容器上執行算法,用管道符號組成算法,并將其應用于無(wú)限數據流。
Coroutines:由于協(xié)程,C ++中的異步編程成為主流。協(xié)程是協(xié)作任務(wù),事件循環(huán),無(wú)限數據流或管道的基礎。
Modules:模塊克服了頭文件的限制。他們承諾很多。例如,頭文件和源文件的分離變得和預處理器一樣過(guò)時(shí)了。最后,我們有更快的構建時(shí)間和更輕松的構建軟件包的方法。
Concurrency:
Atomic Smart Pointers,
Joining & Cancellable Threads,
The C++20 Synchronization Library,增強了C++并發(fā)編程能力;
總結一下,C++標準演進(jìn)路線(xiàn)如下圖:
從C++發(fā)展歷史背景來(lái)看,C++產(chǎn)生的根本原因有兩點(diǎn):
面向對象編程: Bjarne Stroustrup研究Simula OOP編程思想,覺(jué)得這個(gè)是應對大型軟件開(kāi)發(fā)的絕佳武器,擁有很好的現實(shí)抽象能力和代碼組織能力;
高性能:Bjarne Stroustrup準備開(kāi)發(fā)一套通信系統,需要編寫(xiě)接近硬件的低級代碼,例如內存管理器、進(jìn)程調度器和設備驅動(dòng)程序來(lái)分離軟件組件,由于當時(shí)計算機硬件性能限制,對軟件性能要求苛刻,廣泛使用的C語(yǔ)言有比較接近硬件工作的能力,所以Bjarne Stroustrup基于C語(yǔ)言創(chuàng )造可以面向對象編程的C++語(yǔ)言;
推薦學(xué)習:
《An Overview of the C++ Programming Language》Bjarne Stroustrup
《Design and Evolution of C++》Bjarne Stroustrup
怎么才能深刻理解面向對象思想?
面向對象程序設計的雛形,早在1960年的Simula語(yǔ)言中即可發(fā)現,當時(shí)的程序設計領(lǐng)域正面臨著(zhù)一種危機:在軟硬件環(huán)境逐漸復雜的情況下,軟件如何得到良好的維護?面向對象程序設計在某種程度上通過(guò)強調可重復性解決了這一問(wèn)題。20世紀70年代的Smalltalk語(yǔ)言在面向對象方面堪稱(chēng)經(jīng)典——以至于30年后的今天依然將這一語(yǔ)言視為面向對象語(yǔ)言的基礎。
維基百科:
面向對象程序設計(英語(yǔ):Object-oriented programming,縮寫(xiě):OOP)是種具有對象概念的編程典范,同時(shí)也是一種程序開(kāi)發(fā)的抽象方針。它可能包含數據、屬性、代碼與方法。對象則指的是類(lèi)(class)的實(shí)例。它將對象作為程序的基本單元,將程序和數據封裝其中,以提高軟件的重用性、靈活性和擴展性,對象里的程序可以訪(fǎng)問(wèn)及經(jīng)常修改對象相關(guān)連的數據。在面向對象程序編程里,計算機程序會(huì )被設計成彼此相關(guān)的對象。
面向對象編程就是通過(guò)對象把現實(shí)世界映射到計算機模型的一種編程方法,是抽象思維的一種體現。而抽象是計算機科學(xué)中最重要的一種思維方式;
面向對象方法的本質(zhì)就是主張從客觀(guān)世界固有的事物出發(fā)的構造系統,提倡用人類(lèi)在現實(shí)生活中常用的思維方法來(lái)認識、理解和描述客觀(guān)事物,具體實(shí)現采用對象為基礎,對象是面向對象方法中最基本的概念。對象可以用來(lái)表示客觀(guān)世界中的任何實(shí)體,它既可以是具體的物理實(shí)體的抽象,也可以是人為的概念,或者是任何有明確邊界和意義的東西;
程序的本質(zhì)是人的意志延伸到計算機的可識別的指令。計算機(CPU)僅能識別 01代碼,本身不能解決任何問(wèn)題(無(wú)意識),只能由人編寫(xiě)程序控制計算機解決問(wèn)題,因此編程的本質(zhì)就是人“教會(huì )”計算機解決問(wèn)題。
面向對象的編程技術(shù)有助于減小這一隔閡、并使這兩個(gè)空間盡量趨于一致;
抽象思維一直推動(dòng)著(zhù)計算機技術(shù)不斷向前發(fā)展,科學(xué)技術(shù)本身就是現實(shí)世界的抽象和演繹:
電路信號->01二進(jìn)制->指令匯編->高級編程->模塊設計->框架設計->單機系統->分布式系統-->云計算
推薦學(xué)習:
《深入理解計算機系統》
《編碼:隱匿在計算機軟硬件背后的語(yǔ)言(美.佩措爾德)》
封裝
主要的方法是對象和類(lèi):
對象是面向對象方法中最基本的概念。對象可以用來(lái)表示客觀(guān)世界中的任何實(shí)體,它既可以是具體的物理實(shí)體的抽象,也可以是人為的概念,或者是任何有明確邊界和意義的東西;
類(lèi)是具有共同屬性、共同方法的對象的集合,是關(guān)于對象的抽象描述,反映屬于該對象類(lèi)型的所有對象的性質(zhì),它由一組靜態(tài)特征(數據)和它可執行的一組操作(方法)組成,一個(gè)對象就是類(lèi)的一個(gè)實(shí)例;
對象和對象之間隱藏自己內部實(shí)現細節,通過(guò)標準接口進(jìn)行通信,這樣就可以提高程序內聚,降低耦合,方便系統進(jìn)行解耦設計,同時(shí)也提高了系統穩定性,降低系統風(fēng)險。
繼承
主要的方法通過(guò)類(lèi)的公有繼承、保護繼承,私有繼承,單繼承,多繼承;結合類(lèi)成員的三種屬性:public、protected 和 private; 來(lái)實(shí)現共享和限制屬性和方法的訪(fǎng)問(wèn);
繼承的優(yōu)點(diǎn)是:相似的對象可以共享程序代碼和數據結構,從而大大減少了程序中的冗余信息,提高軟件的可重用性,便于軟件迭代;
多態(tài)
編譯時(shí)多態(tài)
主要的方法是重載和模板,重載包括運算符重載和函數重載,運算符重載通過(guò)重新定義運算符實(shí)現函數來(lái)實(shí)現,底層還是函數重載,函數重載通過(guò)參數列表的不同來(lái)區分不同的方法,底層是不同的函數簽名;
模板是通過(guò)參數化類(lèi)型來(lái)區分不同類(lèi)和函數;
細節請參考:
C++模版的本質(zhì)
《C++ Templates: The Complete Guide》
運行時(shí)多態(tài)
主要方法是重寫(xiě),子類(lèi)對父類(lèi)方法的“重新”實(shí)現,底層是通過(guò)定義虛函數和構建虛函數表,在虛函數表里面插入RTTI(運行時(shí)類(lèi)型信息)信息,結合繼承和動(dòng)態(tài)綁定,程序就可以根據實(shí)際類(lèi)型判斷并調用相應的屬性和方法。
細節請參考:
C++內存管理全景指南
《深度搜索c++對象模型》
多態(tài)強大的功能允許不修改父類(lèi)代碼和業(yè)務(wù)邏輯代碼,就通過(guò)擴展子類(lèi)來(lái)實(shí)現功能的擴展。多態(tài)使模塊在復用的基礎上具備了更強的可擴展性;
C ++的設計目標
高效地使用硬件
保持與C語(yǔ)言兼容,C++代碼與C代碼運行時(shí)應具有相似(或更好)的性能;
將內置操作和類(lèi)型直接映射到硬件,以提供有效的內存使用和有效的低級操作;
零成本的抽象機制
低成本的靈活抽象機制,可為用戶(hù)定義的類(lèi)型提供與內置類(lèi)型相同的符號支持,用途范圍和性能;
類(lèi),繼承,模板,概念,別名等;
任何違反以上兩個(gè)設計目標之一的建議都可能會(huì )遭到拒絕;
C ++的未來(lái)目標
更加靈活,支持多種編程范型:
面向過(guò)程編程:兼容C語(yǔ)言編程,支持自上而下面向過(guò)程編程;
面向對象編程:封裝,繼承,多態(tài),對象內存模型,構造和析構;
泛型編程:泛型編程是自 STL(標準模板庫)納入到 C++ 標準以后才逐漸流行起來(lái)的新范式,核心思想是“一切皆為類(lèi)型”,或者說(shuō)是“參數化類(lèi)型”“類(lèi)型擦除”,使用模板而不是繼承的方式來(lái)復用代碼,所以運行效率更高,代碼也更簡(jiǎn)潔;
模板元編程:模板元編程是一種高級、復雜的技術(shù),C++模板是圖靈完備的,可以在編譯期間模擬一個(gè)完整的圖靈機,也就是說(shuō),可以完成任何的計算任務(wù),比如編譯期數值計算、類(lèi)型計算、代碼計算(如循環(huán)展開(kāi)),而類(lèi)型計算和代碼計算可以使得代碼更加通用,更加易用,性能更好;
函數式編程:核心思想是以函數對象(可以作為入參和返回值),無(wú)狀態(tài)(無(wú)副作用),更加強調程序執行的結果而非執行的過(guò)程,倡導利用若干簡(jiǎn)單的執行單元讓計算結果不斷漸進(jìn),逐層推導復雜的運算,C++已經(jīng)提供了一些基本元素:Lambda表達式,std::function、函數對象。模板元編程等;
更好的類(lèi)型系統:內置更多類(lèi)型(通過(guò)標準庫擴展),更安全類(lèi)型系統,更好類(lèi)型泛化編程支持,支持自省,反射等特性;
更好資源的安全性:更好的對象內存模型,更好對象所有權設計(可以學(xué)習借鑒Rust),更好異常安全機制;
更好利用硬件:caches,多核(更好支持并發(fā)編程),GPUs,FPGA,SIMD等;
我挑選一些自己覺(jué)得比較重要的實(shí)踐條目,大家可以自行修正補充一下:
盡量使用現代C++(C++11 以上)進(jìn)行C++編程,開(kāi)發(fā)效率,性能,安全性都有極大提高;
盡量使用智能指針,用RAII模式管理對象生命周期;
理解C++對象的內存模型和布局,方便定位和解決各種C++內存問(wèn)題;
異常是一個(gè)即安全又危險的特性,請謹慎使用;
熟悉常見(jiàn)的設計模式和C++特有的設計范式,幫助自己設計構建更好的系統,對代碼進(jìn)行必要的重構;
代碼一定要做單元測試,測試代碼盡量覆蓋所有的分支(覆蓋率盡量高),可以采用GoogleTest單元測試框架;
代碼最好用valgrind等工具跑一遍,檢查代碼有沒(méi)有內存泄漏和異常;
C語(yǔ)言:
《The C Programming Language》
學(xué)習C++,離不開(kāi)C語(yǔ)言的了解,此書(shū)被譽(yù)為C語(yǔ)言的圣書(shū),需要反復細讀。
手冊參考書(shū)籍:
《C++標準程序庫(C++ Standard Library Tutorial and Reference) 》
《C++編程規范(C++ Coding Standards) 》
用來(lái)當手冊使用,有需要時(shí)候查詢(xún)一下。
C++初學(xué)者入門(mén):
《C++ Primer》
此書(shū)為入門(mén)經(jīng)典書(shū)籍,初學(xué)者一定要經(jīng)常翻看。
如何更好編寫(xiě)C++程序:
《Effective C++ 》:
《Effective STL》
《Exceptional C++》
讓你了解C++經(jīng)驗用法,避免踩坑。
C++內存模型:
C++內存管理全景指南
《深度搜索c++對象模型》
讓你理解C++內存布局,對C++各種內存異常問(wèn)題有幫助。
泛型編程:
《深入淺出STL》
《Beyond the C++ Standard Library(Boost)》
可以學(xué)習泛型編程精髓。
modern C++:
《深入理解C++11》
《Effective Modern C++》
C++11版本以后被稱(chēng)為modern C++,代表一個(gè)新時(shí)代C++誕生,寫(xiě)代碼更快,更好,更穩。
高手進(jìn)階
模板編程:
《C++ 模板完全指南(C++ Templates: The Complete Guide)》
《C++設計新思維-泛型編程與設計模式之應用(Modern C++ Design ) 》
《C++模板元編程(C++ Template Metaprogramming)》
《Advanced c++ Programming Styles and Idioms 》
如果想看懂標準庫STL或者boost庫代碼,需要了解一些模板編程相關(guān)的知識。
設計模式:
《設計模式:可復用面向對象軟件的基礎》
《Modern C++ Design》
《More C++ Idioms》
《Advanced c++ Programming Styles and Idioms 》
了解一下常用設計模式和C++設計慣用方法,可以更好設計C++系統。
兩個(gè)經(jīng)典網(wǎng)站:
用來(lái)查詢(xún)標準庫API和使用說(shuō)明,以及標準說(shuō)明解釋
不管你是轉行也好,初學(xué)也罷,進(jìn)階也可,如果你想學(xué)編程,進(jìn)階程序員~
【值得關(guān)注】我的C語(yǔ)言創(chuàng )作者中心!
C語(yǔ)言入門(mén)資料:


聯(lián)系客服