当前位置: 首页 > news >正文

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)。

http://www.dtcms.com/a/328959.html

相关文章:

  • Linux系统编程Day13 -- 程序地址空间(进阶)
  • uniapp组件的开关选择器可以这个携带多参数
  • CVPR2025敲门砖丨机器人结合多模态+时空Transformer直冲高分,让你的论文不再灌水
  • docker network 与host的区别
  • Uni-app + Vue3+editor富文本编辑器完整实现指南
  • 学习STM32 脉冲计数实验
  • MySQL相关概念和易错知识点(6)(视图、用户管理)
  • Java 大视界 -- 基于 Java 的大数据可视化在能源互联网全景展示与能源调度决策支持中的应用
  • 深度学习与遥感入门(七)|CNN vs CNN+形态学属性(MP):特征工程到底值不值?
  • 一键自动化:Kickstart无人值守安装指南
  • 【unitrix数间混合计算】2.20 比较计算(cmp.rs)
  • Spring Boot (v3.2.12) + application.yml + jasypt 数据源加密连接设置实例
  • 25个自动化办公脚本合集(覆盖人工智能、数据处理、文档管理、图片处理、文件操作等)
  • 【电气】NPN与PNP
  • [C语言]第二章-从Hello World到头文件
  • 四分位数与箱线图
  • Redis持久化机制详解:RDB与AOF的全面对比与实践指南
  • 动静态库
  • FPGA的PS基础1
  • 【FPGA】初始Verilog HDL
  • c++编程题-笔记
  • kali linux 2025.2安装Matlab的详细教程
  • 通过限制网络访问来降低服务器被攻击风险的方法
  • 服务器如何应对SYN Flood攻击?
  • FluxApi - 使用Spring进行调用Flux接口
  • Gradle(三)创建一个 SpringBoot 项目
  • 深度学习(3):全连接神经网络构建
  • mysql的快照读与当前读的区别
  • 11G RAC数据文件创建到本地如何处理
  • 【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day3