(允許程序員創(chuàng)建包含數(shù)據(jù)和功能的對象) https://m.toutiao.com/is/YBVLobt/?=為什么要學(xué)C++
C++是一種通用的、面向?qū)ο蟮木幊陶Z言,可用于開發(fā)操作系統(tǒng)、游戲、圖形用戶界面、后端以及高性能系統(tǒng)和應(yīng)用程序。 所以,盡管Python、Go這些后起之秀近幾年熱度非常高,但是在很多領(lǐng)域還是無法撼動C++的地位。 今天,就從淺到深,從入門到實(shí)戰(zhàn),教你如何學(xué)習(xí)C++。 篇幅較長,先給出本文的目錄:
下面,就正式開始本文的正式內(nèi)容吧! C++簡介什么是C++?現(xiàn)如今,流行的編程語言非常多,Python、Go、Java、PHP、JavaScript等等,它們各有自己擅長的領(lǐng)域和方向。 而C++則在系統(tǒng)資源和內(nèi)存控制更勝一籌,因此,在操作系統(tǒng)、圖形圖像、游戲、嵌入式這些對性能要求較高的領(lǐng)域,C++一直都具有不可替代的地位。 它可以用來開發(fā)在多個平臺上運(yùn)行的應(yīng)用程序,如服務(wù)器、個人電腦、基于云的系統(tǒng)和移動設(shè)備。 為什么學(xué)C++?如果你對計算機(jī)游戲、高端計算項(xiàng)目的軟件工程、加密貨幣挖礦程序和開發(fā)移動設(shè)備的操作系統(tǒng)等領(lǐng)域感興趣,學(xué)習(xí)C++則是必不可少的。 此外,相對于Go、Python這些更加高階的編程語言,會涵蓋更加全面的編程知識,也有助于學(xué)習(xí)者理解變量、函數(shù)、面向?qū)ο?、指針、?nèi)存...這些在很多高階語言中容易被忽略的概念和知識。 C++的歷史? C++是由丹麥計算機(jī)科學(xué)家Bjarne Stroustrup(比雅尼·斯特勞斯特魯普)創(chuàng)造、設(shè)計和開發(fā)的。 斯特魯斯特魯普想制造一種類似于C語言的靈活和動態(tài)的語言,但是,需要擁有更多的功能。 它最初被稱為 'C with classes',在1983年被重新命名為C++,意思是 比C高一等。 國際標(biāo)準(zhǔn)化組織的C++聯(lián)合技術(shù)委員會在1998年至2017年間對C++進(jìn)行了五次升級。 一個新的版本,C++20,計劃也在計劃中將要發(fā)布。 C和C++的區(qū)別C和C++有哪些區(qū)別? 這是在學(xué)習(xí)C或者C++時無法繞開的一個問題。 Jon Kalb(軟件工程講師、C++ Now和CppCon的主席)說,C++是C的進(jìn)化。 雖然它們有一些相似之處,但現(xiàn)在兩者有很大的不同。 雖然C語言被廣泛使用,但Kalb說它并不像C++那樣支持抽象、通用編程和面向?qū)ο缶幊獭?/span> 在大型項(xiàng)目中,往往需要非常高層次的抽象,在這方面C++要遠(yuǎn)勝于C語言。 抽象層指的是觀察或編程一個系統(tǒng)的復(fù)雜程度。低層次的抽象有更多的細(xì)節(jié),而高層次的抽象可以包括整個系統(tǒng)。 C語言是一種程序性語言,它的代碼由指令組成,直接告訴計算機(jī)或其組件按邏輯步驟完成一項(xiàng)任務(wù)。 C++也可以做到這一點(diǎn),而且,在此基礎(chǔ)上它支持高級功能,如類和面向?qū)ο?,它允許程序員創(chuàng)建包含數(shù)據(jù)和功能的 '對象'。這種方法的優(yōu)點(diǎn)是,軟件對象比程序性指令執(zhí)行得更快,更容易執(zhí)行,而且面向?qū)ο蟮木幊淌勾a更容易修改、維護(hù)和調(diào)試。 編譯型語言和解釋型語言提起編程語言,就必須先要理解語言所屬類型 。 編程語言可以分為編譯型語言和解釋型語言,下面分別解釋一下。 編譯型語言:程序在執(zhí)行之前需要一個專門的編譯過程,把程序編譯成 為機(jī)器語言的文件,運(yùn)行時不需要重新翻譯,直接使用編譯的結(jié)果就行了。程序執(zhí)行效率高,依賴編譯器,跨平臺性差些。比較有代表性的有C、C++等。 解釋型語言:相對于編譯型語言存在的,源代碼不是直接翻譯成機(jī)器語言,而是先翻譯成中間代碼,程序在運(yùn)行時才翻譯成機(jī)器語言,每執(zhí)行一次都要翻譯一次,因此效率比較低。比較有代表性的包括Java、Python、JavaScript等。 從入門到實(shí)戰(zhàn)因?yàn)镃++很受歡迎,所以有很多資源可供初學(xué)者使用,包括在線教程、網(wǎng)站和書籍。 當(dāng)決定學(xué)習(xí)C++或任何其他計算機(jī)語言時,你首先要清楚將它用于什么方向、什么崗位。 如果你從事機(jī)器學(xué)習(xí)、深度學(xué)習(xí)、數(shù)據(jù)分析這些偏重于算法和分析、對性能不敏感的崗位,你完全可以選擇R或者Python這些語言替代。 但是,如果你從事游戲、系統(tǒng)等對性能有嚴(yán)格要求的崗位,C++則是首要的選擇。 下面,就開始學(xué)習(xí)旅程吧! 開發(fā)環(huán)境如前面介紹的那樣,C++屬于一種靜態(tài)的編譯型語言,所以,開發(fā)環(huán)境配置過程中就需要用到對應(yīng)的編譯器。 C++有很多編譯器可以用,GCC或GNU Compiler Collection是最流行的C++編譯器之一。 下面是不同操作系統(tǒng)下的編譯器安裝方式。 Linux? 如果你使用的是Linux,可能已經(jīng)默認(rèn)安裝了GCC。 如果沒有,可以通過如下命令安裝: # Debian/Ubuntusudo apt install build-essential# Fedorasudo dnf install make automake gcc gcc-c++# Arch Linuxsudo pacman -S base-devel Linux下的IDE可以選擇Codeblocks IDE或Eclipse CDT在Linux。 macOS在Mac上,你可以使用Clang或GCC,兩者都是免費(fèi)的。 雖然GCC支持更廣泛的C和C++標(biāo)準(zhǔn),但Clang在大多數(shù)情況下都能正常工作。 可以使用Homebrew安裝GCC:
開發(fā)工具方面,可以選擇Visual Studio Code或者Xcode。 Windows在Windows上有很多好的編譯器。 在Windows上,Visual Studio提供了一個C++編譯器,該編譯器還可以構(gòu)建C語言程序。 Visual Studio有自己強(qiáng)大的、功能豐富的IDE,對于任何開始使用C或C++的人或主要針對Windows平臺的人來說,它是一個很好的選擇。 如果你想要更符合標(biāo)準(zhǔn)的編譯器,GCC(MinGW)也可以使用,Codeblocks IDE通過設(shè)置就可以滿足需求。 IDE方面,Clang是目前比較好用的的工具,除此之外,還有一些跨平臺的IDE,如Eclipse CDT、Jetbrains CLion和Netbeans,它們提供了功能齊全的C和C++開發(fā)環(huán)境。 最近,Visual Studio Code非?;馃?,在很多編程語言比較受歡迎,它也可用于Linux和Mac環(huán)境。 C++入門語法是一種編程語言的核心,也是用C++開發(fā)的基礎(chǔ),就如同我們說漢語、英語一樣,語法定義了C++代碼的組成和理解方式。 下面看一段示例代碼: # include <iostream>using namespace std:Int main () {cout << ”Hello World“ ; return 0; #include <iostream>:這是一個頭文件庫,將功能導(dǎo)入到程序中。該命令的含義是程序從一個名<iostream>的文件中導(dǎo)入內(nèi)容,該文件代表輸入和輸出流。 using namespace std:指的是來自標(biāo)準(zhǔn)庫(std)的對象和變量名稱,通常用關(guān)鍵字std和運(yùn)算符::來縮寫。 int main ( ): 指定了一個主函數(shù)。函數(shù)是C++程序的一個重要部分,因?yàn)樗鼈冊诖a中定義了一個動作,包含在括號{ }中的代碼將被執(zhí)行。 cout(讀作see-out):是一個定義輸出的對象,也就是代碼中的字串,這里會輸出Hello World。 return 0:指示程序不返回任何東西,文本字符串將是唯一的輸出。 <<:是一個用于命名對象的操作符,而;(分號冒號)則作為一行代碼的結(jié)束標(biāo)識。 把這些放在一起,就組成了一段完成的C++代碼。 通過這段簡短的代碼就簡單的涵蓋了C++中的一些基本語法,如果不首先學(xué)會基礎(chǔ)語法,看這段代碼如同天書一樣,不知道它在做什么?它有什么含義? 如果了解基本語法,就能夠像看一段漢語一樣輕松理解它表示什么。 基本語法只是入門的一個方面,除此之外還要對如下內(nèi)容有基本的認(rèn)知:
C++實(shí)戰(zhàn)在入門C++并學(xué)習(xí)了一些C++編程技巧后,接下來需要做的就是把它們好好利用起來了,在實(shí)戰(zhàn)中打磨并熟練C++。 做到這一點(diǎn)的一個方法是通過做一個項(xiàng)目來了解該語言的各個方面是如何結(jié)合起來的。 目前Github上有很多相關(guān)的項(xiàng)目,我們可以通過閱讀相關(guān)的代碼,理解它的實(shí)現(xiàn)過程,然后自己復(fù)現(xiàn)相關(guān)的項(xiàng)目來起到實(shí)戰(zhàn)的作用。 也可以根據(jù)自己感興趣的領(lǐng)域,給你尋找一些相關(guān)的需求場景,然后通過C++實(shí)現(xiàn)相應(yīng)的工具或者軟件。 例如,開發(fā)一款簡單的小游戲、實(shí)現(xiàn)一個文獻(xiàn)翻譯工具、開發(fā)一個簡易的計算器等等。 C++進(jìn)階中級和高級C++編程建立在基礎(chǔ)知識之上。 《C++ Crash Course》一書的作者Lospinoso說,在中級階段,程序員需要了解引用和指針如何工作。支撐最強(qiáng)大的C++功能的其他核心概念,例如,對象生命周期和多態(tài)。 對這些概念如何理解、如何使用,以及如何高效的應(yīng)用于項(xiàng)目中,則是走上進(jìn)階路線上必須學(xué)會的。 在進(jìn)階之路上,一個C++程序要做的就不再是如何通過基本語法或者面向?qū)ο缶幊倘?shí)現(xiàn)一項(xiàng)功能或者一個系統(tǒng),而是學(xué)會并熟練通用編程、泛型編程,也就是說,需要考慮代碼的通用性、可擴(kuò)展性,以便后續(xù)可以更好的向后兼容,以及更加容易適應(yīng)多平臺的需求。 學(xué)習(xí)資源書籍《C++ Primer Plus(中文版)》想必絕大多數(shù)從事C++開發(fā)的同學(xué)都看過,至少聽過這本經(jīng)久不衰的經(jīng)典書籍。 這是一本全面、細(xì)致、權(quán)威的C++書籍,對零基礎(chǔ)小白非常友好,即便沒有任何編程基礎(chǔ),在閱讀過程中也不會有太大障礙。 而且,相對于很多數(shù)據(jù)喜歡給出偽代碼,這本書中給出大量完整、可執(zhí)行的代碼,這對于基礎(chǔ)較弱的同學(xué)上手訓(xùn)練非常良心。 此外,這是一本站在更高層次講解C++的書籍,對比很多書籍一味的講解概念和理論,它用更高層次的視角教授C++,比如,哪里有潛在問題?哪些地方需要著重注意?它都會給出詳細(xì)的提示和闡述。 《C++ Primer(中文版)》C++大師StanleyB.Lippman、C++標(biāo)準(zhǔn)委員會原負(fù)責(zé)人JoséeLajoie、C++先驅(qū)BarbaraE.Moo三位C++領(lǐng)域大牛合著的一本經(jīng)典C++書籍,也傾注了三位大牛對C++獨(dú)特的理解。 相對于很多書籍單純的概念講述,《C++ Primer(中文版)》從因到果,由淺入深,由表及里娓娓道來,從語言的簡單用法,到為什么這樣設(shè)計語言,你不僅能從一個語言使用者的角度看問題,更能站在一個語言設(shè)計者的角度思考這種語言的設(shè)計優(yōu)劣。 而且,這本書完全可以作為一個參考字典使用,在日常C++開發(fā)過程中遇到的很多語法和編譯問題在這里都可以尋找到答案。 《Essential C++中文版》相對于《C++ Primer Plus(中文版)》和《C++ Primer(中文版)》的全面而厚重,《Essential C++中文版》顯得”輕薄“很多。 相對于前兩本的全面,這本書更加注重C++進(jìn)階部門的講解,全書圍繞procedural(面向過程的)、generic(泛型的)、object-based(基于對象的)、object-oriented(面向?qū)ο蟮模┲?個面向進(jìn)行詳解,從這里,你可以學(xué)到很多C++的高階用法 《C++標(biāo)準(zhǔn)庫》標(biāo)準(zhǔn)庫是C++一個非常重要的組成部分,在C++開發(fā)中也是無法繞開的一個部分。 《C++ 標(biāo)準(zhǔn)庫》這本書詳細(xì)講解了每一標(biāo)準(zhǔn)庫組件,包括其設(shè)計目的和方法、復(fù)雜概念的剖析、實(shí)用而高效的編程細(xì)節(jié)、存在的陷阱、重要的類和函數(shù),除此之外,還大量用 C++11 標(biāo)準(zhǔn)實(shí)現(xiàn)的實(shí)用代碼范例,覆蓋全新組件、特性。 這本書重點(diǎn)著眼于標(biāo)準(zhǔn)模板庫(STL),涉及容器、迭代器、函數(shù)對象以及 STL 算法。 《Effective C++:改善程序與設(shè)計的55個具體做法》這是一本來自全世界知名C++軟件開發(fā)專家Scott Meyers的經(jīng)典書籍,這本書更像是一本經(jīng)驗(yàn)的積淀。 如果你想沿著C++的方向一直走下去,我建議《Effective C++》一定要讀,它提煉和升華了作者在C++開發(fā)過程中多年的實(shí)戰(zhàn)經(jīng)驗(yàn),這些都是C++程序設(shè)計和優(yōu)化過程中寶貴的經(jīng)驗(yàn),也是普通程序員和高階程序員之間差距的關(guān)鍵所在。 《More Effective C++(中文版)》這是繼Effective C++之后,Scott Meyers于1996推出這本續(xù)作,相對于《Effective C++》也更加高階。 這本書比較適合有一定經(jīng)驗(yàn)的C++開發(fā)人員,對于C++初學(xué)者有一定難度。 視頻課程其實(shí),仔細(xì)閱讀上面介紹的6本書籍對于C++的學(xué)習(xí)就已經(jīng)足夠了。 但是,不同同學(xué)有不同的學(xué)習(xí)偏好,有的同學(xué)喜歡通過看書學(xué)習(xí)新知識,有的同學(xué)則更加傾向看視頻。 所以,這里也給大家推薦兩個視頻課程,都是免費(fèi)的。 《面向?qū)ο蟪绦蛟O(shè)計-C++》內(nèi)容包括基本理論、類與對象、構(gòu)造與清除、函數(shù)、引用、繼承與多態(tài)、拷貝構(gòu)造、運(yùn)算符重載、異常、模板和流等,課程中貫通匯編、操作系統(tǒng)等知識,深入淺出,在這個課程里可以看到很多有關(guān)上面這些經(jīng)典書籍的影子,可以說是一份比較用心的課程。 《C++教程:從0到1入門編程》面向?qū)ο蟪绦蛟O(shè)計-C++ - 網(wǎng)易云課堂《C++教程:從0到1入門編程》B站上一個頗受歡迎的C++視頻課程,目前播放量已經(jīng)超過1500萬,從基本語法到進(jìn)階知識,從概念理解到動手實(shí)踐,沒有多余的話術(shù),純干貨的視頻教程,對初學(xué)者非常友好。 開源項(xiàng)目我個人認(rèn)為,開源項(xiàng)目是學(xué)習(xí)一門編程語言非常快捷且行之有效的方法。 得益于強(qiáng)大的Github,提供了很多開源優(yōu)質(zhì)的項(xiàng)目,在這些項(xiàng)目中,我們可以學(xué)習(xí)那些優(yōu)秀程序員的編碼方式、學(xué)習(xí)并借鑒它們的程序設(shè)計模式。還能夠從這些項(xiàng)目中得到一些靈感,去動手做一些實(shí)戰(zhàn)項(xiàng)目,讓我們從書本的理論知識中走出來,走向貼近實(shí)際場景的項(xiàng)目,讓我們的技術(shù)得到升華可提煉,讓我們從一個普通C++程序員進(jìn)階到一個高階C++程序員。 interviewStar:24.4k C/C++ 技術(shù)面試基礎(chǔ)知識總結(jié),包括語言、程序庫、數(shù)據(jù)結(jié)構(gòu)、算法、系統(tǒng)、網(wǎng)絡(luò)、鏈接裝載庫等知識。 這是一個比較適合初學(xué)者的C++項(xiàng)目,沉淀了面試過程中C++相關(guān)的一些問題和解答,這些知識相對于書本上的內(nèi)容,更加貼合項(xiàng)目實(shí)戰(zhàn),往往都是實(shí)際項(xiàng)目中會遇到的一些問題。 因此,這個項(xiàng)目可以讓我們脫離書籍和教程,學(xué)到很多有實(shí)戰(zhàn)價值的C++知識和技巧。 tinytetrisStar:1.7k 這是一個利用C++實(shí)現(xiàn)的俄羅斯方塊的小項(xiàng)目,相對于那些大型項(xiàng)目,這個項(xiàng)目對初學(xué)者比較輕松,而且把C++和耳熟能詳?shù)挠螒蜷_發(fā)有機(jī)的結(jié)合到一起,這會讓學(xué)習(xí)者有更加直觀的感受,也有更加強(qiáng)烈的代入感,能夠把學(xué)習(xí)者的注意力吸引到程序的設(shè)計過程中。例如,如何實(shí)現(xiàn)方塊圖像?如何實(shí)現(xiàn)方塊的移動和選擇?如何實(shí)現(xiàn)消除和積分功能? 這些拋出的問題在這個小項(xiàng)目中都可以找到解答。 MyTinySTLStar:6.3k 就如同前面介紹的那樣,STL是C++中很重要的組成部分,是學(xué)習(xí)C++無法繞開的概念。 MyTinySTL通過一個個代碼示例,配以詳細(xì)的注釋詳解,讓初學(xué)者更加清楚STL的用法,對于剛學(xué)完基礎(chǔ)知識想要夯實(shí)基礎(chǔ)的同學(xué)非常有價值。 到這里,介紹了幾個比較適合初學(xué)者的開源項(xiàng)目,這些比較適合剛撇下書本,需要用一些實(shí)戰(zhàn)項(xiàng)目來練手、提升自己對理論知識印象和理解的同學(xué),下面再介紹幾個進(jìn)階實(shí)戰(zhàn)的開源項(xiàng)目。 CytopiaStar:1.4k Cytopia是一個免費(fèi)的、開源的復(fù)古像素藝術(shù)城市建設(shè)游戲,它采用了基于SDL2的自定義等距渲染引擎。 在這個項(xiàng)目中涉及到游戲開發(fā)中的很多關(guān)鍵因素,例如,渲染引擎、UI系統(tǒng)、攝像機(jī)平移縮放、地形操作、聲音效果等等。 這是一個比較完整且豐富的開源項(xiàng)目,對游戲開發(fā)感興趣的同學(xué)可以深入學(xué)習(xí)一下。 OpenTTDStar:4.1k OpenTTD是一款運(yùn)輸模擬游戲,基于Chris Sawyer編寫的流行游戲Transport Tycoon Deluxe。 它試圖盡可能地模仿原來的游戲,同時用新的功能來擴(kuò)展它。 OpenTTD采用GNU通用公共許可證2.0版,但包括一些采用不同許可證的第三方軟件。 devilutionXStar:5.8k devilutionX是《暗黑破壞神》和《地獄之火》的源碼移植,它努力使游戲的運(yùn)行變得簡單,同時提供引擎改進(jìn)、錯誤修復(fù)和一些可選的生活質(zhì)量功能。 calculatorStar:25k calculator是一個用C++編寫的Windows計算器程序,預(yù)裝在Windows中。 沒錯,就是我們現(xiàn)在在Windows操作系統(tǒng)中使用的那個計算器。 該應(yīng)用程序提供了標(biāo)準(zhǔn)、科學(xué)和程序員計算器的功能,以及一組各種測量單位和貨幣之間的轉(zhuǎn)換器。 DearPyGuiStar:7.9k DearPYGui是一款用C++開發(fā),適用于Python的快速而強(qiáng)大的圖形用戶界面工具包,具有最小的依賴性。 在這個項(xiàng)目中,可以學(xué)習(xí)如何使用C++實(shí)現(xiàn)UI界面,進(jìn)行圖形圖像的開發(fā)。 ClementineStar:3.2k Clementine是一款適用于Windows、Linux和macOS的現(xiàn)代音樂播放器和資料庫組織工具。 通過這個項(xiàng)目,我們可以學(xué)習(xí)如何通過C++處理音頻文件,以及實(shí)現(xiàn)文件的組織與管理。 zealStar:9.6k zeal是一款由C++開發(fā)的離線文檔瀏覽和閱讀工具,通過這個項(xiàng)目會涉及到Qt、cmake、libarchive、SQLite等工具的用法。 開源項(xiàng)目這里,我共介紹了10個項(xiàng)目,涉及到實(shí)戰(zhàn)知識、游戲開發(fā)、用戶界面、游戲引擎、媒體播放、文檔工具,有比較適合初學(xué)者的,也有適合C++進(jìn)階的,大家可以根據(jù)自己感興趣的方向選擇適合的項(xiàng)目進(jìn)行深入了解和學(xué)習(xí)! |
|