C++学习笔记(42):C++11核心的新增特性

0 阅读3分钟

1. auto 类型推导

是什么:让编译器根据初始化表达式自动推导变量类型。

解决什么问题:C++98中,迭代器、模板类型等声明极其冗长,影响代码可读性和维护性。

示例:

image.png

2. 范围for循环

是什么:基于范围的for循环,直接遍历容器元素。

解决什么问题:传统for循环需要手动管理索引或迭代器,容易越界或写错。

示例:

image.png

3. Lambda表达式

是什么:在函数内部定义匿名函数对象,可捕获局部变量。

解决什么问题:使用STL算法(如sort、find_if)时,无需单独编写函数或仿函数类。

示例:

image.png

4. 统一初始化 {}

是什么:使用花括号{}初始化任何对象,支持std::initializer_list。

解决什么问题:C++98有多种初始化方式(括号、等号、拷贝),规则混乱,且容器无法用列表初始化。

示例:

image.png

5. nullptr

是什么:空指针关键字,类型为nullptr_t,可隐式转为任意指针类型。

解决什么问题:NULL本质是0,在重载时可能被误当作整数,导致错误。

示例:

image.png

6. override / final

是什么:

override:显式声明虚函数要覆盖基类虚函数

final:禁止派生类进一步覆盖或禁止类被继承

解决什么问题:防止因函数签名写错(如参数类型、const性)而意外新增虚函数,而非覆盖预期函数。

示例:

image.png

7. 移动语义 & 右值引用 &&

是什么:通过T&&识别临时对象(右值),允许“窃取”其资源,而非深拷贝。

解决什么问题:C++98返回大对象(如vector)时触发深拷贝,性能低下。移动语义将拷贝从O(n)降为O(1)。

示例:

image.png

8. 完美转发

是什么:模板函数中,通过std::forward保持参数原本的左值/右值属性,原样传递给另一个函数。

解决什么问题:包装函数时,无法区分传递来的参数是左值还是右值,导致移动语义失效。

示例:

image.png

9. constexpr

是什么:强制表达式在编译期求值,得到编译期常量。

解决什么问题:const变量可能运行时才确定,无法用于模板参数、数组大小等编译期场景。

示例:

image.png

10. 智能指针 (unique_ptr / shared_ptr / weak_ptr)

是什么:

unique_ptr:独占所有权,不可拷贝

shared_ptr:引用计数共享所有权

weak_ptr:弱引用,配合shared_ptr打破循环引用

解决什么问题:C++98手动new/delete极易导致内存泄漏、重复释放、野指针。

示例:

image.png

11. enum class 强类型枚举

是什么:enum class Name { ... },具有作用域且不会隐式转换为整型。

解决什么问题:传统enum的枚举值暴露在外层作用域,且可隐式转为int,不安全。

示例:

image.png

12. static_assert

是什么:编译期断言,条件为假时编译失败。

解决什么问题:assert只在运行时检查,无法检测模板参数等编译期条件。

示例:

image.png

13. 原生线程库 ( / / )

是什么:标准化的跨平台多线程支持。

解决什么问题:C++98无线程库,必须使用平台相关API(Windows的CreateThread、Linux的pthread),代码不可移植。

示例:

image.png

14. 委托构造函数

是什么:一个构造函数可以调用本类的另一个构造函数。

解决什么问题:多个构造函数有大量重复初始化代码,难以维护。

示例:

image.png