c++11的学习

news2024/11/24 10:04:01

1.初始化列表

在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。

struct Fun
{
	int x;
	int y;
};
struct Date
{
	Date(int _year, int _month, int _day)
		:year( _year)
		,month(_month)
		,day(_day)
	{

	}

	int year = 2005;
	int month = 01;
	int day = 17;
};
int main()
{
	Fun st = { 1,2 };//一切都是初始化列表
	int a = 10;
	int b = { 10 };
	int arr[10] = { 0 };
	Date d = { 2024,8,26 };//这个是参数一个一个对应,用的是初始化列表
	//先隐式类型转换,产生临时对象,再进行拷贝构造
	vector<int> v = { 1,2,3,4,5,6,7 };//这个初始化是 利用的是initializer_list
}

2.声明

2.1 auto 自动推出数据类型

在C++98中auto是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局 部的变量默认就是自动存储类型,所以auto就没什么价值了。C++11中废弃auto原来的用法,将 其用于实现自动类型腿断。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初 始化值的类型。

2.2  decltype   和auto 有点类似,也可以进行推到数据类型,主要的是将变量的类型声明为表达式指定的类型

3 nullptr 

在c++11中,c语言一直使用的NULL,被记录成了0,会出现匹配错误的问题,会匹配到整型,第二个是NULL会被记录成((void*)0),这样也是不行的,因为c++中void*转换成其它类型需要强转

4范围for

5.右值引用和移动语义

5.1 左值引用和右值引用 传统的C++语法中就有引用的语法,而C++11中新增了的右值引用语法特性,所以从现在开始我们 之前学习的引用就叫做左值引用。无论左值引用还是右值引用,都是给对象取别名。 什么是左值?什么是左值引用? 左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址+可以对它赋 值,左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。定义时const修饰符后的左 值,不能给他赋值,但是可以取它的地址。左值引用就是给左值的引用,给左值取别名。

左值:

右值:

左值和右值引用的互相转换:

int main()
{
	//左值
	int* p = new int(0);
	int b = 1;//左值有的可以修改
	const int c = b;//此时的左值不可以修改
	*p = 10;
	string s("111111");
	cout << &c << endl;
	cout << &s[0] << endl;

	//右值
	int x = 10,y=20;
	10;
	x + y;
	Fun(x);

	//左值的引用
	int*& rx1 = p;
	int& rx2 = b;
	const int& rx3 = c;

	//右值的引用
	int&& lx1= 10;
	int&& lx2 = x + y;
	int&& lx3 = Fun(x);
	
	//左值的引用 向右值
  //左值引用引用给右值取别名:不能直接引用,但是const 左值引用可以
	const int& rxx1 = 10;//右值都具有常性
	const int& rxx2 = x + y;
	const int& rxx3 = Fun(x);

	//右值引用 左值
  //右值引用引用给左值取别名:不能直接引用,但是move(左值)以后右值引用可以引用
	int*&& lxx1 = move(p);
	int&& lxx2 = move(b);
	const int&& lxx3 = move(c);


}

5.2:移动语义:移动拷贝和移动赋值

我们用模拟实现string 来举一个例子

 !:右值的引用它的本质上是左值,为什么呢,就拿移动拷贝来说 我们要举行swap转换,用swap转换各自的资源,右值一般是临时对象,常量,都具有const的性质,如果右值引用本质是右值,那么我们如何用swap来转换资源呢?为什么用swap转换资源,右值是将亡值,我们用swap转换资源,那么本身的那块拿去析构,剩下的那块也不用开辟空间进行拷贝,一举两得。

接下来我们模拟实现一下list 的移动语义:

我们可以看到在c++11中像push_back, insert 等等函数具有了右值版本,我们只需要稍加改造

<1>我们可以看到 在push_back中,传给insert的时候,要进行move一下,因为右值的引用本质是左值,如果直接穿的话,那么insert的时候就会匹配到左值insert 

<2> 在insert new开辟空间的时候,我们也要move一下,这是因为我们在new 开辟空间会调用此时结点的构造函数,那么构造函数我们也要写右值版本的,既然要匹配到右值版本的构造函数,我们就要传右值。

6.引用折叠 和 完美转发

引用折叠:在函数模板中,我们传参的时候,不知道是左值或者右值,我们可以使用引用折叠,自动让他识别,让编译器帮助我们实现两种版本的函数

完美转化:我们用了引用折叠,那么我们再次调用别的函数的时候,就像上面,假如是右值,传参的时候匹配到了左值该怎么办,我们就要用forwar函数,让他自动识别帮助我们传参

void Fun(int& x) { cout << "左值引用" << endl; }
void Fun(const int& x) { cout << "const 左值引用" << endl; }
void Fun(int&& x) { cout << "右值引用" << endl; }
void Fun(const int&& x) { cout << "const 右值引用" << endl; }
template<class T>
void PerfectForward(T&& s)
{
	Fun(forward<T>(s));//自动推导引用的类型
}
int main()
{
	PerfectForward(10);           // 右值

	int a;
	PerfectForward(a);            // 左值

	PerfectForward(std::move(a)); // 右值

	const int b = 8;
	PerfectForward(b);			  // const 左值
	PerfectForward(std::move(b)); // const 右值

	return 0;
}

7 可变参数模板

C++11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板,相比 C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改 进。然而由于可变模版参数比较抽象,使用起来需要一定的技巧,所以这块还是比较晦涩的。

我们打印一下参数包:

void Print()
{
	cout << "end" << endl;
}

template<class T, class ...Args>
void Print(T&& x, Args... args)//第一种方式 递归打印函数参数包
{
	cout << x << " ";
	Print(args...);
}

template<class ...Args>//函数参数包
void ShowList(Args... args)
{
	Print(args...);
}
template <class ...Args>
void ShowList(Args... args)//第二种 数组里面打印
{
	int arr[] = { (cout << (args) << " ", 0)... };//此时的逗号表达式是为了躲避编译器的检查,cout的返回不能隐式转换
	//但是存储数组的时候,是一个都好表达式,都会被判定成int 类型,所以可以进行打印

	cout << endl;
}

int main()
{
	ShowList(1, 'A', std::string("sort"));
	return 0;
}

递归: 它属于那种一次递归,减少一个参数那种。然后直到没有参数的时候,因为它这个属于编译时递归,我们不能用if return 的方式结束,我们用一个没有函数模板,没有参数的函数来结束。

第二种:属于再在数组中把参数一个一个让编译器实现,然后打印。

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

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

相关文章

【unity实战】Cinemachine虚拟相机+Character Controller实现俯视角、第三人称角色控制,复制粘贴即用

最终效果 文章目录 最终效果一、前言二、Character Controller参数介绍三、添加虚拟相机四、2.5D俯视角人物操作五、自带重力的SimpleMove 移动六、第三人称角色控制1、移动2、添加重力3、 加地面检测&#xff0c;限制在地面重力不要累加3.1、自定义球形区域检测3.2、使用isGro…

MMGPL: 基于图提示学习的多模态医学数据分析 文献速递-大模型与多模态诊断阿尔茨海默症与帕金森疾病应用

Title 题目 MMGPL: Multimodal Medical Data Analysis with Graph Prompt Learning MMGPL: 基于图提示学习的多模态医学数据分析 01 文献速递介绍 神经系统疾病&#xff0c;包括自闭症谱系障碍&#xff08;ASD&#xff09;&#xff08;Lord 等&#xff0c;2018&#xff09…

Socket【网络】

文章目录 源端口号和目的端口号端口号&&进程pid TCP协议和UDP协议网络字节序socket 接口sockaddrsocket代码 源端口号和目的端口号 端口号&#xff1a; 端口号是传输层协议的内容。端口号是一个2字节16位的整数。端口号用来标识一个进程&#xff0c;告诉操作系统&…

【SpringCloud应用框架】GateWay网关

Spring Cloud Alibaba 之初识GateWay网关 文章目录 一、网关介绍二、网关对比三、GateWay基本概念&#xff1a;执行流程&#xff1a; 总结 一、网关介绍 在微服务架构中&#xff0c;一个系统会被拆分为多个微服务。如果没有网关存在&#xff0c;我们只能在客户端记录梅哥为服务…

Windows下创建FTP服务器,实现文件共享

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 创建FTP服务器 在【启用和关闭 Windows 功能】中选中【FTP服务】【IIS管理控制台】 应用更改完成后&#xff0c;重启电脑。 执行 ipconfig 命令查看当前电脑…

LeetCode刷题:3.无重复字符的最长子串

问题&#xff1a;首先分析问题得出需求 1.要求得到一个唯一最长子串的序列的长度。 子串&#xff1a;依据其形式是拥有一段长度的&#xff0c;所以考虑滑动窗口 唯一&#xff1a;考虑使用HashSet 需求描述&#xff1a;要求得到滑动窗口的大小&#xff0c;也就是左右指针的距离&…

STC89C52 串口浅谈

文章目录 1. 串口1.1 串口概述1.2 串口相关概念1.3 UART1.4 STC89C52串口1.4.1 串口相关寄存器1.4.2 串口模式图 1.5 串口配置简单代码示例1.5.1 UART串口初始化1.5.2 串口中断函数模板 1. 串口 1.1 串口概述 串口&#xff08;serial&#xff09;是一种通讯接口&#xff0c;可…

如何在Mac电脑上本地部署Stable Diffusion:详细教程(webUI)

Stable Diffusion是一款强大的AI生成图像模型&#xff0c;它可以基于文本描述生成高质量的图像。对于想要在本地运行此模型的用户来说&#xff0c;使用Mac电脑部署Stable Diffusion是一个非常吸引人的选择&#xff0c;特别是对于M1或M2芯片的用户。本文将详细介绍如何在Mac上本…

【图像去噪】论文精读:Spatial-Adaptive Network for Single Image Denoising(SADNet)

请先看【专栏介绍文章】&#xff1a;【图像去噪&#xff08;Image Denoising&#xff09;】关于【图像去噪】专栏的相关说明&#xff0c;包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总&#xff08;更新中…

数据结构(邓俊辉)学习笔记】串 15——BM_GS算法:综合性能

1.BM之性能 接下来&#xff0c;针对已经综合了 bc 和 gs 两种策略的 BM 算法&#xff0c;标定它对应的复杂度&#xff0c;并将这种算法与此前的 KMP 以及蛮力算法在性能上做一个综合的对比分析。 首先是 BM 算法本身的性能。 在空间方面&#xff0c;除了模式串和文本串本身&a…

Qt:玩转QPainter序列十

前言 最后的一个解读QPainter源码的系列&#xff0c;剩下的源码全部都是内联函数&#xff0c;自己看看就好。 正文 渲染相关 void setRenderHint(RenderHint hint, bool on true); 功能: 启用或禁用特定的渲染提示。参数: hint&#xff1a;指定要设置的渲染提示&#xff0c;…

基于Leaflet Legend的图例数据筛选实践-以某市教培时空分布为例

目录 前言 一、关于Leaflet.Legend组件 1、Legend组件的主要参数 2、相关参数 二、Legend图例可视化控制 1、违规教培信息的管理 2、违规培训信息时空可视化及图例渲染控制 3、成果展示 三、总结 前言 在很多的地理时空分析系统中&#xff0c;我们经常会遇到一些需求。…

运维-3.分库分表

分库分表 1.介绍2.Mycat概述3.Mycat入门4.Mycat配置4.1 schema.xml4.1.1 schema标签4.1.2 dataNode标签4.1.3 dataHost标签 4.2 rule.xml4.3 server.xml4.3.1 system标签4.3.2 user标签 5.Mycat分片5.1 垂直拆分5.2 水平拆分5.3 分片规则5.3.1 范围分片5.3.2 取模分片5.3.3 一致…

若依微服务Admin控制台不显示ruoyi-file问题解决

本地启动完若依微服务,发现Admin控制台只显示了6个服务,其中ruoyi-file启动成功,但是没有在Admin控制台中显示处理,本章问题,给出这个问题的解决办法。 一、什么是服务监控 监视当前系统应用状态、内存、线程、堆栈、日志等等相关信息,主要目的在服务出现问题或者快要出…

机器学习和深度学习·贝叶斯优化和optuna

贝叶斯优化 贝叶斯优化的思想 先验&#xff1a;取点 似然&#xff1a;假设分布 取了n个点之后… 后验&#xff1a;近似取得极值 贝叶斯优化的数学过程 在贝叶斯优化的数学过程当中&#xff0c;我们主要执行以下几个步骤&#xff1a; 1 定义需要估计的 f ( x ) f(x) f(x)以及…

零基础学习Python(七)

1. 字符串常用方法 lower()、upper()&#xff1a;转换为小写字符串、大写字符串 split(str)&#xff1a;按照指定字符串str进行分割&#xff0c;结果为列表&#xff1a; email "123qq.com" print(email.split("")) [123, qq.com] count(str)&#xf…

MySQL 系统库

文章目录 一. 概念二. performance_schema1. 概念 2. 检查当前数据库版本是否支持3. performance_schema表分类5. 配置与使用6. 查看执行失败的SQL语句7. 查看最近事务执行信息8. 小结 三. sys系统库1. 使用须知2. 使用3. 查看慢SQL语句慢在哪4. 小结 四. Information_schema1.…

中国城市经济韧性数据集(2007-2022年)

数据来源&#xff1a;数据来自历年《中国城市统计NJ》、各省市《统计NJ》及《中国区域经济统计NJ》 时间范围&#xff1a;2007-2022年 数据范围&#xff1a;中国地级市样例数据&#xff1a; 包含内容&#xff1a; 全部内容下载链接&#xff08;原始数据计算代码最终数据&…

Spring Boot DevTools:简化开发,实现热部署

Spring Boot DevTools&#xff1a;简化开发&#xff0c;实现热部署 1、如何集成&#xff1f;MavenGradle 2、主要特性3、注意事项 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; Spring Boot DevTools是开发者的得力助手&#xff0c;它通过…

AR 眼镜之-系统通知定制(通知弹窗)-实现方案

目录 &#x1f4c2; 前言 AR 眼镜系统版本 系统通知定制 1. &#x1f531; 技术方案 1.1 技术方案概述 1.2 实现方案 1&#xff09;实现系统通知的监听 2&#xff09;系统通知显示&#xff1a;通知弹窗 2. &#x1f4a0; 实现系统通知的监听 2.1 继承 NotificationLi…