嗨!大伙好!欢迎来到C++
没有“说实话”这三个字,说的就是实话!最开始的时候,这个开头很一般,是我在项目最开始起头的时候书写的。没有想到会有一天,这个项目会变得越发的热闹!这使得我打算打起精神来,拿起我的键盘,准备好好的编写这个开头。
我不是语言神棍,说真的我一点都不想变成XX语言的忠实粉丝这种人。我始终认为语言是用来解决问题的一种表达,只有合适和不合适的表达,没有正确不正确的表达(这也是笔者后续希望建立的教程的一个基线:说明他合适在什么地方上,并且分析他的利弊,给我们这些编程爱好者一个新的思考,而不是新的教条。即:不指望一个特性可以解决所有的工程难题)
所以,正常而言,大部分教程会在这里向您吹捧——嘿我们的C++非常的新鲜,非常的美味,非常的牛逼。笔者偏不。我只是想从自己从事的工作,写过的代码,坐下来陪大家聊一下。为什么我们会坐在这里,谈论“Why C++?”的问题。
我另外的意思是:如果只是冷冰冰地列一堆"C++ 很强"的理由,那跟翻 Wikipedia 没什么区别,实在没什么意思。所以我想换一种方式:聊聊我自己为什么要折腾 C++,以及为什么我觉得在 2026 年的今天,C++ 依然值得你花时间认真学习。
这套教程的由来
Every Journey owns its beginning, 我们也是,我们的征程也将至少横跨10卷,可能更多。笔者的起点源于2025年12月份,一次午饭的时间(是的,没有任何的神圣的时刻,纯粹是吃饱了撑着),我坐在公司的饭堂里,突然想起来我写嵌入式的日子了。笔者现在是从事C++的大前端开发工作,用的也是现代C++。回忆让我萌生探索了明明是近邻的C和C++,为什么写起来如此感觉不同的想法。
如何不同呢?简单的说一下吧! 这篇教程也要求各位至少对C是熟悉的,如果您似乎遗忘了C,请抵达C前置内容,从这里开始您的征程。如果您干脆不会C,可能这份征程谈不上适合您。但是没关系,您仍然可以继续,只是梯度上略感不同。 C 很简朴,简朴到您可以望穿他成为汇编的样子,但是他又麻烦,他不适合维护即高速迭代,又有极高稳定性要求的大项目。咱们需要手动管理资源、到处传递回调函数指针、用宏做泛型——这些套路用久了,代码膨胀得让人头疼,维护成本也越来越高。C++,在您学习之后,会注意到他跟C还是存在不小的区别的。
我面对我的辣椒小炒肉,就在想,有没有一种方式,既不丢掉 C 那种"贴近硬件"的控制力,又能用上更现代的语言特性来组织代码?答案当然就是 C++,而且不是那种九十年代的"C with Classes",而是从 C++11 开始一路进化到 C++23 的现代 C++。
笔者的现代C++之旅是《Effective Modern C++》可以说是把我的对之前的C++的观念打穿了,这里也向大家推介一下这本书来快速浏览现代C++,尽管,他不适合学习更加现代的C++,主要还是集中在C++11了,但是入门观念,很合适。
我的确会一点 C++(真的只有一丁点。。。跟其他大佬比),也发现不少了优秀的现代C++教程,但是更多的,在我那个时候,很多所谓的现代C++教程说的是C++11,而且还有不少feature已经被淘汰或者再更新的C++中有更好的方案了!
嘛,AI时代,学习肯定容易了多。我就想——可不可以做一个Mono C++合集仓库,把我手头的笔记梳理整理一下,化作一个更加完备的基础教程呢?这就是这个仓库
https://github.com/Awesome-Embedded-Learning-Studio/Tutorial_AwesomeModernCPP
和这一卷的由来,当然还有其他卷,笔者再慢慢整理自己的笔记,加LLM看看有没有可以扩展的点。让整条链路看起来尽可能通顺,让仍然在嵌入式中写C的朋友尝试一些新鲜的东西!
后来做着做着,干脆做的更加通用了。Tutorial Awesome Modern C++。我努力让这本教程看起来,额,不像是一本语言律师手册,也不是一份官方标准文档的翻译——它是一位挣扎于C++(天天仰望各种大跌.png)的学习笔记,记录了从零开始掌握 C++ 的完整旅程
Q: 今天重写了我都还要在重新QA一次。有LLM生成的内容嘛? A: 有,我承认这一点。我看来LLM是一个好工具,但是它不够可靠。所以我对自己的要求是,发布内容要重写,至少争取抹掉LLM的痕迹——起码这是我对我严肃的发布内容所尽到的一个责任。
C++ 到底用在哪些地方
如果你还在犹豫"学 C++ 有没有前途",那,我们来看看真实世界里的 C++ 到底在干什么。
我们先看两个能直接找到开发文档的例子。游戏开发中,Unreal Engine 提供了完整的 C++ 编程入口;浏览器里,Chromium 的 Blink 渲染引擎通过 C++ API 与宿主通信。笔者自己的工作就有跟 Chromium 打交道,后面也会拎出一些喜欢的组件来讲,比如 WeakPtr / Factory。学会 C++,能让我们直接读到这些工程的实现,理解接口后面到底发生了什么。
不过,列举应用领域时得把 C 和 C++ 分清楚。举个例子吧! PostgreSQL 主要用 C 开发,CPython 也是以 C 实现的 Python 解释器;不能因为一个项目关心性能、贴近底层,就认定它是 C++ 项目。语言选型也不是比赛,现有代码、工具链、团队经验和资源预算,都比“谁的排名更高”具体得多。
而在嵌入式领域——这是这套教程特别关注的场景——我们关心的是,怎样在已有的 C 驱动和硬件接口之上,用 C++ 更清楚地表达资源归属、接口约束和模块关系。后面的 STM32 实战会沿着这个方向展开。并不是所有平台都适合启用所有语言特性,得把编译器支持、代码体积和运行成本一起算进去。这也是笔者想让这套教程多做实测的原因。
所以,为什么偏偏是C++
说到这里你可能会问:性能好的语言又不是只有 C++,Rust 不是也很强吗?Go 不是也很快吗?为什么偏偏要学 C++?
可能会有朋友说:“嘿,你是不是要开始吵架了”?
并不是,其实我的回答是:没有真的必要。因为上面这个问题缺失工程场景,我们无从回答。我的回答是:恰好我最熟悉的一门广为使用的就是C++。仅此而已。我没有计划找更多的理由辩护C++
Rust, Go这些语言的确正在席卷全球,逐渐蔓延到任何要求高性能,高并发的场景。对于C++,大部分情况下,是作为大家可能的第一门真正的,可以多范式编程的高级编程语言。从这里入手,我们可以看到计算机编程上常见的,甚至可以说是所有的编程理念。让我们进一步的深入理解我们即将前往的领域。他们可以是高性能计算,嵌入式工程,后端,甚至是笔者所在的大前端。等等任何岗位,和工作上。他的历史的厚重,理解发生了什么,为什么如此演进本身,就是在让我们入门计算机的世界,从寄存器CPU电路级别的底,到大家互联网冲浪使用的浏览器的顶。
换而言之,通过学习C++,我们希望可以更加理性的回答:“为什么C++或者其他的编程语言,适合和不适合在这里作为解决方案的原因”。而上面提到的 Rust 和 Go 等语言也各有适合的工程场景。我们在这里学 C++,主要是为了理解和维护自己关心的 C++ 工程,并练习在底层控制和代码组织之间做取舍,不需要靠开发者人数或者排行榜来证明这个选择。我也希望各位可以从语言神教中解脱出来,并且告诉自己:“Just A Choice, Whatever”。如果这份教程可以帮助你走到这里,那是我的荣幸。
这套教程以 C++11–C++23 为主线:例如 auto 类型推导、移动语义和 lambda 从 C++11 起提供,concepts、协程和 ranges 则从 C++20 起提供。读到具体特性时,我们会标注标准版本并验证示例;更新标准的内容留给对应专题,不作为入门的前置条件。
当然诚实的讲,这也是一门负担。我自己就经历了学C++98到学现代C++的流程,说真的痛苦的,真的很痛苦。这也造成了他对那些想要快速做程序的朋友而言,一点也不友好。所以,C++(我甚至想说,包含C)真的不适合对计算机本身没兴趣的朋友。跟内存,CPU甚至可能还有磁盘近距离打交道并非儿戏。
这卷教程覆盖什么内容
这一卷是整个教程体系的基础篇。笔者不打算一上来就带各位玩模板元编程或者并发内存模型——那些在后面几卷等着去,别冒出来把大伙吓的半死。咱们本卷要做的,是把基本功打扎实:从对象怎么存储、生命周期怎么算,到类型、函数、类,一步步来。
顺序是这样的:先把开发环境跑起来,亲手编译执行一段 C++ 代码,体会一遍从源码到可执行文件的全过程;然后进入类型系统和值类别——整型、浮点、指针、引用,还有左值右值这套 C++ 看待数据的方式;控制流和函数跟在后面,参数传递、返回值、重载、默认参数,这些是往后一切复杂程序的基本单元。在此之上才轮到面向对象:类与对象、构造与析构、继承与多态、运算符重载。卷末收在模板基础、异常处理、STL 概览和内存管理模型上,给您一个 C++ 的全貌。
有一点得提前说明白:咱们用现代编译环境学基础,不是要您先把 C++98 的写法照单全收。移动语义、智能指针、lambda、constexpr 这些现代特性会在后续卷中深入;而 RAII 的思想早于 C++11,本卷会从构造、析构一步步走到资源管理。如果您已经有一定的 C++ 基础,觉得这里太简单,直接跳到后面的卷去挑有意思的内容;如果是新手,或者想系统地巩固一遍基础,笔者强烈建议按顺序读下去。
完全没有 C 语言背景也不用担心。本卷带了一个独立的 C 语言教程子目录,从数据类型、指针、数组一路讲到结构体、内存管理,完整的 C 语言基础都在里面。它的定位是补充材料,不是必修前置课:零基础可以直接从本章的环境搭建开始,读到哪里缺 C 的接口或指针知识,再按需回头查。
路线图就放在这儿。每走完一段,给自己留一个能跑的小成果;后面读迷路了,回来找当前位置就好。
零基础从 Linux 环境搭建 或 Windows 环境搭建 中选一条;已经能编译程序,就直接进入 第一个 C++ 程序。孩子们直接走起!
怎样使用这套教程
使用方法上,笔者有几条实在的建议。
头一条:如果您真的真的,不知道如何开始,可以考虑按顺序读,别跳。这套教程的顺序是设计过的,后面的内容经常引用前面讲过的概念,跳着读很容易在中途撞上看不懂的地方,再被迫回头找,反而更费时间。
代码要自己敲一遍。代码要自己敲一遍。代码要自己敲一遍。代码要自己敲一遍。代码要自己敲一遍。
我对我自己总是强调,也希望这个强调也能让各位记在心中。这个教程会有错,AI也会犯错。编译器会犯错吗?极端偶尔会,但是对于大家都还看到这里的朋友,很少会有办法让他出错。更多情况下。我们最好是看看自己是不是搞错了什么东西最为实在。
换而言之。咱们看懂一段代码,和亲手把它敲出来、编译、看到输出,是两种完全不同的学习体验。敲的过程中您会遇到各种意想不到的小问题——int mian(孩子们,这个真的不好笑)、忘加分号(您已经不写 Python 了)、头文件没包含(谁家 implicit declaration of XXX)——这些都是真实编程的一部分,早点遇到、早点习惯,比什么都强。教程里的示例再简单,也请动手敲一遍。
LLM 好用,笔者自己也拿 AI 偷懒,这很正常。但学习阶段,真的不建议偷懒。笔者亲眼看着自家兄弟偷懒,然后被 undefined reference 肘碎了一地,最后发现是自己的编译技术常识不过关。这个例子跟 C++ 关系不大,但足够说明问题了。
还有一条:卡住了先想,别死磕。一个概念看了两三遍还不理解,先标记下来继续往后读——很多概念要到后续的实际应用里才会清晰起来,上下文变了,理解也会跟着加深。回头来还是不懂,就去社区讨论(我不知道有没有后 AI 时代的朋友,我自己是 CSDN、Stack Overflow 常客,没有 AI 的时代,我就是这些社区的代码搬运大户(真的给这些爹跪下了)),或者翻 cppreference.com 上的详细说明。
准备好了,先休息一下,然后,开始吧
休息一下吧!大家工作,学习都不容易,喘口气,站起来走两圈,之后的日子咱们就要跟C++爆破了!
还在看,不讲知识,我们不内卷。C++ 我学到今天,下的结论是:C++是一门有深度的语言,学习曲线确实不算平缓(倒不如说平缓在哪里了),这一点笔者不忽悠您。但它也是一门回报丰厚的语言——等您真正把 RAII、模板、零开销抽象这些本事摸透,会发现写 C++ 是一件很痛快的事。
这套教程不会让您一夜之间变成 C++ 专家——没有任何教程能做到这一点,如果有人宣称它能让你30天精通C++,你最好问问他什么是现代C++。这条路会很艰辛,但是笔者希望这些教程可以陪您走完:从最基础的类型和变量,到面向对象的设计,再到模板和标准库的使用,耐心和动手的意愿,笔者认为,将会决定我们伟大的征程能走得多远。
休息会,咱们,要上路了。