1. auto 类型推导
是什么:让编译器根据初始化表达式自动推导变量类型。
解决什么问题:C++98中,迭代器、模板类型等声明极其冗长,影响代码可读性和维护性。
示例:
2. 范围for循环
是什么:基于范围的for循环,直接遍历容器元素。
解决什么问题:传统for循环需要手动管理索引或迭代器,容易越界或写错。
示例:
3. Lambda表达式
是什么:在函数内部定义匿名函数对象,可捕获局部变量。
解决什么问题:使用STL算法(如sort、find_if)时,无需单独编写函数或仿函数类。
示例:
4. 统一初始化 {}
是什么:使用花括号{}初始化任何对象,支持std::initializer_list。
解决什么问题:C++98有多种初始化方式(括号、等号、拷贝),规则混乱,且容器无法用列表初始化。
示例:
5. nullptr
是什么:空指针关键字,类型为nullptr_t,可隐式转为任意指针类型。
解决什么问题:NULL本质是0,在重载时可能被误当作整数,导致错误。
示例:
6. override / final
是什么:
override:显式声明虚函数要覆盖基类虚函数
final:禁止派生类进一步覆盖或禁止类被继承
解决什么问题:防止因函数签名写错(如参数类型、const性)而意外新增虚函数,而非覆盖预期函数。
示例:
7. 移动语义 & 右值引用 &&
是什么:通过T&&识别临时对象(右值),允许“窃取”其资源,而非深拷贝。
解决什么问题:C++98返回大对象(如vector)时触发深拷贝,性能低下。移动语义将拷贝从O(n)降为O(1)。
示例:
8. 完美转发
是什么:模板函数中,通过std::forward保持参数原本的左值/右值属性,原样传递给另一个函数。
解决什么问题:包装函数时,无法区分传递来的参数是左值还是右值,导致移动语义失效。
示例:
9. constexpr
是什么:强制表达式在编译期求值,得到编译期常量。
解决什么问题:const变量可能运行时才确定,无法用于模板参数、数组大小等编译期场景。
示例:
10. 智能指针 (unique_ptr / shared_ptr / weak_ptr)
是什么:
unique_ptr:独占所有权,不可拷贝
shared_ptr:引用计数共享所有权
weak_ptr:弱引用,配合shared_ptr打破循环引用
解决什么问题:C++98手动new/delete极易导致内存泄漏、重复释放、野指针。
示例:
11. enum class 强类型枚举
是什么:enum class Name { ... },具有作用域且不会隐式转换为整型。
解决什么问题:传统enum的枚举值暴露在外层作用域,且可隐式转为int,不安全。
示例:
12. static_assert
是什么:编译期断言,条件为假时编译失败。
解决什么问题:assert只在运行时检查,无法检测模板参数等编译期条件。
示例:
13. 原生线程库 ( / / )
是什么:标准化的跨平台多线程支持。
解决什么问题:C++98无线程库,必须使用平台相关API(Windows的CreateThread、Linux的pthread),代码不可移植。
示例:
14. 委托构造函数
是什么:一个构造函数可以调用本类的另一个构造函数。
解决什么问题:多个构造函数有大量重复初始化代码,难以维护。
示例: