前言:为什么学 C++
说实话,写这篇前言的时候我想了很久——到底该用什么语气来开这个头。如果只是冷冰冰地列一堆"C++ 很强"的理由,那跟翻 Wikipedia 没什么区别,实在没什么意思。所以我想换一种方式:聊聊我自己为什么要折腾 C++,以及为什么我觉得在 2026 年的今天,C++ 依然值得你花时间认真学习。
这套教程的由来
先交代一下背景。这套教程的起点其实是一个很私人的动机——我在做嵌入式开发的过程中,越来越觉得纯 C 写到后面力不从心。手动管理资源、到处传递回调函数指针、用宏做泛型——这些套路用久了,代码膨胀得让人头疼,维护成本也越来越高。我就在想,有没有一种方式,既不丢掉 C 那种"贴近硬件"的控制力,又能用上更现代的语言特性来组织代码?答案当然就是 C++,而且不是那种九十年代的"C with Classes",而是从 C++11 开始一路进化到 C++23 的现代 C++。(笔者的现代C++之旅是《Effective Modern C++》可以说是把我的对之前的C++的观念打穿了)
后来等到我确实稍微会了点C++之后(真的只有一丁点。。。跟其他大佬比),却发现现在很多所谓的现代C++教程说的是C++11,而且还有不少feature已经被淘汰或者再更新的C++中有更好的方案了!
嘛,AI时代,学习肯定容易了多。我就想——可不可以做一个Mono C++合集仓库,把我手头的笔记梳理整理一下,化作一个更加完备的基础教程呢?这就是这个仓库
https://github.com/Awesome-Embedded-Learning-Studio/Tutorial_AwesomeModernCPP
和这一卷的由来,当然还有其他卷,笔者再慢慢整理自己的笔记,加LLM看看有没有可以扩展的点。这就是这一组教程的由来。就这么简单。我努力让这本教程看起来,额,不像是一本语言律师手册,也不是一份官方标准文档的翻译——它是一位挣扎于C++(天天仰望各种大跌.png)的学习笔记,记录了从零开始掌握 C++ 的完整旅程
Q: 有LLM生成的内容嘛? A: 有,我承认这一点。我看来LLM是一个好工具,但是它不够可靠。所以我对自己的要求是,发布内容要重写,至少争取抹掉LLM的痕迹——起码这是我对我严肃的发布内容所尽到的一个责任。
C++ 到底用在哪些地方
如果你还在犹豫"学 C++ 有没有前途",那我们来看看真实世界里的 C++ 到底在干什么。
游戏行业几乎是 C++ 的主场。Unreal Engine 从诞生之初就用 C++ 构建核心,直到今天仍然是 Triple-A 游戏开发的首选引擎;Unity 的底层运行时同样是 C++;哪怕是近年来很火的 Godot 引擎,其核心模块也是用 C++ 写的。游戏行业对性能的极致追求——每帧 16 毫秒的预算、数百万面的实时渲染、物理模拟和 AI 逻辑——让 C++ 在这个领域几乎不可替代。
操作系统和基础软件更是 C++ 的传统领地。Windows 的核心组件大量使用 C++,macOS 的许多系统框架同样如此。Linux 内核本身虽然坚持用 C,但围绕它的整个用户态生态——从桌面环境到图形驱动——C++ 扮演着举足轻重的角色。数据库领域更不用说,MySQL、PostgreSQL、MongoDB、Redis 这些名字,每一个的核心实现都离不开 C++。
浏览器可能是 C++ 最成功的应用场景之一。Chrome 的渲染引擎 Blink、Firefox 的 Gecko、Safari 的 WebKit——这些每天被数十亿人使用的软件,全部是 C++ 写的。浏览器需要做的事情极其复杂:解析 HTML 和 CSS、执行 JavaScript、渲染页面、管理网络请求和缓存,同时还得保持 60fps 的流畅度,这对语言的性能要求近乎苛刻。(笔者的工作就有跟chrominum打交道,天,C++写的很不错,很多组件概念我会拎出来讲讲,比如说我比较喜欢的WeakPtr/Factory组件)
高频交易和金融系统也是 C++ 的深度用户。在纳秒级延迟的竞争中,每一微秒都意味着真金白银,C++ 的零开销抽象和精确的内存控制能力让它成为量化交易系统的标配语言。编译器和开发工具同样如此——Clang 和 GCC 的核心都是 C++,甚至连 Python、Java 这样"更高层"的语言,它们的解释器和虚拟机底层也大量依赖 C++(CPython 的参考实现、JVM 的 HotSpot 编译器都是经典的例子)。
而在嵌入式领域——这是这套教程特别关注的场景——从 STM32 单片机上的外设驱动,到 RTOS 的任务调度,到 Linux 嵌入式上的系统级编程,C++ 正在逐步替代传统的纯 C 方案,因为现代 C++ 提供的类型安全和零开销抽象,在资源受限的环境中格外有价值。这也是我这个教程最初想要打出来(试图打出来差异化的)的价值。笔者自己喜欢嵌入式,虽然水平很烂就是。
C++ 的独特之处在哪里
说到这里你可能会问:性能好的语言又不是只有 C++,Rust 不是也很强吗?Go 不是也很快吗?为什么偏偏要学 C++?
这个问题问得好。我们先不急着下结论,来看一个 C++ 的核心理念——零开销抽象(zero-overhead abstraction)。这句话是 Bjarne Stroustrup 说的,大意是:你不需要为你没有用到的功能付出任何运行时代价,而你用到的功能,手写代码也不会比编译器生成的更快。这意味着你可以在 C++ 中使用模板、RAII、智能指针、lambda 表达式这些高层抽象来组织代码,同时编译器会把它们优化到跟手写 C 代码几乎一样的机器指令。这种"高层抽象 + 底层控制"的双重能力,是 C++ 最核心的竞争优势。
Rust 确实是一门非常优秀的语言,它的所有权系统和借用检查器在内存安全方面做出了革命性的贡献。但现实情况是,截至 2026 年,C++ 仍然拥有超过 1600 万开发者,全球第四大流行语言的位置稳如磐石,数以十亿计的代码库在持续运行。Rust 的生态还在成长期,而 C++ 的生态已经深植于操作系统、游戏引擎、编译器、数据库这些关键基础设施的骨髓里。这不是说 Rust 不好,而是说 C++ 的积累太厚了——几十年的标准库、第三方库、工具链、社区经验和文档资源,不可能在短期内被替代。
而且 C++ 自己也没有停滞不前。从 C++11 开始,这个语言经历了一次脱胎换骨的现代化:auto 类型推导、移动语义、智能指针、lambda、constexpr 编译期计算、模块(modules)、概念(concepts)、协程(coroutines)、范围(ranges)——几乎每三年一个新标准,持续在改进语言的表达力和安全性。即将到来的 C++26 更是重量级——静态反射(static reflection)、契约(contracts)、异步发送器(sender/receiver)等特性已经进入标准,这些将再一次改变我们写 C++ 的方式。所以"学 C++ 是不是在学一门过时的语言"这个担忧,在 2026 年真的可以放下了。
当然诚实的讲,这也是一门负担。我自己就经历了学C++98到学现代C++的流程,说真的痛苦的,真的很痛苦。这也造成了他对那些想要快速做程序的朋友而言,一点也不友好。所以,C++(我甚至想说,包含C)真的不适合对计算机本身没兴趣的朋友。跟内存,CPU甚至可能还有磁盘近距离打交道并非儿戏。
这卷教程覆盖什么内容
说了这么多"为什么要学",现在来说说"我们具体学什么"。
这一卷是整个教程体系的基础篇,目标是帮你建立扎实的 C++ 基本功。我们不会一上来就讲模板元编程或者内存模型那种硬核话题——那是后面几卷的事情。这一卷的内容安排是循序渐进的:
首先是环境搭建和第一个程序的运行,让你把开发环境跑起来,亲手编译执行一段 C++ 代码,感受一下从源码到可执行文件的完整过程。然后我们进入类型系统和值类别,理解 C++ 怎样看待数据——整型、浮点、指针、引用,以及左值和右值的区别。接下来是控制流,覆盖条件分支、循环和基本的程序逻辑组织。再往后是函数——参数传递、返回值、重载和默认参数,这些是构建复杂程序的基本单元。
在此之上,我们开始接触面向对象编程:类与对象、构造与析构、继承与多态、运算符重载。这些是 C++ 的核心范式,也是理解后续高级特性的基础。最后我们会涉及模板基础、异常处理、STL 标准库概览和内存管理模型,让你对 C++ 的全貌有一个基本的把握。
需要注意的是,这一卷主要覆盖 C++ 的基础知识和 C++98 时代的核心特性。现代 C++(C++11 及之后)的深入探讨——包括移动语义、智能指针、lambda、constexpr、RAII 等——将在后续的卷中展开。所以如果你已经有一定的 C++ 基础,觉得这里太简单,可以直接跳到后面的卷去挑战更有意思的内容。但如果你是新手,或者想系统地巩固一下基础,那我强烈建议按顺序读下去——后面的内容都建立在前面的理解之上。
如果你完全没有 C 语言背景,也不用担心。我们在本卷中提供了一个独立的 C 语言教程子目录,涵盖了从数据类型、指针、数组到结构体、内存管理的完整 C 语言基础。你可以先花一些时间过一遍 C 语言教程,建立起对底层内存模型和指针操作的基本认知,然后再回来学 C++——这样会顺畅很多。
怎样使用这套教程
关于使用方法,我有几点非常实际的建议。
按顺序阅读,不要跳跃。 这套教程是精心设计过顺序的,后面的内容经常引用前面已经解释过的概念。如果你跳着读,很可能会在中途遇到看不懂的地方,然后被迫回头找——这样反而更浪费时间。如果你实在觉得某一部分你已经掌握了,可以快速浏览一遍确认自己没有遗漏,但尽量不要完全跳过。
把代码自己敲一遍。 这不是客套话。看懂一段代码和亲手把它敲出来、编译运行、看到输出结果,完全是两种不同的学习体验。你会在敲代码的过程中发现各种意想不到的小问题——拼写错误(孩子们int mian并不好笑)、忘记加分号(你没有再写python)、头文件没包含(谁家implicit declaration of XXX)——这些都是真实编程的一部分,早点遇到、早点习惯,比什么都强。所以哪怕教程里的示例代码看起来再简单,也请你自己动手敲一遍。
LLM好用,我自己都用AI偷懒,这很正常。但是学习阶段,真的不建议偷懒。我自己就是看着我的兄弟偷懒然后被undefined reference肘碎了一地,最后发现自己编译技术常识不过关导致的。跟C++没太大关系这个例子,但是足以说明一些问题了。
遇到不懂的地方先自己思考,但不要死磕。 如果某个概念看了两三遍还是不理解,先标记下来继续往后读。很多概念在后续的实际应用中会变得清晰起来,因为上下文变了,你的理解也会随之加深。但如果回过头来还是不懂,可以去找社区讨论(我不知道有没有后AI时代的朋友,我自己是CSDN,stackoverflow常客,没有AI的时代,我就是这些社区的代码搬运大户(真的给这些爹跪下了))或者查阅 cppreference.com 上的详细说明。
准备好了就开始吧
写到这里,我觉得该说的铺垫基本都交代清楚了。C++ 是一门有深度的语言,学习曲线确实不算平缓——这一点我不会忽悠你。但它也是一门回报极其丰厚的语言:当你真正理解了 RAII 的优雅、模板的威力、零开销抽象的哲学,你会发现写 C++ 是一件非常痛快的事情。
这套教程不会让你一夜之间变成 C++ 专家——没有任何教程能做到这一点。但它会陪你一步一步走完整条路,从最基础的类型和变量,到面向对象的设计,到模板和标准库的使用,每一阶段都给出清晰的解释和可运行的代码。我们不需要天赋异禀,也不需要科班出身,需要的只是耐心和动手的意愿。
好了,废话不多说了。下一章我们从搭建开发环境开始,让编译器跑起来,写我们的第一个 C++ 程序。
我们上路了。