C++——C++11 第一篇
目录
统一的列表初始化
{}初始化
decltype
编辑 nullptr
STL中一些变化
右值引用和移动语义
左值引用和右值引用
总结
左值引用优缺点
右值引用(将亡值)
拷贝赋值和移动赋值
万能引用|完美转发
移动构造和移动赋值注意事项
delete
点击跳转了解C++11
统一的列表初始化
{}初始化
C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自
定义的类型,使用初始化列表时,可添加等号(=),也可不添加。
std::initializer_list使用场景:
std::initializer_list一般是作为构造函数的参数,C++11对STL中的不少容器就增加
std::initializer_list作为参数的构造函数,这样初始化容器对象就更方便了。也可以作为operator=
的参数,这样就可以用大括号赋值
把大括号里面的东西给对象,对象就会被认为是initializer_list类型
点击跳转了解
所有的容器都支持了这样的构造函数,所以我们可以用列表初始化。
调用支持list(initializer_list<value_type>il)类似这样的构造函数
我们自己写的vectoru不支持这种写法 ,因为我们没initializer_list,我们在之前写的vector中这样写,就可以实现C++11这种写法
有了上面的initializer_list,我们还可以这样写
v4是隐式类型转换,而且调用了构造函数
map也可以这样写,首先是map支持 initializer_list的构造,而每个数据都是pair,pair支持初始化,调用了pair的构造。
C++11以后一切对象都可以用列表初始化,但是普通对象最好用以前的方式初始化,容器之类的可以用列表初始化
decltype
关键字decltype将变量的类型声明为表达式指定的类型。
y1的类型是由x类型决定,y2的类型由等号右边的值决定,auto和decltype有差异,俩者不一样。
nullptr
由于C++中NULL被定义成字面量0,这样就可能回带来一些问题,因为0既能指针常量,又能表示
整形常量。所以出于清晰和安全的角度考虑,C++11中新增了nullptr,用于表示空指针。
STL中一些变化
新容器
用橘色圈起来是C++11中的一些几个新容器,但是实际最有用的是unordered_map和
unordered_set。这两个我们前面已经进行了非常详细的讲解,其他的大家了解一下即可。
容器中的一些新方法
都支持initializer_list构造,用来支持列表初始化。
如果我们再细细去看会发现基本每个容器中都增加了一些C++11的方法,但是其实很多都是用得
比较少的。
比如提供了cbegin和cend方法返回const迭代器等等,但是实际意义不大,因为begin和end也是
可以返回const迭代器的,这些都是属于锦上添花的操作。
array对越界很敏感。实际情况arrar用的很少,因为C语言使用关了。
右值引用和移动语义
左值引用和右值引用
什么是左值?什么是左值引用?
左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址+可以对它赋
值,左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。定义时const修饰符后的左
值,不能给他赋值,但是可以取它的地址。左值引用就是给左值的引用,给左值取别名。
什么是右值?什么是右值引用?
右值也是一个表示数据的表达式,如:字面常量、表达式返回值,函数返回值(这个不能是左值引
用返回)等等,右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,右值不能
取地址。右值引用就是对右值的引用,给右值取别名。
右值不能取地址
左值引用不能去引用右值,加上const就可以
所以在函数传参的时候我们如果使用了引用传参,就加const,这样该函数既能接收左值,又能接收右值,若不加const只能加收左值引用,不能引用右值
右值引用不能直接引用左值,对左值加上move函数,右值引用就可以引用左值了
此时不报错
需要注意的是右值是不能取地址的,但是给右值取别名后,会导致右值被存储到特定位置,且可
以取到该位置的地址,也就是说例如:不能取字面量10的地址,但是rr1引用后,可以对rr1取地
址,也可以修改rr1。如果不想rr1被修改,可以用const int&& rr1 去引用,是不是感觉很神奇,
这个了解一下实际中右值引用的使用场景并不在于此,这个特性也不重要。
这里rr1和rr2都是左值,因为他们可以进行取地址
总结
左值引用总结:
我们可以获取它的地址+可以对它赋值,左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。
1. 左值引用只能引用左值,不能引用右值。
2. 但是const左值引用既可引用左值,也可引用右值
右值引用总结:
右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,右值不能
取地址。
1. 右值引用只能右值,不能引用左值。
2. 但是右值引用可以move以后的左值。
左值引用优缺点
左值引用解决哪些问题:
1.做参数
a.减少拷贝,提高效率 b.做输出型参数
2.做返回值
a.减少拷贝,提高效率 b.引用返回,可以修改返回对象(比如:operator[]).
缺点:
以to_string为例 ,它是传值返回,简单实现to_string,返回的str是局部对象,出了作用域就会销毁,不能用左值引用返回,如果用左值引用返回此时程序就崩了,因为str已经析构了。
还有这道杨辉三角的返回值,返回的是vector<vector<int>>,C++98左值引用面对这种场景很难处理
我们可以这样修改,这种优化的缺点不太符合使用习惯
右值引用(将亡值)
C++11的右值引用就能解决上面的问题
这里有俩次string的拷贝构造,编译器优化后只有一次拷贝构造,这里出了作用域str就销毁,所以不能用左值引用返回,我们可以用右值返回
namespace myspace
{myspace::string to_string(int value){myspace::string str;//return str;}
}
int main()
{myspace::string ret = to_string(-3456);return 0;
}
右值引用的提出,产生了移动构造
拷贝构造是左值引用,移动构造是右值引用,右值引用也可以走拷贝构造因为被const所修饰,C++每次在选择函数时,会选择最匹配的函数进行使用,既有左值引用又有右值引用,当使用右值引用时,就会走右值引用
右值:1.内置类型右值——纯右值(如x+y) 2.自定义类型右值——将亡值(声明周期一般只在那一行或函数结束)
这里s是将亡值,用swap保留s的资源。所以叫移动构造
str1的资源被转移,move(str1)这里吧str1转成了右值,str1就是将亡值,str1的资源就被转移了
这里之前是一次拷贝构造,现在是一次移动构造,选择最匹配的函数,拷贝构造的代价要大于移动构造的代价,因为拷贝了临时对象之后,还要释放临时对象,移动构造是直接转移资源,不需要拷贝。
注释掉移动构造变成了拷贝构造
左边是拷贝构造(此时没有写移动构造),右边是写了移动构造之后,编译器匹配到了移动构造
拷贝赋值和移动赋值
屏蔽掉移动构造之后运行程序。
取消移动构造的注释,加上移动赋值,把s和将亡值进行交换,将亡值在被销毁的时候,会带着之前s的值一并被销毁
右值引用增加了移动构造和移动赋值之后,提高了效率,减少了资源的拷贝和释放,直接把资源进行交换。
右值引用在延长对象的生命周期,这种说法是错的,因为他转移了资源,并没有延长对象的生命周期
这里s1+s2是一个表达式,表达式的值是一个临时值,临时对象是右值(将亡值)
C++11以后提供了移动构造和移动赋值
STL中所有的插入接口,都有右值引用,解决了用传值返回类型对象的拷贝问题
这里传匿名对象(匿名对象周期只在那一行),传的是右值(将亡值),这里转移俩次是跟内部实现有关系,这个不需要关注,在这里只需搞清楚移动构造即可
万能引用|完美转发
如果普通参数是这样则成为右值版本,但是在模板里这样使用就会被称作万能引用,引用折叠。
折叠的规则很复杂,简单来说就是右值,左值都能传过去,即T既能引用左值,又能引用右值
模板中的&&不代表右值引用,而是万能引用,其既能接收左值又能接收右值。
// 模板的万能引用只是提供了能够接收同时接收左值引用和右值引用的能力,
// 但是引用类型的唯一作用就是限制了接收的类型,后续使用中都退化成了左值,
引用折叠以后,统统变成了左值
完美转发: std::forward<T>(t)在传参的过程中保持了t的原生类型属性。
完美转发引用场景
应用在以前写的链表的push_back
main函数
理论而言第一个push_back走左值版本,第二个走右值版本,但是这里都是拷贝构造
这是因为万能引用进行了折叠,这是语法特性,我们进行完美转发
但结果还是不对,这是因为我们给节点没有提供右值引用版本
给节点提供右值引用版本
但结果还是拷贝构造
给insert进行完美转发
给insert相关的都进行完美转发
此时结果正常
移动构造和移动赋值注意事项
如果你没有自己实现移动构造函数,且没有实现析构函数 、拷贝构造、拷贝赋值重载中的任
意一个(如果实现了这里面的任意一种,编译器会调用拷贝构造)。那么编译器会自动生成一个默认移动构造。默认生成的移动构造函数,对于内置类
型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动构造,
如果实现了就调用移动构造,没有实现就调用拷贝构造。
如果你没有自己实现移动赋值重载函数,且没有实现析构函数 、拷贝构造、拷贝赋值重载中
的任意一个(如果实现了这里面的任意一种,编译器会调用拷贝赋值),那么编译器会自动生成一个默认移动赋值。默认生成的移动构造函数,对于内
置类型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动赋
值,如果实现了就调用移动赋值,没有实现就调用拷贝赋值。(默认移动赋值跟上面移动构造
完全类似)
如果你提供了移动构造或者移动赋值,编译器不会自动提供拷贝构造和拷贝赋值。
当存在析构或拷贝构造或构造时,我们可以强制生成移动构造和移动赋值
强制生成默认函数的关键字default:
C++11可以让你更好的控制要使用的默认函数。假设你要使用某个默认的函数,但是因为一些原
因这个函数没有默认生成。比如:我们提供了拷贝构造,就不会生成移动构造了,那么我们可以
使用default关键字显示指定移动构造生成。
delete
禁止生成默认函数的关键字delete:
如果能想要限制某些默认函数的生成,在C++98中,是该函数设置成private,并且只声明补丁
已,这样只要其他人想要调用就会报错。在C++11中更简单,只需在该函数声明加上=delete即
可,该语法指示编译器不生成对应函数的默认版本,称=delete修饰的函数为删除函数。
这里以不想让Person对象拷贝为例
继承和多态中的final与override关键字前面博客已经说过
将析构用delete修饰,在哪个区域都无法创建对象 ,因为创建的对象最后要调用析构
如果要创建对象只有一种方法, 使用new,new出来空间的被指针接收,指针不会调用析构函数
如果在构造的时候new一块空间,这回导致资源泄露,因为析构被禁了
此时手动delete会出错,因为要调析构,析构此时调不了
我们可以手动写一个释放空间的函数,调用这个函数即可
这里的空间有俩层,destory只释放了_str所指向的空间,而ptr指向的空间没有被释放
可用这种方法解决
相关文章:
C++——C++11 第一篇
目录 统一的列表初始化 {}初始化 decltype 编辑 nullptr STL中一些变化 右值引用和移动语义 左值引用和右值引用 总结 左值引用优缺点 右值引用(将亡值) 拷贝赋值和移动赋值 万能引用|完美转发 移动构造和移动赋值注意…...
Spring Data JPA 中 CrudRepository 和 JpaRepository 的区别
1 问题描述Spring Data JPA 中,CrudRepository 和 JpaRepository 有何区别?当我在网上找例子的时候,发现它们可以互相替换使用。它们有什么不同呢?为什么你习惯用其中的一个而不是另一个呢?2 CrudRepository 和 JpaRep…...
推荐几款好用的数据库管理工具
本文主要介绍几款常用的数据库管理软件(客户端),包括开源/免费的、商用收费的,其中有一些是专用于 MySQL 数据库的,例如 MySQL Workbench、phpMyAdmin,有一些是支持多种 SQL、NoSQL 数据库的,例…...
DPDK — 性能优化手段
目录 文章目录 目录硬件布局层面的优化操作系统层面的优化Linux 操作系统版本应用程序层面的优化Cache 优化内存对齐内存预取SIMD 报文批处理DDIO使用高级 CPU 指令集硬件布局层面的优化 DPDK 在硬件布局层面的优化,主要体现在以下几个方面: CPU 频率的高低:CPU 频率越高,…...
Fedora Linux未来五年规划
Fedora 委员会一直致力于起草战略计划,以帮助 Fedora Linux 更好地发展。近日 Fedora 委员会公布了一份 “《未来五年的 Fedora Linux 》” 战略计划草案,这份草案里面包含了他们的雄心壮志:每周将 Fedora 的活跃贡献者人数增加一倍。 Fedora…...
【C++之容器篇】map和set常见函数接口的使用与剖析
目录前言一、set1. 简介2. 成员类型3. 构造函数(1) set()(2)set(InputIterator first,InputIterator last)(3)使用4. 拷贝构造函数和赋值运算符重载5. empty()6. size()7. insert()(1)pair<iterator,bool> insert(const K& key)(2)iterator insert(iterator pos,cons…...
虚拟DOM是什么
参考文章做的总结,如有不足之处请指正! 在讲虚拟dom之前,先讲讲,为什么前端操作dom会导致页面性能降低? 先说几个概念 有助于后面的理解 什么是 JavaScript 引擎? JavaScript引擎是一个专门处理JavaScript脚…...
进程通信方式
无名管道( pipe ): 管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。高级管道(popen): 将另一个程序当做一个新的进程在当前程序进…...
强化学习基础知识
强化学习是一种机器学习方法,通过agent与environment的互动,学习适当的action policy以取得更大的奖励reward。本篇博客介绍强化学习的基础知识,与两类强化学习模型。 目录强化学习的基础设定policy based 强化学习的目标3个注意事项实际训练…...
LeetCode230218_148、654. 最大二叉树
给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums 构建的 最大二叉树…...
WordPress 是什么?.com 和 .org 的 WordPress 有什么差异?
本篇文章会介绍这次WordPress 5.8核心版本所带来的其中一项新功能:内存块小工具(Widget)此次更新把小工具编辑设定的页面也改成用「内存块编辑」的概念,就跟内置的「古腾堡」编辑器一样,把所有元件都内存块化ÿ…...
java8新特性【2023】
Lambda表达式 新的一套语法规则 是一个匿名函数 Testpublic void test1(){Runnable r1 new Runnable(){Overridepublic void run() {System.out.println("线程A");}};r1.run();System.out.println("");Runnable r2 () -> System.out.println("…...
刷题记录:牛客NC51101Lost Cows
传送门:牛客 题目描述: (2≤N≤8,000) cows have unique brands in the range 1..N. In a spectacular display of poor judgment, they visited the neighborhood watering hole and drank a few too many beers before dinner. When it was time to line up for their ev…...
华为OD机试 - 不等式 | 备考思路,刷题要点,答疑 【新解法】
最近更新的博客 华为OD机试 - 寻找路径 | 备考思路,刷题要点,答疑 【新解法】华为OD机试 - 最小叶子节点 | 备考思路,刷题要点,答疑 【新解法】华为OD机试 - 对称美学 | 备考思路,刷题要点,答疑 【新解法】华为OD机试 - 最近的点 | 备考思路,刷题要点,答疑 【新解法】华…...
GuLi商城-SpringCloud-OpenFeign测试远程调用
1. Feign 简介 Feign 是一个声明式的 HTTP 客户端,它的目的就是让远程调用更加简单。Feign 提供了HTTP请 求的模板,通过编写简单的接口和插入注解,就可以定义好 HTTP 请求的参数、格式、地址等信 息。Feign 整合了 Ribbon(负载…...
阿里云_山东鼎信短信的使用(云市场)
目录山东鼎信API工具类随机验证码工具类进行测试Pom依赖(可以先导入依赖)创建controllerSmsServiceSmsServiceImplswagger测试(也可以使用postman)山东鼎信API工具类 山东鼎信短信官网 找到java的Api,复制下来 适当改了一下,为了调用(类名SmsUtils) p…...
基于虚拟机机的代码保护技术
虚拟机保护技术是基于x86汇编系统的可执行代码转换为字节码指令系统的代码,以达到保护原有指令不被轻易逆向和篡改的目的。 字节码(Byte-code)是一种包含执行程序,由一序列 op 代码/数据对组成的 ,是一种中间码。字节是…...
Win10耳机有声音麦不能说话怎么办?麦克风说话别人听不到解决方法
网上找了一些解决办法,一般都是重复的,几个设置调来调去也就那样,没什么用 这种问题一般是“老式”一点的台式机会出现,提供的解决办法如下: 首先下载带面板的音频管理器,如realtek高清晰音频管理器&…...
The 22nd Japanese Olympiad in Informatics (JOI 2022/2023) Final Round 题解
交题:https://cms.ioi-jp.org/documentation A 给一个序列 a1,⋯,ana_1,\cdots,a_na1,⋯,an。 执行nnn个操作,第iii个操作为找出第iii个数前离其最近且与它相同的数的位置,把这两个数之间的数全部赋值aia_iai。求最后的序列。 考虑第…...
openEuler RISC-V 成功适配 VisionFive 2 单板计算机
近日,RISC-V SIG 成功在 VisionFive 2 开发板上适配欧拉操作系统,目前最新版本的 openEuler RISC-V 22.03 V2 镜像已在 VisionFive 2 开发板上可用,这是 openEuler 推动 RISC-V 生态演进的又一新进展。下载链接https://mirror.iscas.ac.c…...
2005-2022中国企业对外直接投资、OFDI海外投资明细、中国全球投资追踪数据CGIT(含非建筑施工类问题投资)
中国全球投资跟踪”(China Global Investment Tracker),数据库,美国企业研究所于1月28日发布。数据库显示,2005年以来,中国对外投资和建设总额已接近2万亿美元。该数据库是唯一一套涵盖中国全球投资和建设的…...
PCB学习笔记——使用嘉立创在线绘制原理图与PCB
嘉立创软件地址:https://lceda.cn/ 新建工程-新建原理图,在元件库中可以搜索元器件,可以直接放置在原理图上。 原理图绘制完成后,保存文件,设计-原理图转PCB,可以直接生成对应的PCB,设置边框&…...
【C++】类型转化
🌈欢迎来到C专栏~~类型转化 (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort目前状态:大三非科班啃C中🌍博客主页:张小姐的猫~江湖背景快上车🚘,握好方向盘跟我有一起打天下嘞!送给自己的一句鸡汤&…...
Mybatis -- resultMap以及分页
查询为null问题 要解决的问题:属性名和字段名不一致 环境:新建一个项目,将之前的项目拷贝过来 1、查看数据库的字段名 2、Java中的实体类设计 public class User { private int id; //id private String name; //姓名 private String passwo…...
Linux之进程
一.冯诺依曼体系 在计算机中,CPU(中央处理器)是不直接跟外部设备直接进行通信的,因为CPU处理速度太快了,而设备的数据读取和输入有太慢,而是CPU以及外设直接跟存储器(内存)打交道&am…...
结构体——“C”
各位CSDN的uu们你们好呀,今天,小雅兰的内容是结构体噢,之前我们在初始C语言中其实就已经学习过了结构体的知识,但是不是很全面,这次,我们也只是稍微详细一点,敬请期待小雅兰之后的博客ÿ…...
CCNP350-401学习笔记(51-100题)
51、Which statement about a fabric access point is true?A. It is in local mode and must be connected directly to the fabric edge switch. B. It is in local mode and must be connected directly to the fabric border node C. It is in FlexConnect mode and must …...
C语言学习_DAY_4_判断语句if_else和分支语句switch_case【C语言学习笔记】
高质量博主,点个关注不迷路🌸🌸🌸! 目录 1.案例引入 2.if判断语句的语法与注意事项 3.switch多分支语句的语法与注意事项 前言: 书接上回,我们已经学习了所有的数据类型、运算符,并且可以书写…...
实验07 赫夫曼编码及综合2022(带程序填空)
A. 【程序填空】赫夫曼编码题目描述给定n个叶子的权值,根据这些权值构造huffman树,并输出huffman编码参考课本第6.6节的算法6.12,注意算法中数组访问是从位置1开始赫夫曼构建中,默认左孩子权值不大于右孩子权值如果遇到两个孩子权…...
分布式 CAP BASE理论
文章目录CAP简介不是所谓的“3 选 2”CAP 实际应用案例BASE简介BASE 理论的核心思想总结CAP 简介 在理论计算机科学中,CAP 定理(CAP theorem)指出对于一个分布式系统来说,当设计读写操作时,只能同时满足以下三点中的…...
手表特卖网站/石家庄seo代理商
git clone https://github.com.cnpmjs.org/xxx/xxxx.git...
做网站需要会什么条件/北京环球影城每日客流怎么看
1.Project GNU 简介 Project GNU 的起源,来自十年前, Richard Stallman, 目前为 Project GNU 的计划主持人, 在网路讨论区的一篇文章( http://www.cs.pdx.edu/~trent/gnu/begin, 10 years ago on Internet ࿰…...
如何自己做网站发布到服务器上面/河南靠谱seo电话
前边有一篇记录过不使用spring,直接在java代码中连接和操作mongodb数据库,这里就紧随其后记录一下使用spring的情况下,在java中简单操作mongodb。maven导包配置:因为涉及了sping以及springmvc,因此也需要导入它们相关的…...
国外域名注册商网站/查询网站相关网址
题目如下: (1) 将代码写在.asm中,然后打开boxdos即可生成t1.exe. (2) 首先来分析一下,代码完成的功能。 assum cs:codesg codesg segmentmov ax,2000 // ax 2000mov ss,ax // ss 2000 mov sp,0 // sp 0add…...
wordpress 媒体管理/中国seo排行榜
目录 0函数对象 实际应用介绍 函数对象超出了普通函数概念,内部可以保持状态 函数对象作为参数传递 1谓词 一元谓词举例: 二元谓词举例: 2内建函数 0函数对象 重载函数调用操作符的类,其对象常被称为函数对象(…...
文字网站和图片网站哪个难做/站长之家0
6月18日,为期三天的第九届全球云计算大会中国站(Cloud Connect China 2021)在宁波圆满落幕。TcaplusDB作为专注于高性能高可用特性的NoSQL数据库,在本届“云鼎奖”的评选中,与GCloudSDK联合申请,斩获了**“2020-2021年度优秀解决方…...