现代 C++
现代 C++ 不是单纯“新语法合集”,而是一套更安全的开发方式:用标准库和对象生命周期表达资源管理,用类型表达接口意图,用编译器检查减少低级错误。
本目录以 C++20 为现代 C++ 学习基准。
1. 学习路线
核心知识:开发者必须会
这些内容是现代 C++ 日常开发的基础,适合放在主学习链里:
- RAII:资源跟随对象生命周期自动释放。
- 智能指针:用
unique_ptr/shared_ptr表达所有权。 - nullptr:替代
NULL和0,避免空指针歧义。 - 最佳初始化:统一初始化、成员初始化和默认值习惯。
- 新遍历方法:范围
for和标准库算法的基础写法。 - auto:在类型明显或冗长时减少噪声。
- lambda:就地表达小行为,配合算法和回调。
- 右值引用、移动语义:理解资源转移和
std::move。 - optional:表达“可能没有值”,替代魔法值和部分输出参数。
- constexpr:理解基础编译期常量和
if constexpr。 - 函数后关键字:掌握
const、override、= default、= delete、noexcept等常用声明。
高阶知识:按需提高
这些内容不是普通开发每天都要写,但了解后能显著提升阅读复杂代码、设计接口和定位问题的能力:
- 属性列表:标准属性,包含
[[nodiscard]]、[[maybe_unused]]、[[deprecated]]等。 - 断言:运行期/编译期检查和调试边界。
- 完美转发:泛型包装、工厂函数和库代码常见。
- RTTI:运行时类型识别,适合按需查阅。
- 新对象特性:委托构造、移动构造、特殊成员函数等对象规则补充。
2. 传统 C++ 的典型痛点
| 传统痛点 | 现代 C++ 的主要解法 |
|---|---|
手动 new / delete 容易泄漏 | RAII、容器、智能指针 |
| 所有权不清楚 | unique_ptr、shared_ptr、引用/裸指针只作观察 |
| C 数组和裸指针丢失长度 | std::vector、std::array、std::span |
| 返回失败只能靠特殊值 | std::optional、结果类型、异常或错误码策略 |
| 大对象拷贝成本高 | 移动语义、RVO、按值返回 |
| 回调和局部策略写法啰嗦 | lambda、标准库算法 |
| 宏缺少类型和作用域约束 | constexpr、using、模板、枚举类 |
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++11 | RAII 体系完善、智能指针、移动语义、lambda、auto、nullptr、基础 constexpr |
| C++14 | make_unique、泛型 lambda、更多 constexpr 能力 |
| C++17 | 结构化绑定、if 初始化、std::optional、std::variant、std::string_view、标准属性增强 |
| C++20 | concepts、ranges、std::span、协程、consteval/constinit、更多编译期能力 |
学习时不需要按标准年份死记。对开发者更重要的是:先把核心写法变成习惯,再按项目需要补高阶特性。
5. 判断标准
- 能减少手动资源管理的,优先进入核心。
- 能让接口语义更清楚的,优先进入核心。
- 主要服务库作者、模板框架、性能微调或底层调试的,放到高阶。
- 需要大量标准细节、实现差异或边界行为的,只在主线保留结论,细节去专题页或深水区。
6. 总结
现代 C++ 的核心目标是写出所有权清楚、生命周期可靠、接口语义明确、能被编译器检查的代码。学完核心知识后,已经可以进入普通 C++ 项目开发;高阶知识用于解释复杂代码和提升设计质量。