C++11 新特性汇总

本文详细介绍了C++11引入的新特性,包括指针和智能指针(nullptr、shared_ptr、weak_ptr)、类型推导(auto、decltype、拖尾返回类型)、类特性修改(默认函数行为、构造函数、虚函数重载控制)、STL容器增强(std::array、std::forward_list、无序容器、元组)、多线程支持(std::thread、std::atomic、std::condition_variable)以及其他改进(for循环迭代、匿名函数lambda表达式、初始化列表std::initializer_list、正则表达式)。

1、指针、智能指针(nullptr、shared_ptr、std::weak_ptr)

(1)nullptr
  • 作用: C++11 引入了 nullptr 关键字,专门用来区分空指针、0
  • 原有问题:传统 C++ 会把 NULL、0 视为同一种东西,这取决于编译器如何定义 NULL
  • 实现:nullptr 的类型为 nullptr_t,能够隐式的转换为任何指针或成员指针的类型,也能和他们进行相等或者不等的比较。当需要使用 NULL 时候,养成直接使用 nullptr的习惯
(2)智能指针 shared_ptr、unique_ptr、weak_ptr

shared_ptr
多个指针指向相同的对象。shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的内存。每使用他一次,内部的引用计数加1,每析构一次,内部的引用计数减1,减为0时,自动删除所指向的堆内存。shared_ptr内部的引用计数是线程安全的,但是对象的读取需要加锁。

  • 初始化。智能指针是个模板类,可以指定类型,传入指针通过构造函数初始化。也可以使用make_shared函数初始化。不能将指针直接赋值给一个智能指针,一个是类,一个是指针。例如std::shared_ptr p4 = new int(1);的写法是错误的
  • 拷贝和赋值。拷贝使得对象的引用计数增加1,赋值使得原对象引用计数减1,当计数为0时,自动释放内存。后来指向的对象引用计数加1,指向后来的对象。
  • get函数获取原始指针
  • 注意不要用一个原始指针初始化多个shared_ptr,否则会造成二次释放同一内存
  • 注意避免循环引用,shared_ptr的一个最大的陷阱是循环引用,循环,循环引用会导致堆内存无法正确释放,导致内存泄漏。循环引用在weak_ptr中介绍。std::weak_ptr:与std::shared_ptr最大的差别是在赋值是,不会引起智能指针计数增加.shared_ptr会导致相互引用:导致的问题就是释放条件的冲突,最终也可能导致内存泄漏。用weak_ptr解决

unique_ptr
unique_ptr“唯一”拥有其所指对象,同一时刻只能有一个unique_ptr指向给定对象(通过禁止拷贝语义、只有移动语义来实现)。相比与原始指针unique_ptr用于其RAII的特性,使得在出现异常的情况下,动态资源能得到释放。unique_ptr指针本身的生命周期:从unique_ptr指针创建时开始,直到离开作用域。离开作用域时,若其指向对象,则将其所指对象销毁(默认使用delete操作符,用户可指定其他操作)。unique_ptr指针与其所指对象的关系:在智能指针生命周期内,可以改变智能指针所指对象,如创建智能指针时通过构造函数指定、通过reset方法重新指定、通过release方法释放所有权、通过移动语义转移所有权。

weak_ptr
weak_ptr是为了配合shared_ptr而引入的一种智能指针,因为它不具有普通指针的行为,没有重载operator*和->,它的最大作用在于协助shared_ptr工作,像旁观者那样观测资源的使用情况。weak_ptr可以从一个shared_ptr或者另一个weak_ptr对象构造,获得资源的观测权。但weak_ptr没有共享资源,它的构造不会引起指针引用计数的增加。使用weak_ptr的成员函数use_count()可以观测资源的引用计数,另一个成员函数expired()的功能等价于use_count()==0,但更快,表示被观测的资源(也就是shared_ptr的管理的资源)已经不复存在。weak_ptr可以使用一个非常重要的成员函数lock()从被观测的shared_ptr获得一个可用的shared_ptr对象, 从而操作资源。但当expired()==true的时候,lock()函数将返回一个存储空指针的shared_ptr

2、类型推导(au

### C++11及更高版本新特性汇总 C++11被视为现代C++的起点,引入了许多语言特性和库改进[^1]。以下是C++11及更高版本的主要新特性汇总: #### 一、C++11新特性 1. **语言特性** - 引入了`auto`关键字,允许编译器自动推导变量类型[^1]。 - 支持`constexpr`,用于定义编译期常量表达式[^2]。 - 提供了右值引用(rvalue reference),支持移动语义和完美转发,显著提升了性能[^1]。 - 增加了Lambda表达式,简化匿名函数的定义和使用[^1]。 2. **多线程支持** - 标准库新增`<thread>`头文件,提供线程管理功能。 - 引入了`std::mutex`和`std::lock_guard`等同步机制。 3. **初始化列表与委托构造** - 支持统一初始化语法,使用大括号`{}`进行初始化[^1]。 - 引入委托构造函数,用于复用其他构造函数代码[^3]。 4. **智能指针** - 标准库新增`std::shared_ptr`、`std::unique_ptr`和`std::weak_ptr`,提供内存管理的自动化解决方案[^1]。 5. **范围for循环** - 新增`for (auto& elem : container)`语法,简化容器遍历操作[^1]。 #### 二、C++14新特性 1. **放宽`constexpr`限制** - 在C++14中,`constexpr`函数可以包含更复杂的语句,如`if`和循环语句[^2]。 2. **返回类型推导** - 支持`auto`作为函数返回类型,并结合`decltype`实现返回类型的自动推导。 3. **泛型Lambda** - 允许Lambda表达式中的捕获列表使用`auto`,支持模板参数的隐式推导[^2]。 #### 三、C++17新特性 1. **结构化绑定** - 支持将元组或结构体解构为多个变量,例如: ```cpp std::tuple<int, double> t = {42, 3.14}; auto [i, d] = t; ``` 2. **内联变量** - 允许在头文件中定义`inline`变量,避免重复定义问题。 3. **`if`/`switch`语句初始化** - 允许在`if`或`switch`语句中直接初始化变量,例如: ```cpp if (int x = getValue(); x > 0) { // 使用x } ``` 4. **文件系统库** - 标准库新增`<filesystem>`,提供跨平台的文件系统操作接口。 #### 四、C++20新特性 1. **概念(Concepts)** - 提供了一种编译期约束机制,用于简化模板编程。 2. **模块(Modules)** - 替代传统的头文件机制,减少编译时间并提升模块化开发效率[^1]。 3. **协程(Coroutines)** - 提供对异步编程的支持,通过`co_await`等关键字实现[^1]。 4. **范围(Ranges)库** - 扩展了STL的功能,提供了更强大的迭代器和算法支持[^1]。 ```cpp // 示例代码:C++17结构化绑定 #include <tuple> #include <iostream> int main() { std::tuple<int, double> t = {42, 3.14}; auto [i, d] = t; std::cout << "Integer: " << i << ", Double: " << d << std::endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值