C++11都有什么新特性?
"C++11 才是真正现代意义上的 C++。"
这不是夸张。
C++11 是 C++ 语言的一次大转折,从语法到标准库,C++完成了蜕变。
C++11 到底都引入了哪些新特性?这些特性又是怎么改变我们写代码的方式的?
1. 语言核心新特性
(1)auto
类型推导
著名的自动声明。
ini
auto x = 10; // int
auto y = 3.14; // double
auto it = v.begin(); // 迭代器,不用手写冗长类型
让变量声明更简洁,甚至在使用方便上变得像python了。
(2)范围 for
c
for (auto& x : vec) {
cout << x << endl;
}
告别手动迭代器,提高可读性。(最实用的更新之一)
(3)右值引用与移动语义
C++11 引入了 右值引用(T&&) ,解决"拷贝昂贵"的问题,如下例子:
c
std::vector<int> foo() {
std::vector<int> v(1000000, 42);
return v; // C++11 可以直接移动,不再拷贝
}
配合 std::move
,能显著优化性能。
(4)智能指针
C++11 提供了:
std::unique_ptr
------ 独占所有权std::shared_ptr
------ 共享所有权std::weak_ptr
------ 弱引用
这次!我们C++也终于有了 官方内置的安全内存管理 ,再也不必到处 new/delete
了,实在是太过麻烦了~
(5)nullptr
不再用 NULL
(其实是 0
),而是专门的空指针字面量:
ini
int* p = nullptr;
(6)constexpr
让编译期能计算更多东西:
c++
constexpr int square(int x) { return x * x; }
int arr[square(5)]; // 合法
提高了性能,又减少了开销。
(7)Lambda 表达式
匿名函数,简化回调与 STL 使用:
c++
std::sort(v.begin(), v.end(),
[](int a, int b) { return a > b; });
(8)统一的初始化语法
花括号 {}
可用于所有初始化:
c++
int x{10};
std::vector<int> v{1, 2, 3, 4};
避免"窄化转换"的问题,更安全。
(9)并发支持
C++11 引入了标准多线程库:
c++
#include <thread>
void work() { /* ... */ }
int main() {
std::thread t(work);
t.join();
}
这个学了操作系统就能理解有多实用了~
(10)enum class
强类型枚举,避免命名污染:
css
enum class Color { Red, Green, Blue };
Color c = Color::Red;
2. 标准库的增强
对于STL,也进行了一定程度的增强。
std::array
:定长数组,替代 C 风格数组。std::unordered_map
/unordered_set
:基于哈希表的容器。std::tuple
:多值返回。- 正则表达式库
<regex>
。 - 随机数库
<random>
:比rand()
更强大更可控。 - chrono 时间库
<chrono>
:更安全的时间处理。
3. 为什么说 C++11 是分水岭?
- C++ 上一个标准是 C++98/03 ,整整 13 年几乎没有重大更新。
- C++11 被称作 "C++0x" (本来以为 200x 就能发布,结果一拖再拖),所以真正发布时大家非常期待。
我们可以看看在11出来之前,C++前辈们都是怎么写代码的。
- 写 STL 要一堆迭代器模板,冗长又啰嗦;
- 内存管理靠
new/delete
,到处是泄漏与悬挂指针; - 没有原生线程库,跨平台编程极度痛苦;
- 缺少现代语法糖(lambda、auto),模板代码难写又难读。
到了 C++11,有了以下这些好处。
- 语法更简洁 :
auto
、for
、lambda; - 内存更安全 : 智能指针;
- 性能更稳定 : 移动语义;
- 并发更标准 :
<thread>
; - 编译期计算能力更强 :
constexpr
。
这使得 C++ 终于跟得上现代软件工程的需求,也让后续的 C++14/17/20/23 都是在它的基础上逐步进化。