![](https://img-blog.csdnimg.cn/20190927151026427.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++11
文章平均质量分 70
从工程的角度,对常用的C++新特性进行总结归纳
优惠券已抵扣
余额抵扣
还需支付
¥19.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
Overboom
这个作者很懒,什么都没留下…
展开
-
[c++] --- 面试知识点
虚函数是在基类中声明的函数,可以在派生类中被重写。它们允许在运行时动态绑定函数调用,这意味着程序可以根据对象的实际类型来调用适当的函数。虚函数通过在函数声明前加上virtual关键字来定义。纯虚函数的定义: virtual 返回类型 函数名(形参) = 0含有纯虚函数的类叫抽象类抽象类的特点:不能用抽象类去实例化对象抽象类的作用:提供一个统一的接口,让子类去实现,子类实现之后才可以实例化对象这个问题从下面几个角度回答?1) C++中的多态有静态多态和动态多态两种形式。原创 2023-12-12 09:54:22 · 968 阅读 · 0 评论 -
[c++11] --- tuple
在 C++ 中,std::tuple 是一个模板类,用于将多个值组合为一个单独的对象。它是一个固定大小的集合,其中每个元素可以具有不同的类型。尽管 std::tuple 可以容纳多个值,但它不被视为容器类,因为它不提供常见的容器操作(如迭代器和添加/删除元素等)。与容器不同,std::tuple 具有固定的大小和类型,并且不支持动态调整大小。原创 2023-04-09 21:17:30 · 361 阅读 · 0 评论 -
[C++11 多线程异步] --- std::promise/std::future
future >头文件功能允许对特定提供者设置的值进行异步访问,可能在不同的线程中。这些提供程序(要么是promise 对象,要么是packaged_task对象,或者是对异步的调用async与future对象共享共享状态:提供者使共享状态就绪的点与future对象访问共享状态的点同步。原创 2022-10-05 20:31:23 · 382 阅读 · 0 评论 -
[C++11 多线程同步] --- 条件变量的那些坑【条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)】
执行结果如下:这里程序段本意是消费者线程阻塞,等待生产者生产数据后去通知消费者线程,这样消费者线程就可以拿到数据去消费。在consumer线程中sleep 1s,让生产者线程先执行,并通过notify_all通知消费者线程;此时消费者线程并没有执行到wait语句,也即消费者线程没有处于挂起状态,线程没有等待此条件变量上,通知信号就丢失了;1s后消费者线程再执行wait处于等待状态时,生产者不会再触发notify,消费者线程会一直阻塞。原创 2022-10-05 19:56:38 · 846 阅读 · 0 评论 -
[C++11 多线程同步] --- 条件变量
std::condition_variable 的拷贝构造函数被禁用,只提供了默认构造函数。与 std::condition_variable 类似,只不过 std::condition_variable_any 的 wait 函数可以接受任何 lockable 参数,而 std::condition_variable 只能接受 std::unique_lockstd::mutex类型的参数,除此以外,和 std::condition_variable 几乎完全一样。原创 2022-10-05 19:55:59 · 639 阅读 · 0 评论 -
[C++11 多线程同步] --- 互斥锁
互斥锁在有些资料中也被称之为互斥量,二者是一个东西。互斥锁是一种简单的加锁的方法来控制对共享资源的访问。只要某一个线程上锁了,那么就会强行霸占公共资源的访问权,其他线程试图访问资源会被阻塞,直到这个线程解锁了。互斥锁只有两种状态,即上锁( lock )和解锁( unlock )。原创 2022-10-04 21:38:58 · 355 阅读 · 0 评论 -
[C++11 多线程同步] --- 线程同步概述
多线程并发执行时有很多同学捋不清楚调度的随机性会导致哪些问题,要知道如果访问临界资源不加锁会导致一些突发情况发生甚至死锁。原创 2022-10-04 21:38:28 · 459 阅读 · 0 评论 -
[C++11] --- 移动语义和完美转发
拷贝构造函数和拷贝赋值函数区别?拷贝构造函数和拷贝赋值函数都是,使用a对象去初始化另一个a1对象若a1对象未实例化,则调用拷贝构造函数若a1对象已初始化,则调用拷贝赋值函数其中拷贝构造函数有三种调用方式,效果都都一样拷贝构造函数和移动构造函数的区别函数形参类型不同:拷贝构造函数形参类型为 &(左值引用)移动构造函数形参类型为 &&(右值引用)函数中操作不同:拷贝构造函数是先将传入的参数对象进行一次深拷贝,再传给新对象。有一次拷贝对象的开销。......原创 2022-08-28 17:12:14 · 438 阅读 · 0 评论 -
[C++11 模板的改进] --- 可变参数模板
C++11之前,类模板和函数模板只能含有固定数量的模板参数,C++11增强了模板功能,允许模板定义中包含0到任意个模板参数,这就是可变参数模板。可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,申明可变参数模板时需要在typename或class后面带上省略号 “…”一个可变参数模板函数的定义如下:1.2 参数包的展开1.2.1 递归方式展开通过递归方式展开函数包,需要提供一个参数包展开函数和一个终止递归函数。1.2.2 非递归方式展开递归函数展开参数包是一种标准做法,也比较好理解,但也原创 2022-06-05 14:20:15 · 187 阅读 · 1 评论 -
[C++11 模板的改进]
看一段示例代码:2 函数模板的默认模板参数C++11之前,类模板支持默认模板参数,但是不支持函数模板的默认模板参数。类模板的默认模板参数必须是从右往左定义,函数模板的默认模板参数则没有这个限定:...原创 2022-06-05 13:56:06 · 148 阅读 · 0 评论 -
[C++ 11 类型推导] --- auto 与 decltype
C++11 引入了auto和decltype关键字实现类型推导,通过这两个关键字不仅能方便地获取复杂类型,而且还能简化书写,提高编码效率。1. auto编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型。然而做到这一点并非那么容易(特别是模板中),有时候根本做不到。为了解决这个问题,C++11新标准就引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。和原来那些只对应某种特定的类型说明符(例如 int)不同。auto 让编译器通过初始值来进行类型推演。原创 2021-12-30 09:31:09 · 475 阅读 · 0 评论 -
[C++11 类的改进] --- 继承控制:final和override
C++11之前一直没有继承控制关键字,禁用一个类的进一步衍生比较麻烦,C++11添加了两个继承控制关键字,final和overridefinal关键字有两个作用:2 override关键字override关键字确保在派生类中声明的函数跟基类的虚函数有相同的签名。如果不加override,在子类中写virtual int func(int b) override这个函数的时候,可以会将参数写错或写漏,这样就不是重写,就是子类覆盖父类的函数。加上override保证子类与父类有相同的签名。...原创 2022-06-05 13:22:13 · 262 阅读 · 0 评论 -
[C++11 类的改进] --- 继承构造函数和委托构造函数
C++11 中提供的继承构造函数可以让派生类直接使用基类的构造函数,而无需自己再写构造函数,尤其是在基类有很多构造函数的情况下,可以极大地简化派生类构造函数的编写。先来看没有继承构造函数之前的处理方式:在子类中初始化从基类继承的类成员,需要在子类中重新定义和基类一致的构造函数,这是非常繁琐的,C++11 中通过添加继承构造函数这个新特性完美的解决了这个问题,使得代码更加精简。继承构造函数的使用方法是这样的:通过使用 using 类名::构造函数名(其实类名和构造函数名是一样的)来声明使用基类的构造函数,原创 2022-06-05 13:21:57 · 198 阅读 · 0 评论 -
[C++11 类的改进] --- 继承控制:=default和=delete
在 C++ 中声明自定义的类,编译器会默认帮助程序员生成一些他们未自定义的成员函数。这样的函数版本被称为” 默认函数”。这样的函数一共有六个:有时程序员会忘记上面提到的规则,最常见的是声明了带参数的构造,如果还需要无参构造函数,这时候必须定义出不带参数的版本。不过通过编译器的提示,这样的问题通常会得到更正。但更为严重的问题是,一旦声明了自定义版本的构造函数,则有可能导致我们定义的类型不再是 POD 类型,我们便不再能够享受 POD 类型为我们带来的便利。对于上面提到的这些,我们无需过度担心,因为 C++11原创 2022-06-05 13:21:14 · 282 阅读 · 0 评论 -
[C++11] --- 易用性改进
关于 C++ 中的变量,数组,对象等都有不同的初始化方法,在这些繁琐的初始化方法中没有任何一种方式适用于所有的情况。为了统一初始化方式,并且让初始化行为具有确定的效果,在 C++11 中提出了列表初始化的概念。Note: 在初始时,{} 前面的等号是否书写对初始化行为没有任何影响列表初始化的好处:防止类型收窄看一段示例代码:在C语言中可正常编译并运行,只是b的值为0但是在C++中,如果采用列表初始化的方式对b进行初始化,编译器会报类型收窄的错误2 基于范围的for循环C++98/03 中普通的原创 2022-06-05 13:21:38 · 242 阅读 · 0 评论 -
[C++11 易用性改进] --- 数值类型和字符串之间的转换
在 C++11 中提供了专门的类型转换函数,可以方便的进行数值类型和字符串类型的转换1. 数值转换为字符串使用 to_string() 方法可以非常方便地将各种数值类型转换为字符串类型,这是一个重载函,函数声明位于头文件 中,函数原型如下:// 头文件 <string>string to_string (int val);string to_string (long val);string to_string (long long val);string to_string (u原创 2021-12-30 15:12:42 · 398 阅读 · 0 评论 -
[C++11 易用性改进] --- 原始字面量
1. 原始字面量是干什么的在 C++11 中添加了定义原始字符串的字面量,定义方式为:R “xxx(原始字符串)xxx” 其中()两边的字符串可以省略。原始字面量 R 可以直接表示字符串的实际含义,而不需要额外对字符串做转译或连接等操作。2. code示例#include<iostream>#include<string>using namespace std;int main(){ string str = "D:\hello\world\test.text原创 2021-09-29 19:01:13 · 168 阅读 · 0 评论 -
[C++11] --- 智能指针
1. 为什么需要引入智能指针智能指针是一个类,当超出了类的实例对象作用域时,会自动调用对象的析构函数来释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都是由程序员自己管理。但是使用普通指针容易造成堆内存泄露(忘记释放),二次释放等内存泄露问题,使用智能指针可以更好的管理堆内存。2. C++11智能指针介绍C++里面的四个智能指针包含在头文件中: auto_ptr, unique_ptr,share原创 2021-07-27 13:58:19 · 609 阅读 · 2 评论 -
[C++ 11] --- lambda表达式
0. lambda表达式特性lambda 表达式是 C++11 最重要也是最常用的特性之一,这是现代编程语言的一个特点,lambda 表达式有如下的一些优点:声明式的编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或函数对象简洁:避免了代码膨胀和功能功能分散,使得开发更加高效在需要的时间和地点实现功能闭包,使得程序更加灵活1. lambda表达式语法lambda表达式定义了一个匿名函数,并且可以补货一定范围内的变量。一般语法形式如下:[capture](parameter原创 2021-10-01 13:59:06 · 162 阅读 · 0 评论 -
[C++11] --- std::bind和std::function解析
1. std::functionstd::function包含于头文件 #include中,可将各种可调用实体进行封装统一,包括1. 普通函数2. lambda表达式(匿名函数)3. 函数指针4. 仿函数(functor 重载括号运算符实现)5. 类成员函数6. 静态成员函数下面给出示例代码进行解析:#include <iostream>#include <functional>using namespace std;std::function<b转载 2022-01-02 20:52:25 · 431 阅读 · 0 评论 -
使用std :: thread将多个线程的数组组合在一起使用std :: thread
#include <iostream> #include <vector> #include <thread> #include <mutex> #include <cassert> #include "boost/multi_array.hpp" std::vector<float> Array; std::mutex Array_mutex; void Summation(int sample_size) {原创 2022-03-16 22:33:26 · 1164 阅读 · 0 评论 -
[C++ 11多线程] --- call_once
在某些特定情况下,某些函数只能在多线程环境下调用一次,比如:要初始化某个对象,而这个对象只能被初始化一次,就可以使用 std::call_once() 来保证函数在多线程环境下只能被调用一次。使用 call_once() 的时候,需要一个 once_flag 作为 call_once() 的传入参数,该函数的原型如下:// 定义于头文件 <mutex>template< class Callable, class... Args >void call_once( std::on原创 2021-10-25 22:30:00 · 202 阅读 · 0 评论 -
[C++ 11 多线程之线程命名空间] --- this_thread
在 C++11 中不仅添加了线程类,还添加了一个关于线程的命名空间 std::this_thread,在这个命名空间中提供了四个公共的成员函数,通过这些成员函数就可以对当前线程进行相关的操作了。1. get_id()调用命名空间 std::this_thread 中的 get_id() 方法可以得到当前线程的线程 ID,函数原型如下:thread::id get_id() noexcept;关于函数使用对应的示例代码如下:#include <iostream>#include &l原创 2021-10-25 21:45:00 · 550 阅读 · 0 评论 -
[C++ 11多线程编程] --- std::thread
C++11 之前,C++ 语言没有对并发编程提供语言级别的支持,这使得我们在编写可移植的并发程序时,存在诸多的不便。现在 C++11 中增加了线程以及线程相关的类,很方便地支持了并发编程,使得编写的多线程程序的可移植性得到了很大的提高。C++11 中提供的线程类叫做 std::thread,基于这个类创建一个新的线程非常的简单,只需要提供线程函数或者函数对象即可,并且可以同时指定线程函数的参数。我们首先来了解一下这个类提供的一些常用 API:1. 线程类构造函数// ①thread() noexce原创 2021-10-25 21:00:00 · 472 阅读 · 0 评论