C++11是对C++编程语言的一次重大更新,它引入了大量新特性和改进,旨在提高代码的效率、可读性、安全性以及程序员的生产力。以下是C++11中一些关键的新特性。
1. 右值引用:
- 右值引用(T&&)是用来绑定到将要销毁的临时对象或显式声明的右值的引用。
- 引入了“移动语义”,通过移动构造函数和移动赋值运算符,允许资源从一个对象安全地转移到另一个对象,避免不必要的拷贝,从而提高性能。
- 支持完美转发(通过std::forward),使模板函数能够以最佳方式传递参数给其他函数。
2. 智能指针:
- 引入了std::unique_ptr、std::shared_ptr和std::weak_ptr,提供自动内存管理机制,有助于防止内存泄漏并简化资源所有权的管理。
- std::unique_ptr表示独占所有权,不支持复制但可通过转移来转移所有权。
- std::shared_ptr支持共享所有权,内部计数器跟踪共享资源的引用数量,并在无剩余引用时自动释放资源。
3. 自动类型推导:
- auto关键字现在可用于声明变量,编译器会根据初始化表达式自动推断出变量的类型。
- 提高了代码简洁性,特别是对于复杂类型或模板表达式。
4. decltype:
- decltype关键字用于获取表达式的类型而不实际计算表达式。
- 用于编写泛型代码,尤其是在模板元编程和类型推理上下文中。
5. 统一初始化语法:
- 简化并统一了各种类型的初始化方式,允许使用花括号 {} 初始化任何内置类型、数组、结构体、联合体和类对象,即使没有默认构造函数。
- 示例:
int arr[3] = {1, 2, 3};
或std::vector<int> vec = {1, 2, 3, 4, 5};
6. 成员变量默认初始化:
- 允许在类声明中直接为非静态数据成员指定默认初始化值。
7. 范围-based for循环:
- 提供了一种简洁的方式来遍历容器或其他支持迭代器的数据结构:
for (const auto& element : container) {// ...}
- 避免了手动管理迭代器,提高了代码的可读性和安全性。
8. Lambda表达式:
- 一种简洁的内联匿名函数定义方式,用于定义短小的、即用即弃的函数对象:
std::vector<int> vec = ...;std::sort(vec.begin(), vec.end(), [](int a, int b) { return a > b; });
- 支持捕获外部变量、指定返回类型(可选)和参数列表。
9. 模板改进:
- 外部模板(extern template)允许显式声明模板实例已在其他翻译单元中定义,避免重复实例化。
- 显式模板实参列表(template<…>)可以用于函数模板和类模板的显式特化或全特化。
10. 多线程支持:
- 引入了库,提供std::thread用于创建和管理线程。
- 包括互斥量(std::mutex)、条件变量(std::condition_variable)、原子操作(std::atomic)等同步原语。
11. 类型和常量表达式:
- constexpr关键字用于声明可以在编译时计算的函数和变量,允许生成常量表达式和用于编译期计算。
- nullptr关键字作为nullptr_t类型的字面值,用于更安全、明确地表示空指针。
12. 其他:
- 引入了override和final关键字以增强虚函数的继承和重写规则。
- 增强了static_assert,允许在编译时检查编译时常量表达式。
- 标准库更新,包括std::chrono(日期和时间库)、std::tuple、std::array、std::function、std::bind、std::move、std::forward等实用工具和容器。