C++11引入了统一初始化、auto/decltype类型推导、NULLptr、右值引用与移动语义、智能指针和Lambda表达式等核心特性,提升了代码效率、安全性和可读性。

C++11 是 C++ 发展史上一次重大更新,带来了大量提升代码效率、安全性和可读性的新特性。这些改进让现代 C++ 编程更加简洁和强大。以下是几个最核心且实用的新功能。
统一的列表初始化
C++11 推广了使用花括号 {} 进行初始化的方式,使其适用于几乎所有类型,包括内置类型、自定义类和标准库容器,实现了“大一统”的初始化语法。
- 对于数组和结构体,int arr[] = {1, 2, 3}; 和 Point p{1, 2}; 变得更通用。
- 标准库容器可以方便地用 std::vectorv = {1, 2, 3}; 或 std::map m{{“key”, “value”}}; 来初始化,省去了繁琐的逐个插入操作。
- 这种初始化方式还能防止窄化转换(narrowing conversion),编译器会对此报错,增强了类型安全性。
auto 与 decltype 类型推导
这两个关键字极大地简化了复杂类型的变量声明。
- auto:让编译器根据初始化表达式自动推断变量类型。这在处理迭代器时特别有用,比如 auto it = vec.begin(); 比写全 std::vector<T>::iterator 简洁得多。
- decltype:用于获取一个表达式的类型。它常与 auto 结合,在函数模板中声明返回值类型,例如 auto add(T t, U u) -> decltype(t + u),确保返回的是 t+u 运算后的精确类型。
nullptr 与强类型空指针
用 nullptr 关键字取代了传统的 NULL(通常定义为 0 或 0L)来表示空指针。
立即学习“C++免费学习笔记(深入)”;
- nullptr 的类型是 std::nullptr_t,是一个专门为空指针设计的类型,避免了使用 0 可能带来的函数重载歧义问题。
- 代码意图更清晰,提高了可读性,明确区分了整数零和空指针的概念。
右值引用与移动语义
这是 C++11 在性能优化上的革命性特性,解决了不必要的深拷贝问题。
- 引入了右值引用 T&&,可以绑定到临时对象(右值)上。
- 基于此,可以实现移动构造函数和移动赋值运算符,将临时对象所拥有的资源(如堆内存)直接“移动”过来,而不是复制,从而极大提升了性能,尤其是在处理大型容器或字符串时效果显著。
- 配合 std::move() 函数,可以显式地将一个左值强制转换为右值引用,触发移动操作。
智能指针
C++11 标准库引入了 std::unique_ptr、std::shared_ptr 和 std::weak_ptr,提供了自动化的内存管理方案。
- 它们利用 RAII(Resource Acquisition Is Initialization)机制,在对象生命周期结束时自动释放所管理的资源。
- 这有效防止了内存泄漏,减少了手动使用 new 和 delete 带来的风险,是现代 C++ 内存管理的首选。
Lambda 表达式
允许在代码中内联定义匿名函数,语法简洁。
- 基本格式为 [capture](parameters) -> return_type { body }。
- 非常适用于需要传递简单函数逻辑的场景,比如作为算法的参数(std::sort, std::for_each),比定义单独的函数或函数对象更直观。
- 捕获子句 [ ] 可以按值或引用捕获外部变量,灵活地访问上下文数据。
基本上就这些。


