魚皮 C++ 學(xué)習(xí)路線一條龍!
大家好,我是魚皮 ???????。
最近有很多小伙伴私信問我有沒有 C++ 的學(xué)習(xí)路線,其中甚至有剛高考完的朋友!
其實(shí)今年 4 月份我就已經(jīng)寫好了一份 6000 多字的完整 C++ 學(xué)習(xí)路線,提供給 編程導(dǎo)航 的魚友學(xué)習(xí)。
但考慮到大家確實(shí)需要,所以決定還是把學(xué)習(xí)路線分享出來,精簡了一些項(xiàng)目和資源,保留了核心的學(xué)習(xí)主線和方法,希望對(duì) C++ 方向的同學(xué)有幫助。
在編寫本路線時(shí),魚皮參考了多位 C++ 專業(yè)大佬的建議,但仍做不到完美,有意見和想法歡迎指正。
C++ 介紹
語言特性
比較官方,僅供參考
C++ 是一種面向?qū)ο蟮摹⑼ㄓ玫摹㈧o態(tài)類型的編程語言,它是 C 語言的一種擴(kuò)展。
C++ 相對(duì)于其他高級(jí)語言(比如 Java)來說,更加底層,因此具有高性能、可移植、可重用等優(yōu)點(diǎn),被廣泛應(yīng)用于系統(tǒng)開發(fā)、嵌入式系統(tǒng)、服務(wù)端開發(fā)、游戲開發(fā)、圖形學(xué)、音視頻處理、金融分析等領(lǐng)域。
隨著 C++ 的發(fā)展,它具有了豐富的語法和庫支持,大學(xué)計(jì)算機(jī)專業(yè)的同學(xué)一般也會(huì)從 C++(C 語言)開始學(xué)起。
就業(yè)方向
C++ 的就業(yè)方向還是非常多的,比如:服務(wù)端開發(fā)、系統(tǒng)開發(fā)、客戶端開發(fā)、嵌入式開發(fā)、游戲開發(fā)、音視頻處理、圖像處理、SDK 開發(fā)等。魚皮建議大家 首先根據(jù)自己的興趣愛好 來做選擇。
雖然都是學(xué) C++,但不同方向的工程師需要側(cè)重掌握的技能和專業(yè)知識(shí)也是有區(qū)別的。但是如果你還沒確定選什么具體的方向,不妨先掌握它們都要求的通用技能,即能夠熟練使用 C++ 語法來編程。
選 C++ 還是 Java?
首先,明確一點(diǎn),C++ 和 Java 都是非常優(yōu)秀的主流編程語言,編程語言和技術(shù)沒有絕對(duì)的優(yōu)劣之分,只不過在不同的場(chǎng)景下,有更優(yōu)的選擇。而且,像很多大神說的一樣,語言只是工具,編程思想才是核心。不過,選擇好的工具也是至關(guān)重要的,“好的抓手才能帶來更大的賦能”。
如果你對(duì)操作系統(tǒng)底層、嵌入式、圖像處理、音視頻處理、游戲開發(fā)等方向感興趣,建議選擇 C++;而如果你更喜歡開發(fā)應(yīng)用系統(tǒng)、思考和實(shí)現(xiàn)業(yè)務(wù)邏輯,就選擇 Java。
此外,因?yàn)?Java 和 C++ 都可以作為后端開發(fā)語言,所以無論把哪門語言作為主語言,都要重點(diǎn)學(xué)好后臺(tái)開發(fā)通用知識(shí),比如數(shù)據(jù)庫、緩存、消息隊(duì)列、Socket 通訊、Linux、Git、計(jì)算機(jī)基礎(chǔ)知識(shí)等。但選擇 C++ 的同學(xué)要對(duì)操作系統(tǒng)、網(wǎng)絡(luò)和 Linux 更熟悉一些 。
魚皮專門針對(duì)這個(gè)問題寫了一篇文章,歡迎閱讀:https://www.code-nav.cn/post/1640611259688742914
學(xué)習(xí)大綱
不同的 C++ 就業(yè)方向,要學(xué)的知識(shí)也是不同的,但是會(huì)有很多交集。
只要你學(xué)習(xí) C++,C++ 的語法、Linux 服務(wù)器、操作系統(tǒng)、計(jì)算機(jī)網(wǎng)絡(luò)等知識(shí)幾乎都是必學(xué)的!(純客戶端界面開發(fā)除外,但最好也學(xué)習(xí)下)
本學(xué)習(xí)路線以 C++ 的主流崗位 —— 服務(wù)端開發(fā)為例,大致分為以下幾個(gè)階段:
- C++ 語法基礎(chǔ)
- C++ 進(jìn)階
- 計(jì)算機(jī)基礎(chǔ)
- 軟件開發(fā)通用
- 后端開發(fā)通用
- C++ 項(xiàng)目實(shí)戰(zhàn)
- C++ 求職備戰(zhàn)
一、C++ 語法基礎(chǔ)
學(xué)習(xí)建議
對(duì)于完全 0 編程基礎(chǔ)的同學(xué)來說,不建議上來就去看《C Primer Plus》(或者《C++ Primer Plus》)這種很厚的書籍,可能會(huì)被勸退。
對(duì)于大多數(shù)入門的同學(xué),快速上手語法、能寫出代碼是最重要的。所以建議這里還是看培訓(xùn)機(jī)構(gòu)在 B 站的免費(fèi)視頻教程:https://www.bilibili.com/video/BV1et411b73Z/ ,它們做入門課真的是有一手。
如果你們學(xué)校是從 C 語言開始學(xué)起,可以看浙大翁愷老師的 C 語言入門課:https://www.bilibili.com/video/BV1dr4y1n7vA ,好評(píng)很多。
除了視頻教程外,建議大家搭配一個(gè)文檔教程(https://www.runoob.com/cplusplus/cpp-tutorial.html )一起學(xué)習(xí),起到查漏補(bǔ)缺的作用。
初學(xué) C++,除了學(xué)習(xí)基本的概念(比如變量、指針、引用)之外,一定要多上手敲代碼練習(xí)、熟能生巧,還要能熟練地 debug 自己的程序,為以后開發(fā)更復(fù)雜的項(xiàng)目打好基礎(chǔ)。
開發(fā)工具可以使用 Visual Studio(功能最強(qiáng)大)、Dev Cpp(最簡單易用)、Code::Blocks(中規(guī)中矩)等。除了必須會(huì)用一款本地開發(fā)工具外,還可以搭配在線編程工具學(xué)習(xí):https://www.runoob.com/try/runcode.php?filename=helloworld&type=cpp ,效率更高。
學(xué)完本階段后,可以試著用 C++ 去做一個(gè)簡單的 XX 管理系統(tǒng)(控制臺(tái)里運(yùn)行即可),或者做一些 LeetCode 上入門級(jí)別的算法題目、學(xué)校里的 OJ 等等。
知識(shí)點(diǎn)
-
基礎(chǔ)概念
- 條件分支
- 循環(huán)
- 變量
- 常量
- 關(guān)鍵字
- 數(shù)據(jù)類型
- 運(yùn)算符
- 表達(dá)式
- 控制結(jié)構(gòu)
- 開發(fā)工具
-
函數(shù)
- 函數(shù)重載
- 默認(rèn)參數(shù)
-
基本數(shù)據(jù)結(jié)構(gòu)
- 數(shù)組
- 字符串
-
內(nèi)存管理
- 內(nèi)存模型
- 動(dòng)態(tài)內(nèi)存分配
- 動(dòng)態(tài)內(nèi)存釋放
-
指針
- 空指針
- 野指針
-
引用
- 函數(shù)參數(shù)引用
- 返回值引用
-
結(jié)構(gòu)體
- 定義
- 訪問
- 命名空間
- 面向?qū)ο缶幊?ul style="padding-left:25px;color:#000000;" class="list-paddingleft-1">
- 虛函數(shù)
- 純虛函數(shù)
- 抽象類
- 虛析構(gòu)函數(shù)
- 純虛析構(gòu)函數(shù)
- 對(duì)象初始化順序
- 同名成員問題
- 多繼承
- 虛繼承
- 菱形繼承
- 友元函數(shù)
- 友元類
- 成員變量
- 成員函數(shù)
- this 指針
- 類
- 對(duì)象
- 封裝
- 構(gòu)造函數(shù)
- 析構(gòu)函數(shù)
- 拷貝構(gòu)造函數(shù)
- 靜態(tài)成員
- 友元
- 運(yùn)算符重載
- 繼承
- 多態(tài)
- 拋出
- 捕獲
- 異常類型
- 標(biāo)準(zhǔn)異常
- 排序
- 查找
- 一元謂詞
- 二元謂詞
- vector
- string
- list
- pair
- set
- map
- deque
- stack
- 容器
- 迭代器
- 函數(shù)對(duì)象
- 謂詞
- 內(nèi)置函數(shù)對(duì)象
- 算法
- 函數(shù)模板
- 類模板
- 文件操作
二、C++ 進(jìn)階
上個(gè)階段我們主要通過看視頻來快速入門 C++ 基礎(chǔ)編程語法;而這個(gè)階段要做的是鞏固基礎(chǔ)、學(xué)習(xí)更多 C++ 的特性、甚至是底層原理,建議大家通過閱讀經(jīng)典書籍的方式來學(xué)習(xí)。
先系統(tǒng)學(xué)習(xí) C++ 基礎(chǔ)及進(jìn)階語法,可以讀下面 2 本書籍:
- 《C++ Primer Plus》:https://book.douban.com/subject/10789789/
- 《Effective C++》:https://book.douban.com/subject/5387403/
學(xué)到這里,建議先去學(xué)習(xí)本路線第三階段的計(jì)算機(jī)基礎(chǔ),否則下面的書啃起來會(huì)很累。
當(dāng)你學(xué)完一遍算法、數(shù)據(jù)結(jié)構(gòu)、操作系統(tǒng)、計(jì)算機(jī)網(wǎng)絡(luò)后,再開始學(xué)習(xí)下面的內(nèi)容。
學(xué)習(xí) STL 源碼,閱讀《STL 源碼剖析》:https://book.douban.com/subject/1110934/
然后學(xué)習(xí) Linux 服務(wù)端編程,可以閱讀:
- 《Linux高性能服務(wù)器編程》:https://book.douban.com/subject/24722611/
-
《Linux多線程服務(wù)端編程》:https://book.douban.com/subject/20471211/
知識(shí)點(diǎn)
-
RAII
-
C++ 11 新特性
- 自動(dòng)類型推導(dǎo)
- lambda 表達(dá)式
- 智能指針
- 移動(dòng)語義
- 右值引用
- 標(biāo)準(zhǔn)多線程庫
- nullptr 關(guān)鍵字
-
類型轉(zhuǎn)換
- static_cast
- reinterpret_cast
- dynamic_cast
- const_cast
-
異常處理
- 棧解旋
- 異常接口聲明
- 異常對(duì)象生命周期
-
工具
- Clang Static Analyzer
- GDB
- CMake
- GCC
-
編譯工具
-
構(gòu)建工具
-
調(diào)試工具
-
靜態(tài)分析工具
-
編碼規(guī)范
- Google C++ Style
-
程序執(zhí)行原理
- 靜態(tài)鏈接
- 動(dòng)態(tài)鏈接
- 編譯
- 鏈接
-
STL 容器實(shí)現(xiàn)原理
- vector
- string
- list
- pair
- set
- map
- deque
- stack
三、計(jì)算機(jī)基礎(chǔ)
學(xué)習(xí)建議
由于 C++ 語言本身相對(duì)更底層,常用于系統(tǒng)開發(fā)、嵌入式、高性能計(jì)算等領(lǐng)域。因此 C++ 開發(fā)者相對(duì)于學(xué) Java 或其他方向的同學(xué)來說,需要具備更扎實(shí)、更深入的計(jì)算機(jī)基礎(chǔ)能力。
基礎(chǔ)不是短短幾天就能掌握的,需要持續(xù)學(xué)習(xí)、持續(xù)鞏固。因此建議想快速就業(yè)的同學(xué),可以先跳過這部分內(nèi)容,把更多的精力放在后面開發(fā)框架的學(xué)習(xí)上,爭取快速用 C++ 做出項(xiàng)目,等到面試前再去突擊補(bǔ)習(xí)基礎(chǔ)。而對(duì)于絕大多數(shù)計(jì)算機(jī)相關(guān)專業(yè)、或者學(xué)習(xí)時(shí)間比較富裕的同學(xué),建議每天花 1 - 2 小時(shí)左右持續(xù)學(xué)習(xí)并鞏固計(jì)算機(jī)基礎(chǔ),比如每天刷 2 - 3 道算法題,堅(jiān)持半年那就是 500 多道,面試的算法關(guān)就基本沒什么問題了。
知識(shí)點(diǎn)
主要包括以下 4 部分,每個(gè)部分都是難啃的硬骨頭:
- 計(jì)算機(jī)導(dǎo)論(計(jì)算機(jī)基本概念)
- 數(shù)據(jù)結(jié)構(gòu)和算法
- 操作系統(tǒng)
- 計(jì)算機(jī)網(wǎng)絡(luò)
四、軟件開發(fā)通用
學(xué)習(xí)建議
只要你想從事軟件開發(fā)方面的工作,以下這些知識(shí)點(diǎn),最好都按照順序?qū)W習(xí)一遍!
對(duì) C++ 開發(fā)來說,Linux 系統(tǒng)是重中之重。掌握 Linux 可以幫你更好地理解系統(tǒng)底層的運(yùn)行機(jī)制,比如進(jìn)程管理、內(nèi)存管理、文件系統(tǒng)、網(wǎng)絡(luò)傳輸?shù)取?/p>
除了 Linux 之外,軟件開發(fā)的其他通用技能都可以融入到日常學(xué)習(xí)中,而不是花一大段連續(xù)時(shí)間去專攻。比如企業(yè)項(xiàng)目研發(fā)流程,讀一遍有個(gè)印象就好;Git & GitHub 需要在平時(shí)做項(xiàng)目、用開源項(xiàng)目時(shí)多多使用;23 種主流的設(shè)計(jì)模式可以每天學(xué) 2 - 3 個(gè);軟件工程的專業(yè)知識(shí)大學(xué)科班一般都會(huì)教,學(xué)校不教的話作為一個(gè)課外知識(shí)去補(bǔ)充即可。
知識(shí)點(diǎn)
主要包括以下 5 部分:
- 企業(yè)項(xiàng)目研發(fā)流程
- Git & GitHub
- Linux 系統(tǒng)
- 設(shè)計(jì)模式
- 軟件工程
五、后端開發(fā)通用
學(xué)習(xí)建議
以下這部分知識(shí)點(diǎn)幾乎適用于所有后端方向的同學(xué)(比如 Java、Go、Python 等),比如數(shù)據(jù)庫、Redis、Nginx、消息隊(duì)列都是通用的。只不過不同編程語言的后端開發(fā)用到的具體的開發(fā)框架、編程語法會(huì)有差別,比如 Java 的主流開發(fā)框架有 Spring Boot、Netty 等,而 C++ 主流開發(fā)框架有 Boost、gRPC、crow 等。
如果你還在糾結(jié)學(xué) C++ 還是 Java,或者別的語言,不妨在能夠獨(dú)立做出項(xiàng)目的前提下,把最大的精力投入在數(shù)據(jù)庫、Redis、Nginx、消息隊(duì)列、架構(gòu)設(shè)計(jì)等通用后端開發(fā)技能。
知識(shí)點(diǎn)
- 數(shù)據(jù)庫
- 開發(fā)框架
- 包管理工具
- Redis
- 消息隊(duì)列
- Nginx
- 微服務(wù)
- 容器
- 架構(gòu)設(shè)計(jì)
由于這部分內(nèi)容的大多數(shù)知識(shí)點(diǎn)都和 魚皮的 Java 學(xué)習(xí)路線 一致,此處不再贅述,下面只列舉 C++ 學(xué)習(xí)和 Java 學(xué)習(xí)中有差異的地方。
數(shù)據(jù)庫
數(shù)據(jù)庫就是存放數(shù)據(jù)的庫,負(fù)責(zé)存儲(chǔ)、管理和檢索數(shù)據(jù)。
數(shù)據(jù)庫又分為關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫。關(guān)系型數(shù)據(jù)庫適用于存儲(chǔ)相互之間有關(guān)聯(lián)的數(shù)據(jù),比如做一個(gè)學(xué)生管理系統(tǒng),要存儲(chǔ)學(xué)生、班級(jí),一個(gè)班級(jí)有多個(gè)學(xué)生,這就是一種關(guān)聯(lián)關(guān)系,關(guān)系型數(shù)據(jù)庫典型的技術(shù)是 MySQL;而非關(guān)系型數(shù)據(jù)庫主要用于存儲(chǔ)零散的、相互獨(dú)立的數(shù)據(jù),典型的技術(shù)是 Redis。
此處我們主要學(xué)習(xí)的是關(guān)系型數(shù)據(jù)庫,并且以最主流、學(xué)習(xí)成本相對(duì)更低的關(guān)系型數(shù)據(jù)庫 MySQL 為主。
對(duì) C++ 同學(xué)來說,對(duì)數(shù)據(jù)庫的學(xué)習(xí)包括以下 4 個(gè)方面:
- 學(xué)習(xí)關(guān)系型數(shù)據(jù)庫理論:包括關(guān)系模型、關(guān)系代數(shù)、數(shù)據(jù)庫范式、事務(wù)理論等,能夠幫助你更好地理解數(shù)據(jù)庫的結(jié)構(gòu)和設(shè)計(jì)。
- SQL 語言:作為關(guān)系型數(shù)據(jù)庫的標(biāo)準(zhǔn)查詢語言,掌握 SQL 是非常重要的!學(xué)習(xí)過程以實(shí)踐為主,要能夠熟練使用 SQL 來操作數(shù)據(jù)庫(增刪改查)
- 數(shù)據(jù)庫設(shè)計(jì)和編程:學(xué)習(xí)如何根據(jù)實(shí)際業(yè)務(wù)場(chǎng)景來設(shè)計(jì)數(shù)據(jù)庫表、并且學(xué)習(xí)如何使用 C++ 來操作數(shù)據(jù)庫,這是企業(yè)開發(fā)中最重要的能力。
-
數(shù)據(jù)庫高級(jí):初學(xué)數(shù)據(jù)庫時(shí)這部分可以跳過。主要是學(xué)習(xí)數(shù)據(jù)庫的高級(jí)特性、底層原理、數(shù)據(jù)庫的分析、運(yùn)維、性能優(yōu)化等,可以幫助你更好地運(yùn)用數(shù)據(jù)庫來解決問題。
開發(fā)框架
ORM 框架,作用是操作數(shù)據(jù)庫。比如 ODB(https://www.codesynthesis.com/products/odb/ )、QxOrm 等,學(xué)習(xí)一個(gè)即可。
Web 開發(fā)框架:作用是編寫 HTTP 接口,可用于應(yīng)用的后端(類似 Java 的 Spring MVC)。比如 Drogon(https://github.com/drogonframework/drogon )、Pistache(https://github.com/pistacheio/pistache )等,學(xué)習(xí)一個(gè)即可。
RPC 框架,作用是遠(yuǎn)程調(diào)用其他的服務(wù),可用于實(shí)現(xiàn)分布式、微服務(wù)架構(gòu)。推薦學(xué)習(xí) Google 的 gRPC(https://github.com/grpc/grpc )。
其他框架可以從這個(gè)庫中按需學(xué)習(xí):https://github.com/fffaraz/awesome-cpp
包管理工具
作用是幫你管理復(fù)雜的 C++ 項(xiàng)目依賴包。建議學(xué)習(xí) conan:https://github.com/conan-io/conan
微服務(wù)
微服務(wù)是一種思想,可以使用上面提到的 gRPC 框架(https://github.com/grpc/grpc )實(shí)現(xiàn)微服務(wù)。
六、C++ 項(xiàng)目實(shí)戰(zhàn)
初學(xué) C++ 語法時(shí),最好的項(xiàng)目就是刷算法題目,因?yàn)槊康李}目本質(zhì)上就是在解決一個(gè)小問題。
由于 C++ 是個(gè)相對(duì)底層、注重基礎(chǔ)的編程語言,很多 C++ 的練手項(xiàng)目都是 “手寫輪子” 相關(guān)的,比如下面這些:
-
編程語言
- 用 C 語言實(shí)現(xiàn)自己的編程語言:https://buildyourownlisp.com/
-
開發(fā)工具
- 開發(fā)自己的文本編輯器:https://viewsourcecode.org/snaptoken/kilo/
-
工具庫
- 手寫簡易 STL:https://github.com/Alinshans/MyTinySTL
- 簡單 JSON 庫:https://github.com/dropbox/json11
-
開發(fā)框架
- 網(wǎng)絡(luò)編程庫 muduo:https://github.com/chenshuo/muduo
- 微信 RPC 框架 phxrpc:https://github.com/Tencent/phxrpc (簡化版的微信后臺(tái) RPC 框架,沖鵝廠的同學(xué)推薦看)
-
服務(wù)器
- 輕量級(jí) Web 服務(wù)器學(xué)習(xí):https://github.com/qinguoyi/TinyWebServer
- 牛客 Linux 服務(wù)器教程:https://www.nowcoder.com/courses/cover/live/504
- 高性能 web 服務(wù)器項(xiàng)目:https://github.com/linyacool/WebServer
-
分布式系統(tǒng)
- MIT6.824 中文教程:https://mit-public-courses-cn-translatio.gitbook.io/mit6-824/
C++ 的項(xiàng)目視頻比較少,建議大家在學(xué)做 C++ 項(xiàng)目的過程中多在網(wǎng)上搜索相關(guān)的文章和教程。
七、C++ 求職備戰(zhàn)
C++ 同學(xué)的面試重點(diǎn)主要分為 3 個(gè)大方向:
- C++ 語言本身
- 計(jì)算機(jī)基礎(chǔ)
- C++ 領(lǐng)域技能(比如后端、嵌入式、游戲開發(fā)等)
魚皮給大家找了一些經(jīng)典面試題,其中領(lǐng)域技能以后端為主,大家可以試著回答下。
C++ 面試題
- 是否關(guān)注過 C++ 的版本更新?比如 C++ 11 新增了哪些新特性?
- 什么是 C++ 的虛函數(shù)和純虛函數(shù)?它們分別有什么作用?
- 如果虛函數(shù)是有效的,那為什么不把所有函數(shù)設(shè)為虛函數(shù)?
- 什么是 C++ 的多態(tài)?它是怎么實(shí)現(xiàn)的?
- C++ 函數(shù)重載和覆蓋有什么區(qū)別?
- 什么是 C++ 的智能指針?它有什么作用?有哪些種類?
計(jì)算機(jī)基礎(chǔ)面試題
數(shù)據(jù)結(jié)構(gòu)和算法
- LeetCode 精選 100 道:https://leetcode-cn.com/problem-list/2cktkvj/
操作系統(tǒng)
- 什么是進(jìn)程和線程?二者有什么區(qū)別?
- 操作系統(tǒng)是如何做到進(jìn)程阻塞的?
- 有哪些常見的進(jìn)程通信方式?
- 進(jìn)程調(diào)度算法有哪些?
- 線程是如何實(shí)現(xiàn)的?
計(jì)算機(jī)網(wǎng)絡(luò)
- 介紹下計(jì)算機(jī)網(wǎng)絡(luò)分層結(jié)構(gòu),各層有哪些常用協(xié)議?
- TCP 和 UDP 協(xié)議有什么區(qū)別?分別適用于什么場(chǎng)景?
-
TCP 為什么需要三次握手和四次揮手?為什么不是兩次握手、四次握手?為什么不是三次揮手?
C++ 后端面試題
- 你用過哪些 C++ 網(wǎng)絡(luò)編程庫或 web 開發(fā)框架?
- 你用過哪些 C++ 日志框架?
- 什么是 socket 編程?C++ 中怎么進(jìn)行 socket 編程?
如果大家自學(xué)能力比較強(qiáng),比較推薦去 GitHub 的 C++ 專題尋找項(xiàng)目和更多學(xué)習(xí)教程:
- GitHub C++ 專區(qū):https://github.com/topics/cpp
-
GitHub C++ 內(nèi)容合集:https://github.com/fffaraz/awesome-cpp
以上,小伙伴們加油!
往期推薦
