C++11新增的特性

news2024/11/28 15:49:41

一.列表初始化/{}初始化

回顾:C++98中⼀般数组和结构体可以⽤{}进⾏初始化。

1.C++11中,一切对象皆可用{}初始化,内置类型⽀持,⾃定义类型也⽀持(⾃定义类型本质是类型转换,中间会产⽣临时对象,最后优化了以后变成直接构造)

2.在{}初始化的过程中,可以省略掉=

注:{}初始化不便于对容器进行初始化,若要对容器进行多参数的初始化则需要写多个构造函数,为了解决这一问题,C++11引入了initializer_list

二.C++11中的std::initializer_list

1.initializer_list是一个类模板,这个类的本质是在底层开⼀个数组,将数据拷⻉过来,initializer_list内部有两个指针分别指向数组的开始和结尾。

2.initializer_list - C++ Reference (cplusplus.com),std::initializer_list⽀持迭代器遍历。

3.容器⽀持⼀个std::initializer_list的构造函数,即⽀持任意多个值构成的{x1,x2,x3...}进⾏
初始化。

三.右值引用和移动语义

1.左值和右值

左值:左值是⼀个表示数据的表达式,或是变量名,或是解引⽤的指针

<1>⼀般是有持久状态,存储在内存中,可以获取它的地址;

<2>左值可以出现赋值符号的左边,也可以出现在赋值符号右边;

<3>定义时const修饰符后的左值,不能给他赋值,但是可以取它的地址。

右值:右值是⼀个表示数据的表达式,或是字⾯值常量,或是表达式求值过程中创建的临时对象,或是存储于寄存器中的变量

<1>右值不能取地址

<2>右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边。

注:左值和右值的核心区别就是是否能取地址

2.左值引用和右值引用

<1>示例:左值引用:Type& r1 = x;  右值引用:Type&& rr1 = y;

<2>左值引用可以引用左值,也可以使用const 左值来引用右值

      右值引用可以引用右值,也可以引用move(左值)

注:1.move是库⾥⾯的⼀个函数模板,本质内部是进⾏强制类型转换;

2.对左值move之后,再次使用该左值需要慎重,因为该左值的资源可能已经被转移走了

<3>变量表达式都是左值属性,即⼀个右值被右值引⽤绑定后,右值引⽤的变量在用于变量表达式时的属性仍是左值

<4>左值引⽤和右值引⽤都是取别名,不开空间

<5>右值引⽤可⽤于为临时对象延长⽣命周期,const的左值引⽤也能延⻓临时对象⽣命周期,但这些对象⽆法被修改。

3.左值和右值的参数匹配

C++11中分别重载了左值引⽤、const左值引⽤、右值引⽤作为形参的f函数。若实参是左值则会匹配f(左值引⽤);若实参是const 左值则会匹配f(const 左值引⽤);若实参是右值则会匹配f(右值引⽤)

4.右值引用和移动语义的使用场景

回顾:左值引用的使用场景:函数中左值引⽤传参和左值引⽤传返回值。它可以减少拷⻉,同时还可以修改实参和修改返回对象的值

<1>移动构造:移动构造函数是⼀种构造函数,类似拷⻉构造函数。移动构造函数要求第⼀个参数是该类类型的右值引⽤,如果还有其他参数,额外的参数必须有缺省值。

<2>移动赋值:移动赋值是⼀个赋值运算符的重载,他跟拷⻉赋值构成函数重载,类似拷⻉赋值函数,移动赋值函数要求第⼀个参数是该类类型的右值引⽤。

注:对于像string/vector这样的深拷⻉的类或者包含深拷⻉的成员变量的类,移动构造和移动赋值的意义更加明显,因为移动构造和移动赋值的第⼀个参数都是右值引⽤的类型,右值引用的本质是要“窃取”引⽤的右值对象的资源,⽽不是像拷⻉构造和拷⻉赋值那样去拷⻉资源,从而提⾼效率。

<3>右值引⽤和移动语义解决传值返回问题

<4>右值引用和移动语义在传参的提效:

当实参是⼀个左值时,容器内部继续调⽤拷贝构造进行拷贝,将对象拷贝到容器空间中的对象

当实参是⼀个右值,容器内部则调⽤移动构造,右值对象的资源被转移到容器空间中的对象上

5.类型分类

四.引用折叠

1.通过模板或typedef中的类型操作可以构成引⽤的引⽤

2.规则:右值引⽤的右值引⽤折叠成右值引⽤,所有其他组合均折叠成左值引⽤。

3.万能模板:当传递左值时就是左值引⽤,传递右值时就是右值引⽤

template < class T>
void Function(T && t)
{
	//....
}

五.完美转发forward

1.引入原因:由于右值引⽤变量表达式的属性是左值,即当传入右值引用的表达式时,Function函数中t的属性是左值,此时若把t传递给下⼀层函数Fun,那么匹配的都是左值引⽤版本的Fun函数。若想要保持t对象的属性,就需要使⽤完美转发实现。

2.完美转发forward本质是⼀个函数模板,它主要通过引⽤折叠的⽅式实现,若传递给Function的实参是右值,T被推导为type&&,没有折叠,forward内部t被强转为右值引⽤返回;传递给Function的实参是左值,T被推导为type&,引⽤折叠为左值引⽤,forward内部t被强转为左值引⽤返回。

3.使用示例:Fun(forward<T>(t));

六.可变参数模板

1.基本内容:可变参数模板包括可变数量参数的函数模板和类模板;可变数⽬的参数被称为参数包,存在两种参数包:模板参数包,表⽰零或多个模板参数;函数参数包:表⽰零或多个函数参数。

2.语法:⽤省略号来指出⼀个模板参数或函数参数来表⽰⼀个包。在模板参数列表中,class...或
typename...指出接下来的参数表⽰零个或多个类型列表;在函数参数列表中,类型名后⾯跟...指出
接下来表⽰零个或多个形参对象列表;函数参数包可以⽤左值引⽤或右值引⽤表⽰,跟前⾯普通模板⼀样,每个参数实例化时遵循引⽤折叠规则。

template <class ...Args> 
void Func(Args... args) 
{}

template <class ...Args> 
void Func(Args&... args) 
{}

template <class ...Args> 
void Func(Args&&... args) 
{}

3.本质:去实例化对应类型和个数的多个函数。

4.可以使⽤sizeof...运算符去计算参数包中参数的个数。

5.包扩展:解析出参数包,通过在模式的右边放⼀个省略号(...)来触发扩展操作

代码实现:

void ShowList()
{
	//编译器递归的终⽌条件,参数包是0个时,直接匹配这个函数 
	cout << endl;
}

template < class T, class ...Args>
void ShowList(T x, Args... args)
{
     cout << x << " ";
	 // args是N个参数的参数包 
	 // 调⽤ShowList,参数包的第⼀个传给x,剩下N-1传给第⼆个参数包 
     ShowList(args...);
}

// 编译时递归推导解析参数 
template < class ...Args>
void Print(Args... args)
{
    ShowList(args...);
}

6.emplace系列接口

<1>empalce系列的接⼝均为模板可变参数

<2>emplace功能上兼容push和insert系列,部分场景下,emplace可以直接构造,而push和insert需要使用构造+移动构造,或是构造+拷贝构造,相对而言,emplace更好用,更强大

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2249162.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP学习

1、概述 2、SD 2.1 销售中的企业结构 2.2流程概览

Linux之网络基础

网络发展 网络的发展可以从人与人之间的工作模式开始谈起, 人与人的工作模式反应了机器与机器的工作模式: 1. 独立模式: 在网络发展的早期计算机间处于独立模式, 计算机之间相互独立 最开始计算机之间是独立运行的, 数据之间的交互需要人用软盘等存储介质拷贝过去, 一般涉及…

数字图像处理(9):VGA接口及其时序

&#xff08;1&#xff09;特点&#xff1a;成本低、结构简单、应用灵活 VGA接口需要五个信号&#xff1a;R、G、B、Hsync、Vsync &#xff08;2&#xff09;VGA的工作原理&#xff1a; 设定一个高速时钟信号&#xff08;像素时钟&#xff09;来控制每个像素的传输速率&#…

111. UE5 GAS RPG 实现角色技能和场景状态保存到存档

实现角色的技能存档保存和加载 首先&#xff0c;我们在LoadScreenSaveGame.h文件里&#xff0c;增加一个结构体&#xff0c;用于存储技能相关的所有信息 //存储技能的相关信息结构体 USTRUCT(BlueprintType) struct FSavedAbility {GENERATED_BODY()//需要存储的技能UPROPERT…

【jmeter】服务器使用jmeter压力测试(从安装到简单压测示例)

一、服务器上安装jmeter 1、官方下载地址&#xff0c;https://jmeter.apache.org/download_jmeter.cgi 2、服务器上用wget下载 # 更新系统 sudo yum update -y# 安装 wget 以便下载 JMeter sudo yum install wget -y# 下载 JMeter 压缩包&#xff08;使用 JMeter 官方网站的最…

图像算法在生物医药领域的应用

摘要&#xff1a; 随着科技的飞速发展&#xff0c;图像算法在生物医药领域的应用日益广泛且深入。本文详细阐述了图像算法在生物医药多个方面的应用&#xff0c;包括医学影像诊断、病理图像分析、药物研发、细胞图像研究以及生物医学工程等。通过对这些应用的探讨&#xff0c;展…

注意力(Attention)机制详解(附代码)

Attention机制是深度学习中的一种技术&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;和计算机视觉领域中得到了广泛的应用。它的核心思想是模仿人类的注意力机制&#xff0c;即人类在处理信息时会集中注意力在某些关键部分上&#xff0c;而忽略其他不那么重要的…

Jmeter测试nginx部署的静态网页最大在线人数

一、下载Jmeter apache-jmeter-5.4.3.tar资源-CSDN文库 解压之后&#xff0c;双击ApacheJMeter.jar,即可打开 二、测试最大在线人数 1、plugins-manager下载安装 起初刚解压的jmeter里面没有插件管理这个选项 去官网下载&#xff1a;Install :: JMeter-Plugins.org 将下载j…

【深度学习|目标跟踪】StrongSort 详解(以及StrongSort++)

StrongSort详解 1、论文及源码2、DeepSort回顾3、StrongSort的EMA4、StrongSort的NSA Kalman5、StrongSort的MC6、StrongSort的BOT特征提取器7、StrongSort的AFLink8、未完待续 1、论文及源码 论文地址&#xff1a;https://arxiv.org/pdf/2202.13514 源码地址&#xff1a;https…

Scala关于成绩的常规操作

score.txt中的数据&#xff1a; 姓名&#xff0c;语文&#xff0c;数学&#xff0c;英语 张伟&#xff0c;87&#xff0c;92&#xff0c;88 李娜&#xff0c;90&#xff0c;85&#xff0c;95 王强&#xff0c;78&#xff0c;90&#xff0c;82 赵敏&#xff0c;92&#xff0c;8…

OpenAI Whisper 语音识别 模型部署及接口封装

环境配置: 一、安装依赖&#xff1a; pip install -U openai-whisper 或者&#xff0c;以下命令会从这个存储库拉取并安装最新的提交&#xff0c;以及其Python依赖项&#xff1a; pip install githttps://github.com/openai/whisper.git 二、安装ffmpeg&#xff1a; cd …

草图大师2020安装教程附安装包下载

软件介绍 草图大师&#xff08;Sketchup&#xff09;是由谷歌公司推出的一款环保型3D建模软件。草图大师可以快速和方便地创建、观察和修改三维创意&#xff0c;具有沿路径放样、导入的2D物体可随视角转动、布尔运算等功能。传统铅笔草图的优雅自如&#xff0c;现代数字科技的…

野火直播 5.7.5x | 频道丰富,有国外频道,部分支持回看

野火直播是一款专为电视盒子设计的电视直播软件&#xff0c;提供海量的电视直播资源和丰富的内容选择。涵盖全球多地的电视台直播源&#xff0c;包括央视、卫视、地方台、海外台等上千个电视频道。软件界面简洁&#xff0c;操作便捷&#xff0c;支持高清流畅播放&#xff0c;并…

题解 洛谷 Luogu P1182 数列分段 Section II 二分答案 C/C++

题目传送门&#xff1a; P1182 数列分段 Section II - 洛谷 | 计算机科学教育新生态https://www.luogu.com.cn/problem/P1182思路&#xff1a; 二分答案&#xff0c;每次以区间 [l, r] 中点 m 为每段和的阈值 判断在此前提下&#xff0c;划分段数是否不大于 M 是就记录答案…

Rust语言俄罗斯方块(漂亮的界面案例+详细的代码解说+完美运行)

tetris-demo A Tetris example written in Rust using Piston in under 500 lines of code 项目地址: https://gitcode.com/gh_mirrors/te/tetris-demo 项目介绍 "Tetris Example in Rust, v2" 是一个用Rust语言编写的俄罗斯方块游戏示例。这个项目不仅是一个简单…

Hot100 - 除自身以外数组的乘积

Hot100 - 除自身以外数组的乘积 最佳思路&#xff1a; 此问题的关键在于通过两次遍历&#xff0c;分别计算从左侧和右侧开始的累积乘积&#xff0c;以此避免使用额外的除法操作。 时间复杂度&#xff1a; 该算法的时间复杂度为 O(n)&#xff0c;因为我们只需要遍历数组两次。…

通过抓包,使用frida定位加密位置

首先我们抓取一下我们要测试的app的某一个目标api&#xff0c;通过抓api的包&#xff0c;得到关键字。 例如&#xff1a;关键字&#xff1a;x-sap-ri 我们得到想要的关键字后&#xff0c;通过拦截 类&#xff0c;寻找我们的关键字&#xff0c;及找到发包收包的位置&#xff0c…

【模型学习之路】TopK池化,全局池化

来学学图卷积中的池化操作 目录 DataBatch Dense Batching Dynamic Batching DataBatch 存取操作 TopKPooling GAP/GMP 一个例子 后话 DataBatch 当进行图级别的任务时&#xff0c;首先的任务是把多个图合成一个batch。 在Transformer中&#xff0c;一个句子的维度是…

<项目代码>YOLOv8 停车场空位识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

如何在Python中进行数学建模?

数学建模是数据科学中使用的强大工具&#xff0c;通过数学方程和算法来表示真实世界的系统和现象。Python拥有丰富的库生态系统&#xff0c;为开发和实现数学模型提供了一个很好的平台。本文将指导您完成Python中的数学建模过程&#xff0c;重点关注数据科学中的应用。 数学建…