C++11新特性详解:从列表初始化到线程库
目录
前言
1. C++11简介
2. 统一的列表初始化
2.1 std::initializer_list
3. 变量类型推导
3.1 auto关键字
3.2 decltype
3.3 nullptr
4. 范围for循环
5. final与override
6. 智能指针
7. STL新容器
8. 右值引用和移动语义
8.1 左值 vs 右值
8.2 右值引用
8.3 移动语义
8.4 std::move
9. lambda表达式
10. 包装器function
11. 线程库
11.1 线程同步
12. 其他重要特性
总结
前言
C++11作为C++语言的重大更新版本,引入了大量现代化特性,极大地提升了开发效率和代码质量。本文将全面介绍C++11的核心新特性,帮助读者掌握这些强大的工具。
。
1. C++11简介
C++11是自C++98/03以来的第一个重大更新,历经13年开发(原计划2007年发布,最终2011年发布)。它带来了约140个新特性,修复了600多个缺陷,使C++成为更现代化、更安全的语言。
2. 统一的列表初始化
C++11扩展了花括号初始化的使用范围,使其适用于所有内置类型和用户自定义类型。
// 内置类型
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`是一种特殊类型,用于支持初始化列表:
auto i1 = {10, 20, 30}; // i1类型为std::initializer_list<int>
STL容器都增加了以`initializer_list`为参数的构造函数:
vector<int> v = {1, 2, 3};
map<string, string> dict = {{"sort", "排序"}, {"insert", "插入"}};
3. 变量类型推导
3.1 auto关键字
auto可以自动推导变量类型:
auto p = &i; // int*
auto pf = strcpy; // 函数指针
auto it = dict.begin(); // 迭代器
3.2 decltype
decltype可以获取表达式的类型:
decltype(x * y) ret; // ret的类型为double
decltype(&x) p; // p的类型为int*
3.3 nullptr
C++11引入nullptr替代NULL,解决二义性问题:
int* p = nullptr; // 明确表示空指针
4. 范围for循环
简化容器遍历:
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 右值引用
int&& rr1 = 10; // 右值引用
double&& rr2 = x + y; // 右值引用
8.3 移动语义
移动构造和移动赋值可以"窃取"右值资源,避免深拷贝:
// 移动构造函数
string(string&& s) : _str(nullptr) {swap(s); // 直接交换资源
}// 移动赋值运算符
string& operator=(string&& s) {swap(s);return *this;
}
8.4 std::move
将左值转为右值引用:
string s1("hello");
string s2(std::move(s1)); // s1资源被转移给s2
9. lambda表达式
匿名函数,简化代码:
sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2){return g1._price < g2._price;
});
完整语法:`[capture-list](parameters) mutable -> return-type { statement }`
10. 包装器function
统一可调用对象类型:
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引入了跨平台线程支持:
#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:线程间通信
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)。