回答来自【通义灵码】
C++11是C++编程语言的一个重要里程碑,引入了大量的新特性以提升代码的可读性、可维护性、性能和安全性。以下是一些关键的C++11新特性:
-
统一初始化: 允许在任何情况下使用花括号列表初始化(uniform initialization),无论对于内置类型、数组还是用户定义类型。这消除了以往初始化方式的混乱,提高了代码的一致性和清晰度。
-
成员变量默认初始化: 支持在类定义中为成员变量提供默认初始值,减少了构造函数中的重复代码,并确保即使在没有明确调用特定构造函数的情况下,成员也能获得合理的默认值。
-
auto关键字: 自动类型推导,编译器可以根据变量的初始化表达式推断其类型。这简化了复杂类型声明,特别是在模板编程和迭代器类型中,以及处理将来可能出现的返回类型推导。
-
decltype关键字: 获取表达式或变量的类型,用于声明依赖于其他表达式类型的变量或模板参数,增强了泛型编程的能力。
-
nullptr关键字: 引入了新的空指针常量
nullptr
,替代了传统的NULL
或0
,更明确地表示空指针,避免与整数类型的混淆,并提供更好的类型安全。 -
右值引用与移动语义: 引入了右值引用(
&&
),支持移动构造函数和移动赋值运算符,允许在不影响源对象的前提下高效地转移资源所有权,显著减少大规模对象复制的成本。 -
完美转发: 使用
std::forward
配合std::forward_list
和std::tuple
等模板,可以完美保留函数参数的左值或右值属性,确保在模板函数或模板类中正确传递参数。 -
范围-based for循环: 提供了一种更简洁的遍历容器元素的方式,如
for (auto element : container) {...}
,无需显式使用迭代器。 -
lambda表达式: 直接在代码中定义匿名函数对象(闭包),简化了短小函数或回调函数的编写,方便在算法、函数对象、线程任务等上下文中使用。
-
强类型枚举: 引入
enum class
(强类型枚举),每个枚举成员有自己的作用域,避免了名称冲突,并且不再隐式转换为整数类型,提高了类型安全性。 -
模板别名: 使用
using
关键字定义模板别名(alias template),简化复杂的模板类型声明,如using Matrix = std::vector<std::vector<double>>;
。 -
static_assert: 在编译时进行条件检查,如果断言失败,编译器会给出错误消息并停止编译。有助于在编译阶段发现和修正错误,而不是在运行时。
-
constexpr: 表明函数或变量能在编译时求值,可用于生成常量表达式,增强元编程能力,也可以用于定义常量函数,确保其结果可在编译时计算。
-
std::chrono库: 提供了精确、类型安全的时间和日期操作,包括纳秒级精度的计时器和日历时间计算。
-
std::thread与线程支持: 增加了对多线程编程的支持,包括
std::thread
类、互斥锁std::mutex
、条件变量std::condition_variable
等,以及原子操作std::atomic
。 -
智能指针强化: 引入了
std::unique_ptr
(独占所有权智能指针)和std::shared_ptr
(共享所有权智能指针),以及相应的弱指针std::weak_ptr
,极大地改善了资源管理,降低了内存泄漏的风险。 -
类型推导与
std::initializer_list
: 改进了模板类型推导规则,并引入了std::initializer_list
,使得容器和其他类型可以接受花括号列表初始化。 -
C++标准库扩展: 包括
std::array
(固定大小数组)、std::unordered_map
与std::unordered_set
(哈希容器)、std::function
(可存储任意可调用对象的类型)等,丰富了标准库的功能。
这些新特性共同推动了C++向着更加现代化、易用和高效的编程语言发展,许多特性已成为现代C++开发的标准实践。