鱼皮 C++ 学习路线一条龙!

共 12164字,需浏览 25分钟

 ·

2023-07-19 17:40


大家好,我是鱼皮 🧑🏻‍🦲。


最近有很多小伙伴私信问我有没有 C++ 的学习路线,其中甚至有刚高考完的朋友!


其实今年 4 月份我就已经写好了一份 6000 多字的完整 C++ 学习路线,提供给 编程导航 的鱼友学习。


但考虑到大家确实需要,所以决定还是把学习路线分享出来,精简了一些项目和资源,保留了核心的学习主线和方法,希望对 C++ 方向的同学有帮助。



在编写本路线时,鱼皮参考了多位 C++ 专业大佬的建议,但仍做不到完美,有意见和想法欢迎指正。





C++ 介绍





语言特性



比较官方,仅供参考



C++ 是一种面向对象的、通用的、静态类型的编程语言,它是 C 语言的一种扩展。


C++ 相对于其他高级语言(比如 Java)来说,更加底层,因此具有高性能、可移植、可重用等优点,被广泛应用于系统开发、嵌入式系统、服务端开发、游戏开发、图形学、音视频处理、金融分析等领域。


随着 C++ 的发展,它具有了丰富的语法和库支持,大学计算机专业的同学一般也会从 C++(C 语言)开始学起。





就业方向


C++ 的就业方向还是非常多的,比如:服务端开发、系统开发、客户端开发、嵌入式开发、游戏开发、音视频处理、图像处理、SDK 开发等。鱼皮建议大家 首先根据自己的兴趣爱好 来做选择。




虽然都是学 C++,但不同方向的工程师需要侧重掌握的技能和专业知识也是有区别的。但是如果你还没确定选什么具体的方向,不妨先掌握它们都要求的通用技能,即能够熟练使用 C++ 语法来编程。





选 C++ 还是 Java?


首先,明确一点,C++ 和 Java 都是非常优秀的主流编程语言,编程语言和技术没有绝对的优劣之分,只不过在不同的场景下,有更优的选择。而且,像很多大神说的一样,语言只是工具,编程思想才是核心。不过,选择好的工具也是至关重要的,“好的抓手才能带来更大的赋能”。


如果你对操作系统底层、嵌入式、图像处理、音视频处理、游戏开发等方向感兴趣,建议选择 C++;而如果你更喜欢开发应用系统、思考和实现业务逻辑,就选择 Java。


此外,因为 Java 和 C++ 都可以作为后端开发语言,所以无论把哪门语言作为主语言,都要重点学好后台开发通用知识,比如数据库、缓存、消息队列、Socket 通讯、Linux、Git、计算机基础知识等。但选择 C++ 的同学要对操作系统、网络和 Linux 更熟悉一些



鱼皮专门针对这个问题写了一篇文章,欢迎阅读:https://www.code-nav.cn/post/1640611259688742914





学习大纲


不同的 C++ 就业方向,要学的知识也是不同的,但是会有很多交集。


只要你学习 C++,C++ 的语法、Linux 服务器、操作系统、计算机网络等知识几乎都是必学的!(纯客户端界面开发除外,但最好也学习下)


本学习路线以 C++ 的主流岗位 —— 服务端开发为例,大致分为以下几个阶段:



  1. C++ 语法基础


  2. C++ 进阶


  3. 计算机基础


  4. 软件开发通用


  5. 后端开发通用


  6. C++ 项目实战


  7. C++ 求职备战



一、C++ 语法基础





学习建议


对于完全 0 编程基础的同学来说,不建议上来就去看《C Primer Plus》(或者《C++ Primer Plus》)这种很厚的书籍,可能会被劝退。


对于大多数入门的同学,快速上手语法、能写出代码是最重要的。所以建议这里还是看培训机构在 B 站的免费视频教程:https://www.bilibili.com/video/BV1et411b73Z/ ,它们做入门课真的是有一手。


如果你们学校是从 C 语言开始学起,可以看浙大翁恺老师的 C 语言入门课:https://www.bilibili.com/video/BV1dr4y1n7vA ,好评很多。


除了视频教程外,建议大家搭配一个文档教程(https://www.runoob.com/cplusplus/cpp-tutorial.html )一起学习,起到查漏补缺的作用。


初学 C++,除了学习基本的概念(比如变量、指针、引用)之外,一定要多上手敲代码练习、熟能生巧,还要能熟练地 debug 自己的程序,为以后开发更复杂的项目打好基础。


开发工具可以使用 Visual Studio(功能最强大)、Dev Cpp(最简单易用)、Code::Blocks(中规中矩)等。除了必须会用一款本地开发工具外,还可以搭配在线编程工具学习:https://www.runoob.com/try/runcode.php?filename=helloworld&type=cpp ,效率更高。


学完本阶段后,可以试着用 C++ 去做一个简单的 XX 管理系统(控制台里运行即可),或者做一些 LeetCode 上入门级别的算法题目、学校里的 OJ 等等。





知识点



  • 基础概念

    • 条件分支


    • 循环


    • 变量


    • 常量


    • 关键字


    • 数据类型


    • 运算符


    • 表达式


    • 控制结构



  • 开发工具


  • 函数

    • 函数重载


    • 默认参数



  • 基本数据结构

    • 数组


    • 字符串



  • 内存管理

    • 内存模型


    • 动态内存分配


    • 动态内存释放



  • 指针

    • 空指针


    • 野指针



  • 引用

    • 函数参数引用


    • 返回值引用



  • 结构体

    • 定义


    • 访问



  • 命名空间


  • 面向对象编程

    • 虚函数


    • 纯虚函数


    • 抽象类


    • 虚析构函数


    • 纯虚析构函数


    • 对象初始化顺序


    • 同名成员问题


    • 多继承


    • 虚继承


    • 菱形继承


    • 友元函数


    • 友元类


    • 成员变量


    • 成员函数


    • this 指针




    • 对象


    • 封装


    • 构造函数


    • 析构函数


    • 拷贝构造函数


    • 静态成员


    • 友元


    • 运算符重载


    • 继承


    • 多态



  • 异常处理

    • 抛出


    • 捕获


    • 异常类型


    • 标准异常



  • STL

    • 排序


    • 查找


    • 一元谓词


    • 二元谓词


    • vector


    • string


    • list


    • pair


    • set


    • map


    • deque


    • stack


    • 容器


    • 迭代器


    • 函数对象


    • 谓词


    • 内置函数对象


    • 算法



  • 类型转换


  • 模板

    • 函数模板


    • 类模板



  • 泛型


  • I / O 操作

    • 文件操作




二、C++ 进阶


上个阶段我们主要通过看视频来快速入门 C++ 基础编程语法;而这个阶段要做的是巩固基础、学习更多 C++ 的特性、甚至是底层原理,建议大家通过阅读经典书籍的方式来学习。


先系统学习 C++ 基础及进阶语法,可以读下面 2 本书籍:



  • 《C++ Primer Plus》:https://book.douban.com/subject/10789789/


  • 《Effective C++》:https://book.douban.com/subject/5387403/

学到这里,建议先去学习本路线第三阶段的计算机基础,否则下面的书啃起来会很累。


当你学完一遍算法、数据结构、操作系统、计算机网络后,再开始学习下面的内容。


学习 STL 源码,阅读《STL 源码剖析》:https://book.douban.com/subject/1110934/


然后学习 Linux 服务端编程,可以阅读:



  • 《Linux高性能服务器编程》:https://book.douban.com/subject/24722611/


  • 《Linux多线程服务端编程》:https://book.douban.com/subject/20471211/





知识点



  • RAII




  • C++ 11 新特性



    • 自动类型推导


    • lambda 表达式


    • 智能指针


    • 移动语义


    • 右值引用


    • 标准多线程库


    • nullptr 关键字



  • 类型转换



    • static_cast


    • reinterpret_cast


    • dynamic_cast


    • const_cast



  • 异常处理



    • 栈解旋


    • 异常接口声明


    • 异常对象生命周期



  • 工具



    • Clang Static Analyzer


    • GDB


    • CMake


    • GCC


    • 编译工具




    • 构建工具




    • 调试工具




    • 静态分析工具





  • 编码规范



    • Google C++ Style



  • 程序执行原理



    • 静态链接


    • 动态链接


    • 编译


    • 链接



  • STL 容器实现原理



    • vector


    • string


    • list


    • pair


    • set


    • map


    • deque


    • stack




三、计算机基础





学习建议


由于 C++ 语言本身相对更底层,常用于系统开发、嵌入式、高性能计算等领域。因此 C++ 开发者相对于学 Java 或其他方向的同学来说,需要具备更扎实、更深入的计算机基础能力。


基础不是短短几天就能掌握的,需要持续学习、持续巩固。因此建议想快速就业的同学,可以先跳过这部分内容,把更多的精力放在后面开发框架的学习上,争取快速用 C++ 做出项目,等到面试前再去突击补习基础。而对于绝大多数计算机相关专业、或者学习时间比较富裕的同学,建议每天花 1 - 2 小时左右持续学习并巩固计算机基础,比如每天刷 2 - 3 道算法题,坚持半年那就是 500 多道,面试的算法关就基本没什么问题了。





知识点


主要包括以下 4 部分,每个部分都是难啃的硬骨头:



  • 计算机导论(计算机基本概念)


  • 数据结构和算法


  • 操作系统


  • 计算机网络



四、软件开发通用





学习建议


只要你想从事软件开发方面的工作,以下这些知识点,最好都按照顺序学习一遍!


对 C++ 开发来说,Linux 系统是重中之重。掌握 Linux 可以帮你更好地理解系统底层的运行机制,比如进程管理、内存管理、文件系统、网络传输等。


除了 Linux 之外,软件开发的其他通用技能都可以融入到日常学习中,而不是花一大段连续时间去专攻。比如企业项目研发流程,读一遍有个印象就好;Git & GitHub 需要在平时做项目、用开源项目时多多使用;23 种主流的设计模式可以每天学 2 - 3 个;软件工程的专业知识大学科班一般都会教,学校不教的话作为一个课外知识去补充即可。





知识点


主要包括以下 5 部分:



  • 企业项目研发流程


  • Git & GitHub


  • Linux 系统


  • 设计模式


  • 软件工程



五、后端开发通用





学习建议


以下这部分知识点几乎适用于所有后端方向的同学(比如 Java、Go、Python 等),比如数据库、Redis、Nginx、消息队列都是通用的。只不过不同编程语言的后端开发用到的具体的开发框架、编程语法会有差别,比如 Java 的主流开发框架有 Spring Boot、Netty 等,而 C++ 主流开发框架有 Boost、gRPC、crow 等。


如果你还在纠结学 C++ 还是 Java,或者别的语言,不妨在能够独立做出项目的前提下,把最大的精力投入在数据库、Redis、Nginx、消息队列、架构设计等通用后端开发技能。





知识点



  • 数据库


  • 开发框架


  • 包管理工具


  • Redis


  • 消息队列


  • Nginx


  • 微服务


  • 容器


  • 架构设计

由于这部分内容的大多数知识点都和 鱼皮的 Java 学习路线 一致,此处不再赘述,下面只列举 C++ 学习和 Java 学习中有差异的地方。





数据库


数据库就是存放数据的库,负责存储、管理和检索数据。


数据库又分为关系型数据库和非关系型数据库。关系型数据库适用于存储相互之间有关联的数据,比如做一个学生管理系统,要存储学生、班级,一个班级有多个学生,这就是一种关联关系,关系型数据库典型的技术是 MySQL;而非关系型数据库主要用于存储零散的、相互独立的数据,典型的技术是 Redis。


此处我们主要学习的是关系型数据库,并且以最主流、学习成本相对更低的关系型数据库 MySQL 为主。


对 C++ 同学来说,对数据库的学习包括以下 4 个方面:



  1. 学习关系型数据库理论:包括关系模型、关系代数、数据库范式、事务理论等,能够帮助你更好地理解数据库的结构和设计。


  2. SQL 语言:作为关系型数据库的标准查询语言,掌握 SQL 是非常重要的!学习过程以实践为主,要能够熟练使用 SQL 来操作数据库(增删改查)


  3. 数据库设计和编程:学习如何根据实际业务场景来设计数据库表、并且学习如何使用 C++ 来操作数据库,这是企业开发中最重要的能力。


  4. 数据库高级:初学数据库时这部分可以跳过。主要是学习数据库的高级特性、底层原理、数据库的分析、运维、性能优化等,可以帮助你更好地运用数据库来解决问题。





开发框架


ORM 框架,作用是操作数据库。比如 ODB(https://www.codesynthesis.com/products/odb/ )、QxOrm 等,学习一个即可。


Web 开发框架:作用是编写 HTTP 接口,可用于应用的后端(类似 Java 的 Spring MVC)。比如 Drogon(https://github.com/drogonframework/drogon )、Pistache(https://github.com/pistacheio/pistache )等,学习一个即可。


RPC 框架,作用是远程调用其他的服务,可用于实现分布式、微服务架构。推荐学习 Google 的 gRPC(https://github.com/grpc/grpc )。


其他框架可以从这个库中按需学习:https://github.com/fffaraz/awesome-cpp




包管理工具


作用是帮你管理复杂的 C++ 项目依赖包。建议学习 conan:https://github.com/conan-io/conan





微服务


微服务是一种思想,可以使用上面提到的 gRPC 框架(https://github.com/grpc/grpc )实现微服务。




六、C++ 项目实战


初学 C++ 语法时,最好的项目就是刷算法题目,因为每道题目本质上就是在解决一个小问题。


由于 C++ 是个相对底层、注重基础的编程语言,很多 C++ 的练手项目都是 “手写轮子” 相关的,比如下面这些:



  • 编程语言

    • 用 C 语言实现自己的编程语言:https://buildyourownlisp.com/



  • 开发工具

    • 开发自己的文本编辑器:https://viewsourcecode.org/snaptoken/kilo/



  • 工具库

    • 手写简易 STL:https://github.com/Alinshans/MyTinySTL


    • 简单 JSON 库:https://github.com/dropbox/json11



  • 开发框架

    • 网络编程库 muduo:https://github.com/chenshuo/muduo


    • 微信 RPC 框架 phxrpc:https://github.com/Tencent/phxrpc (简化版的微信后台 RPC 框架,冲鹅厂的同学推荐看)



  • 服务器

    • 轻量级 Web 服务器学习:https://github.com/qinguoyi/TinyWebServer


    • 牛客 Linux 服务器教程:https://www.nowcoder.com/courses/cover/live/504


    • 高性能 web 服务器项目:https://github.com/linyacool/WebServer



  • 分布式系统

    • MIT6.824 中文教程:https://mit-public-courses-cn-translatio.gitbook.io/mit6-824/


C++ 的项目视频比较少,建议大家在学做 C++ 项目的过程中多在网上搜索相关的文章和教程。




七、C++ 求职备战


C++ 同学的面试重点主要分为 3 个大方向:



  1. C++ 语言本身


  2. 计算机基础


  3. C++ 领域技能(比如后端、嵌入式、游戏开发等)

鱼皮给大家找了一些经典面试题,其中领域技能以后端为主,大家可以试着回答下。





C++ 面试题



  1. 是否关注过 C++ 的版本更新?比如 C++ 11 新增了哪些新特性?


  2. 什么是 C++ 的虚函数和纯虚函数?它们分别有什么作用?


  3. 如果虚函数是有效的,那为什么不把所有函数设为虚函数?


  4. 什么是 C++ 的多态?它是怎么实现的?


  5. C++ 函数重载和覆盖有什么区别?


  6. 什么是 C++ 的智能指针?它有什么作用?有哪些种类?




计算机基础面试题




数据结构和算法



  • LeetCode 精选 100 道:https://leetcode-cn.com/problem-list/2cktkvj/



操作系统



  1. 什么是进程和线程?二者有什么区别?


  2. 操作系统是如何做到进程阻塞的?


  3. 有哪些常见的进程通信方式?


  4. 进程调度算法有哪些?


  5. 线程是如何实现的?



计算机网络



  1. 介绍下计算机网络分层结构,各层有哪些常用协议?


  2. TCP 和 UDP 协议有什么区别?分别适用于什么场景?


  3. TCP 为什么需要三次握手和四次挥手?为什么不是两次握手、四次握手?为什么不是三次挥手?





C++ 后端面试题



  1. 你用过哪些 C++ 网络编程库或 web 开发框架?


  2. 你用过哪些 C++ 日志框架?


  3. 什么是 socket 编程?C++ 中怎么进行 socket 编程?

如果大家自学能力比较强,比较推荐去 GitHub 的 C++ 专题寻找项目和更多学习教程:



  • GitHub C++ 专区:https://github.com/topics/cpp


  • GitHub C++ 内容合集:https://github.com/fffaraz/awesome-cpp




以上,小伙伴们加油!


往期推荐



我的学习小圈子




我在鱼厂的实习生活




给学弟妹们的秋招建议!




给我们前端看的项目调试指南




15 个 yyds 的开源项目!




上线啦!



浏览 53
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报