C++ 是 C 的超集:既保留了 C 贴着硬件跑的底层控制力,又加上面向对象、泛型和一堆"帮你管内存"的现代特性。游戏引擎、高频交易、操作系统组件、大型桌面软件都靠它。本页以 C++20 为主流基线,覆盖 C++23 新特性,前瞻 C++26;编译器要求 GCC 14+ / Clang 18+ / MSVC 2022。
第 1 节 · 为什么学 C++,以及第一个程序
Why C++ · Setup · Hello World · std
第 2 节 · C++ 基础增强:让代码又短又安全
References · const · auto · nullptr
第 3 节 · 面向对象 OOP:把数据和操作打包
Class · Inheritance · Polymorphism
第 4 节 · RAII 与智能指针:C++ 最重要的范式
RAII · unique_ptr · shared_ptr · weak_ptr
第 5 节 · STL:C++ 的瑞士军刀
STL · Containers · Algorithms · Lambda
第 6 节 · 模板与泛型:一套代码通吃所有类型
Templates · Concepts
第 7 节 · 异常处理与错误返回
Exceptions · noexcept · expected
第 8 节 · 现代 C++ 特性巡礼(C++11 → 23)
Modern C++ Features
第 9 节 · 并发与多线程
std::thread · Mutex · Future
第 10 节 · 文件 IO 流与常用标准库
IO Streams · string · chrono · optional
第 11 节 · 最佳实践:五法则与零法则
Rule of Five / Zero
第 12 节 · 小项目:现代 C++ 任务管理器
Mini Project — Task Manager
第 13 节 · 标准库进阶:string、时间、随机、包装类型
String · chrono · random · optional/variant
第 14 节 · 常见坑与最佳实践
Pitfalls
第 15 节 · C++20 Modules:让编译快起来,让宏别乱跑
Modules · export module / import / CMake FILE_SET CXX_MODULES
第 16 节 · 单元测试:GoogleTest、Catch2 与覆盖率
Unit Testing · GoogleTest / gMock / Catch2 / CMake + CTest
第 17 节 · Sanitizers 与 FFI:把内存错误和链接问题揪出来
Sanitizers · ASan/UBSan/TSan/MSan · Static/Dynamic Linking · extern "C" · dlopen
小结与自测
这一页从"为什么学 C++"讲到现代特性和并发,核心思想是用 RAII 和 STL 把 C 时代那些手动管理的脏活全自动化。掌握了智能指针、STL、OOP 三大件,现代 C++ 就算入门。下面 5 道自测,点开 details 对答案。
1.(概念题)什么是 RAII?它为什么能自动避免内存泄漏?
查看答案
答案:RAII 是"资源获取即初始化"——把资源(内存、锁、文件)绑在对象的构造/析构上:构造时拿资源,对象离开作用域、析构时自动释放资源。哪怕中间抛异常、提前 return,析构函数也一定会执行。解析:这就是 unique_ptr 不用你 delete 的原理。
2.(选择题)你需要一块"独占、用完即还"的堆内存,该用哪种智能指针?A. shared_ptr B. unique_ptr C. 裸指针 new
查看答案
答案:B,unique_ptr。解析:独占所有权、零开销、首选。shared_ptr 是"多人共享"才用的;裸指针 new 会让你回到手动管理内存的老路。
3.(多态题)子类重写父类虚函数时,为什么要加 override?不加会怎样?
查看答案
答案:加 override 是让编译器检查"你是不是真的重写了父类那个函数"。如果不加,你把函数签名写错(比如漏 const),编译器不会报错,而是当成一个全新的函数,多态静默失效,运行时调用的还是父类版本,bug 极其难查。解析:override 是免费的安全网。
4.(并发题)两个线程同时执行 count++,为什么结果可能不对?怎么解决?
查看答案
答案:count++ 其实是"读-改-写"三步,两个线程可能同时读到同一个值,各自加完写回,导致少加一次——这叫数据竞争。解决:用 std::mutex 加锁(推荐 lock_guard),保证同一时刻只有一个线程进临界区;无锁场景可用 std::atomic<int>。
5.(思维题)"零法则(Rule of Zero)"是什么意思?为什么说它比"五法则"更高级?
查看答案
答案:零法则是指——当你的类成员全是自带 RAII 的类型(std::string、vector、智能指针)时,析构、拷贝、移动这五个特殊函数你一个都不用写,编译器生成的就完美。为什么更高级:五法则是"我手动管资源,所以五个函数都得写齐";零法则是"我把资源管理全交给标准库,我只写业务逻辑",既少代码又不出错。这正是现代 C++ 的追求。
下一步往哪走
路学完现代 C++ 之后
① 想做游戏:C++ 是 Unreal Engine 的母语,下一步学引擎和图形学。
② 想做系统/高性能:深入并发、内存模型、编译优化,读 Linux 或 Redis 源码。
③ 想尝鲜:C++23 的 std::print、std::expected,以及开发中的 C++26,可以边做边跟踪。