C++11新特性详解:从列表初始化到线程库

目录

前言

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

相关推荐
一只鱼^_7 分钟前
牛客周赛 Round 105
数据结构·c++·算法·均值算法·逻辑回归·动态规划·启发式算法
ikkkkkkkl9 分钟前
C++设计模式:面向对象设计原则
c++·设计模式·面向对象
啊阿狸不会拉杆36 分钟前
《算法导论》第 27 章 - 多线程算法
java·jvm·c++·算法·图论
重启的码农42 分钟前
ggml介绍 (8) 图分配器 (ggml_gallocr)
c++·人工智能·神经网络
重启的码农43 分钟前
ggml介绍 (9) 后端调度器 (ggml_backend_sched)
c++·人工智能·神经网络
楼田莉子3 小时前
C++算法题目分享:二叉搜索树相关的习题
数据结构·c++·学习·算法·leetcode·面试
大锦终4 小时前
【算法】模拟专题
c++·算法
方传旺4 小时前
C++17 std::optional 深拷贝 vs 引用:unordered_map 查询大对象性能对比
c++
Dontla5 小时前
Makefile介绍(Makefile教程)(C/C++编译构建、自动化构建工具)
c语言·c++·自动化