现代 C++

现代 C++ 不是单纯“新语法合集”,而是一套更安全的开发方式:用标准库和对象生命周期表达资源管理,用类型表达接口意图,用编译器检查减少低级错误。

本目录以 C++20 为现代 C++ 学习基准。

1. 学习路线

核心知识:开发者必须会

这些内容是现代 C++ 日常开发的基础,适合放在主学习链里:

  1. RAII:资源跟随对象生命周期自动释放。
  2. 智能指针:用 unique_ptr / shared_ptr 表达所有权。
  3. nullptr:替代 NULL0,避免空指针歧义。
  4. 最佳初始化:统一初始化、成员初始化和默认值习惯。
  5. 新遍历方法:范围 for 和标准库算法的基础写法。
  6. auto:在类型明显或冗长时减少噪声。
  7. lambda:就地表达小行为,配合算法和回调。
  8. 右值引用移动语义:理解资源转移和 std::move
  9. optional:表达“可能没有值”,替代魔法值和部分输出参数。
  10. constexpr:理解基础编译期常量和 if constexpr
  11. 函数后关键字:掌握 constoverride= default= deletenoexcept 等常用声明。

高阶知识:按需提高

这些内容不是普通开发每天都要写,但了解后能显著提升阅读复杂代码、设计接口和定位问题的能力:

  • 属性列表:标准属性,包含 [[nodiscard]][[maybe_unused]][[deprecated]] 等。
  • 断言:运行期/编译期检查和调试边界。
  • 完美转发:泛型包装、工厂函数和库代码常见。
  • RTTI:运行时类型识别,适合按需查阅。
  • 新对象特性:委托构造、移动构造、特殊成员函数等对象规则补充。

2. 传统 C++ 的典型痛点

传统痛点现代 C++ 的主要解法
手动 new / delete 容易泄漏RAII、容器、智能指针
所有权不清楚unique_ptrshared_ptr、引用/裸指针只作观察
C 数组和裸指针丢失长度std::vectorstd::arraystd::span
返回失败只能靠特殊值std::optional、结果类型、异常或错误码策略
大对象拷贝成本高移动语义、RVO、按值返回
回调和局部策略写法啰嗦lambda、标准库算法
宏缺少类型和作用域约束constexprusing、模板、枚举类

3. 核心示例

3.1 用 RAII 管资源

void write_log(const std::string& path) {
    std::ofstream file(path);
    file << "started\n";
} // file 离开作用域自动关闭

现代 C++ 的第一原则是:不要让业务代码手动记释放资源。

3.2 用智能指针表达所有权

auto widget = std::make_unique<Widget>();
use(*widget);

优先使用 unique_ptr 表达独占所有权;只有确实需要多个所有者时才使用 shared_ptr

3.3 用 optional 表达可能失败

std::optional<int> parse_int(std::string_view text);
 
if (auto value = parse_int("42")) {
    std::cout << *value << '\n';
}

返回值本身就能说明“可能没值”,比 -1、空字符串或输出参数更清楚。

3.4 用 lambda 配合算法

std::erase_if(users, [](const User& user) {
    return !user.active;
});

现代 C++ 更倾向于把“对集合做什么”写清楚,而不是到处手写循环模板代码。

4. C++20 视角下的版本演进

标准对日常开发最有影响的内容
C++11RAII 体系完善、智能指针、移动语义、lambda、autonullptr、基础 constexpr
C++14make_unique、泛型 lambda、更多 constexpr 能力
C++17结构化绑定、if 初始化、std::optionalstd::variantstd::string_view、标准属性增强
C++20concepts、ranges、std::span、协程、consteval/constinit、更多编译期能力

学习时不需要按标准年份死记。对开发者更重要的是:先把核心写法变成习惯,再按项目需要补高阶特性。

5. 判断标准

  • 能减少手动资源管理的,优先进入核心。
  • 能让接口语义更清楚的,优先进入核心。
  • 主要服务库作者、模板框架、性能微调或底层调试的,放到高阶。
  • 需要大量标准细节、实现差异或边界行为的,只在主线保留结论,细节去专题页或深水区。

6. 总结

现代 C++ 的核心目标是写出所有权清楚、生命周期可靠、接口语义明确、能被编译器检查的代码。学完核心知识后,已经可以进入普通 C++ 项目开发;高阶知识用于解释复杂代码和提升设计质量。

此文件夹下有3条笔记。