C++ 学习路线

by 程序员鱼皮 编程导航

C++ 介绍

语言特性

比较官方,仅供参考

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

C++ 语言支持多种编程范式,包括面向对象编程、泛型编程和过程式编程等,因此具有很高的灵活性和可扩展性。

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

C++ 标准语法的发展也是非常快的,目前最新的标准都到 C++ 20 了!而且随着它的发展,它具有了丰富的语法和库支持,大学计算机专业的同学一般也会从 C++(C 语言)开始学起。

就业方向

C++ 的就业方向还是非常多的,鱼皮建议大家 首先根据自己的兴趣爱好 来做选择。

服务端开发

一般就是我们常说的后端开发了。C++ 语言在高性能服务器开发、大数据处理、金融领域等都有广泛应用。对于用户 / 并发量非常高的系统(比如微信),通常会选择更高性能的 C++ 框架来开发。服务端开发工程师除了要学习后端都要学习的通用知识(比如数据库、缓存),还需要更熟悉网络编程、并发编程、内存管理等技术。

系统开发

高性能的 C++ 无疑是系统开发的王牌语言!系统开发工程师负责设计和实现操作系统、驱动程序、嵌入式系统、网络协议栈等 系统级 软件,从事这个岗位必须熟练掌握 C++ 的语法、各种数据结构、算法、多线程编程、Linux 操作系统等技术。

客户端开发

一般是指开发用户看的到的界面。C++ 语言在桌面应用程序、移动应用程序和游戏开发中有着广泛应用。C++ 客户端开发工程师和前端开发有着相似的学习要求,都需要掌握 GUI 编程、布局知识、跨平台开发技术。现在主流的开发软件是 Qt(鱼皮的毕设就是用它做的)。

嵌入式开发

也是考虑到 C++ 的高性能,它被广泛应用于开发网络设备、汽车电子、智能家居、医疗设备等产品。嵌入式开发工程师和系统开发工程师的学习路径有相似之处,都需要学好 C++ 系统级编程以及操作系统知识。此外,嵌入式开发还需要了解硬件、嵌入式开发平台和相关工具。

游戏开发

C++ 语言是游戏开发的主语言之一(另一个是 C#),比如当下很火的虚幻引擎的主语言就是 C++!对于游戏开发工程师,最重要的是热爱游戏!然后游戏开发也分界面和后台开发,前者需要熟悉游戏引擎、图形学、物理引擎等技术,后者和服务端开发的要求差不多,都要学好网络编程、并发编程。

音视频处理

还是考虑到 C++ 的高性能,它在音视频编解码、视频渲染等领域有着非常广泛的应用!音视频处理工程师除了 C++ 基础知识外,还需要熟悉音视频格式、编解码技术、图形学等相关技术。

图像处理

和音视频处理类似,都属于 C++ 计算类工作。图像处理工程师需要熟悉图像处理算法、计算机视觉等,掌握各种 C++ 的图像处理库和相关算法。图像处理和音视频处理这方面的工作细分内容可能比较多,而且这类工作对数学会有一定要求,有些公司可能把它们定义为 “算法工程师”。

SDK 开发

C++ 也适用于开发各种 SDK(软件开发工具包)。SDK 开发工程师需要熟悉 C++ 的语言特性、SDK / API 的设计和接口开发、掌握软件开发原则和设计模式,要能够设计出易用、高性能、可靠的 SDK 接口,提供给其他开发者使用。国内这方面的岗位没那么多,很多时候合并到后端(服务端)开发了。


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

选 C++ 还是 Java?

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

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

不过对于身在校园、且时间充裕的同学来说,我更建议 “我全都要”。可以先学 C 语言或 C++ 打基础(这也是大部分计算机专业学生在高校内学到的第一门编程语言),因为它相对底层,能帮助你接触到更多计算机的概念,比如操作系统资源管理、网络通讯等,从而为学习其他的编程语言做铺垫。然后再学习 Java 来做项目、找工作。

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

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

学习建议

  1. 基础一定要打牢!这是 C++ 相对于 Java 这种上层语言来说最重要的一个建议,因为 C++ 可以更灵活地操作系统(比如自主分配内存),所以如果基础不牢固,你不仅不能发挥出 C++ 的高性能等特性,反而还可能写出更辣鸡的程序。像 C++ 基础特性(指针、引用等)、操作系统、计算机网络、算法数据结构等计算机基础都要认真去学。
  2. 其他的建议就不是 C++ 的专属了,学任何编程语言都一样,要多练习语法、多学习类库框架、多实践做项目、多读别人的项目和开源代码、多积累总结等等。

学习大纲

不同的 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 本书籍:

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

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

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

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

网上有很多博主还推荐下面 2 本书,但是难度比较大,请大家根据学习进度和自身能力选择性阅读:

知识点

  • RAII
  • C++ 11 新特性
    • 自动类型推导
    • lambda 表达式
    • 智能指针
    • 移动语义
    • 右值引用
    • 标准多线程库
    • nullptr 关键字
  • 类型转换
    • static_cast
    • reinterpret_cast
    • dynamic_cast
    • const_cast
  • 异常处理
    • 栈解旋
    • 异常接口声明
    • 异常对象生命周期
  • 工具
    • 编译工具
      • GCC
    • 构建工具
      • CMake
    • 调试工具
      • GDB
    • 静态分析工具
      • Clang Static Analyzer
  • 编码规范
    • Google C++ Style
  • 程序执行原理
    • 编译
    • 链接
      • 静态链接
      • 动态链接
  • STL 容器实现原理
    • vector
    • string
    • list
    • pair
    • set
    • map
    • deque
    • stack

三、计算机基础

学习建议

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

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

知识点

点击可跳转到该知识点的详细学习路线

四、软件开发通用

学习建议

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

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

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

知识点

点击可跳转到该知识点的详细学习路线

by 程序员鱼皮 知识星球

五、后端开发通用

学习建议

以下这部分知识点几乎适用于所有后端方向的同学(比如 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. 数据库高级:初学数据库时这部分可以跳过。主要是学习数据库的高级特性、底层原理、数据库的分析、运维、性能优化等,可以帮助你更好地运用数据库来解决问题。

详细学习路线请参考:https://www.code-nav.cn/post/1641797333479903234

开发框架

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

Redis

详细学习路线请参考:https://www.code-nav.cn/post/1640589994284695553

消息队列

参考:https://www.code-nav.cn/post/1640584449888772098#heading-93

Nginx

参考:https://www.code-nav.cn/post/1640584449888772098#heading-98

微服务

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

容器

参考:https://www.code-nav.cn/post/1640584449888772098#heading-116

架构设计

参考:https://www.code-nav.cn/post/1640584449888772098#heading-169

六、C++ 项目实战

初学 C++ 语法时,最好的项目就是刷算法题目,因为每道题目本质上就是在解决一个小问题。参考鱼皮的 数据结构和算法学习路线

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

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

大家也可以从以下网站中挑选自己感兴趣的项目去学习:

七、C++ 求职备战

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

  1. C++ 语言本身
  2. 计算机基础
  3. C++ 领域技能(比如后端、嵌入式、游戏开发、客户端开发等)

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

C++ 面试题

  1. 是否关注过 C++ 的版本更新?比如 C++ 11 新增了哪些新特性?
  2. 什么是 C++ 的虚函数和纯虚函数?它们分别有什么作用?
  3. 如果虚函数是有效的,那为什么不把所有函数设为虚函数?
  4. 什么是 C++ 的多态?它是怎么实现的?
  5. C++ 函数重载和覆盖有什么区别?
  6. 什么是 C++ 的智能指针?它有什么作用?有哪些种类?
  7. 什么是 C++ 的模板?你在开发中是怎么运用模板的?
  8. 什么是 C++ 的动态内存分配?用它有什么优缺点?
  9. 什么是 C++ 的友元函数?它有什么作用?
  10. 什么是 C++ 的 STL?你用过哪些 STL,是否有了解过 STL 的底层实现?
  11. 指针和引用有什么区别?各自的应用场景是什么?
  12. 如何计算一个类或结构体的大小?
  13. C++ 会出现内存泄漏么?有哪些避免内存泄漏的方法?
  14. new 和 malloc 有什么区别?
  15. C++ 中有几种类型转换的方法?

计算机基础面试题

数据结构和算法

操作系统

  1. 什么是进程和线程?二者有什么区别?
  2. 操作系统是如何做到进程阻塞的?
  3. 有哪些常见的进程通信方式?
  4. 进程调度算法有哪些?
  5. 线程是如何实现的?
  6. 什么是 CPU 的缓存?
  7. 什么是内核态和用户态?二者有什么区别?
  8. 操作系统是怎么实现锁的?
  9. 什么是死锁,什么情况下会出现死锁(必要条件)?怎么预防和处理?
  10. 什么是系统调用?
  11. 操作系统如何进行内存管理?

计算机网络

  1. 介绍下计算机网络分层结构,各层有哪些常用协议?
  2. TCP 和 UDP 协议有什么区别?分别适用于什么场景?
  3. TCP 为什么需要三次握手和四次挥手?为什么不是两次握手、四次握手?为什么不是三次挥手?
  4. TCP 滑动窗口和拥塞控制机制
  5. TCP 如何保证可靠性?
  6. HTTP 协议常用状态码和含义
  7. HTTP 和 HTTPS 协议的区别?
  8. HTTP/1.0、1.1、2.0 有哪些区别和改进?

C++ 后端面试题

  1. 你用过哪些 C++ 网络编程库或 web 开发框架?
  2. 你用过哪些 C++ 日志框架?
  3. 什么是 socket 编程?C++ 中怎么进行 socket 编程?
  4. C++ 有没有 ORM 框架?你用过哪些?
  5. 你是怎么在 C++ 中进行多线程编程的?
  6. 什么是 I/O 多路复用?如何使用 epoll 和 select 等 I/O 多路复用技术?
  7. 有哪些知名技术(或框架)是用 C++ 实现的?是否有了解过它们的实现原理?
  8. 是否了解过设计模式?请用 C++ 实现单例模式

资源

建议大家可以多主动看看各公司的招聘要求(尤其是大厂的要求),确认自己的学习重点。

校招岗位

社招岗位

实习

学习资源

知识总结

自学 C++ 专题资源


小伙伴们加油!

玄机博客
© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容