目录
[1. C++11简介](#1. C++11简介)
[2. 统一的列表初始化](#2. 统一的列表初始化)
[2.1 std::initializer_list](#2.1 std::initializer_list)
[3. 变量类型推导](#3. 变量类型推导)
[3.1 auto关键字](#3.1 auto关键字)
[3.2 decltype](#3.2 decltype)
[3.3 nullptr](#3.3 nullptr)
[4. 范围for循环](#4. 范围for循环)
[5. final与override](#5. final与override)
[6. 智能指针](#6. 智能指针)
[7. STL新容器](#7. STL新容器)
[8. 右值引用和移动语义](#8. 右值引用和移动语义)
[8.1 左值 vs 右值](#8.1 左值 vs 右值)
[8.2 右值引用](#8.2 右值引用)
[8.3 移动语义](#8.3 移动语义)
[8.4 std::move](#8.4 std::move)
[9. lambda表达式](#9. lambda表达式)
[10. 包装器function](#10. 包装器function)
[11. 线程库](#11. 线程库)
[11.1 线程同步](#11.1 线程同步)
[12. 其他重要特性](#12. 其他重要特性)
前言
C++11作为C++语言的重大更新版本,引入了大量现代化特性,极大地提升了开发效率和代码质量。本文将全面介绍C++11的核心新特性,帮助读者掌握这些强大的工具。
。
1. C++11简介
C++11是自C++98/03以来的第一个重大更新,历经13年开发(原计划2007年发布,最终2011年发布)。它带来了约140个新特性,修复了600多个缺陷,使C++成为更现代化、更安全的语言。
2. 统一的列表初始化
C++11扩展了花括号初始化的使用范围,使其适用于所有内置类型和用户自定义类型。
cpp
// 内置类型
int x1 = 1; // 传统方式
int x2{2}; // C++11方式
// 数组和结构体
int array[]{1, 2, 3};
Point p{1, 2};
// new表达式
int* pa = new int[4]{0};
2.1 std::initializer_list
```std::initializer_list`是一种特殊类型,用于支持初始化列表:``
cpp
auto i1 = {10, 20, 30}; // i1类型为std::initializer_list<int>
STL容器都增加了以`initializer_list`为参数的构造函数:
cpp
vector<int> v = {1, 2, 3};
map<string, string> dict = {{"sort", "排序"}, {"insert", "插入"}};
3. 变量类型推导
3.1 auto关键字
auto可以自动推导变量类型:
cpp
auto p = &i; // int*
auto pf = strcpy; // 函数指针
auto it = dict.begin(); // 迭代器
3.2 decltype
decltype可以获取表达式的类型:
cpp
decltype(x * y) ret; // ret的类型为double
decltype(&x) p; // p的类型为int*
3.3 nullptr
C++11引入nullptr替代NULL,解决二义性问题:
cpp
int* p = nullptr; // 明确表示空指针
4. 范围for循环
简化容器遍历:
cpp
for(auto e : v) {
cout << e << " ";
}
5. final与override
- final:禁止类被继承或虚函数被重写
`
- override:显式声明重写基类虚函数`
6. 智能指针
C++11引入三种智能指针:
`
- unique_ptr:独占所有权
- shared_ptr:共享所有权
- weak_ptr:弱引用`
7. STL新容器
C++11新增容器:
`
- array:静态数组
- forward_list:单向链表
- unordered_map/unordered_set:哈希实现的map/set`
8. 右值引用和移动语义
8.1 左值 vs 右值
- 左值:有持久状态的对象(变量、解引用指针等)
`
- 右值:临时对象(字面量、表达式结果等)`
8.2 右值引用
cpp
int&& rr1 = 10; // 右值引用
double&& rr2 = x + y; // 右值引用
8.3 移动语义
移动构造和移动赋值可以"窃取"右值资源,避免深拷贝:
cpp
// 移动构造函数
string(string&& s) : _str(nullptr) {
swap(s); // 直接交换资源
}
// 移动赋值运算符
string& operator=(string&& s) {
swap(s);
return *this;
}
8.4 std::move
将左值转为右值引用:
cpp
string s1("hello");
string s2(std::move(s1)); // s1资源被转移给s2
9. lambda表达式
匿名函数,简化代码:
cpp
sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2){
return g1._price < g2._price;
});
``完整语法:`capture-list mutable -> return-type { statement }```
10. 包装器function
统一可调用对象类型:
cpp
function<int(int,int)> func1 = f; // 函数指针
function<int(int,int)> func2 = Functor(); // 函数对象
function<int(int,int)> func3 = [](int a, int b){ return a+b; }; // lambda
11. 线程库
C++11引入了跨平台线程支持:
cpp
#include <thread>
void thread_func(int a) {
cout << "Thread: " << a << endl;
}
int main() {
thread t(thread_func, 10);
t.join();
return 0;
}
11.1 线程同步
- mutex:互斥锁
`
- lock_guard:RAII方式管理锁
- condition_variable:线程间通信`
cpp
mutex mtx;
condition_variable cv;
bool ready = false;
void worker() {
unique_lock<mutex> lock(mtx);
cv.wait(lock, []{return ready;});
// 工作代码
}
void master() {
{
unique_lock<mutex> lock(mtx);
ready = true;
}
cv.notify_all();
}
12. 其他重要特性
- 可变参数模板:支持任意数量模板参数
``
- 默认和删除函数:
= default
和`= delete```
`` - 原子操作:
atomic<T>
实现无锁编程 - 委托构造函数:构造函数可以调用同类其他构造函数``
总结
C++11为C++带来了革命性的变化,使代码更简洁、更安全、更高效。掌握这些新特性对于现代C++开发至关重要。建议读者在实际项目中逐步应用这些特性,体会它们带来的便利和优势。
更多细节请参考[cppreference.com](https://en.cppreference.com/w/cpp/11)。