【C++11】移动赋值 | 新的类功能 | 可变参数模板

文章目录

  • 1. 移动赋值
  • 2. 新的类的功能
    • 移动构造
    • 移动赋值
    • default
    • delete
  • 3.可变参数模板
    • 可变参数包的解析

文章目录

  • 1. 移动赋值
  • 2. 新的类的功能
    • 移动构造
    • 移动赋值
    • default
    • delete
  • 3.可变参数模板
    • 可变参数包的解析

1. 移动赋值

C++11中,string中的operator= 包含 参数为右值的版本


C++98中 没有移动赋值和移动构造 ,只有参数为左值 的赋值重载(operator=)和拷贝构造


本来只有两次深拷贝,但是由于调用拷贝赋值时,内部又进行一次拷贝构造,所以导致最终进行三次深拷贝
这里编译器是不能优化的,因为优化的前提是 连续的构造或者拷贝构造


正常来说,str作为局部变量,应该作为左值,但编译器会对其优化,通过使用move函数,其函数返回值为右值,所以会先发生移动构造
临时对象 本身就是看不见 摸不到的,所以取不到地址,它也是右值
所以又会发生 移动赋值


移动赋值,实际上也是进行资源的转移


如:将临时对象所指向的数据 转移到s1 中,同时可将废弃数据放入临时对象(将亡值)中

2. 新的类的功能

C++11中新增 了 移动构造函数和 移动赋值运算符重载

移动构造

若没有实现移动构造,并且没有实现析构函数、拷贝构造、拷贝赋值重载中的任意一个
(若实现了其中任意一个,则说明是深拷贝的类,如何转移应该自己说了算)
编译器就会自动生成一个默认移动构造


默认生成的移动构造,
对于内置类型成员,会执行浅拷贝(按字节拷贝)
对于自定义类型成员,则看这个成员是否实现移动构造,
若实现了就调用移动构造,若没有实现就调用拷贝构造


person类中,既没有实现移动构造 ,也没有实现析构函数、拷贝构造、拷贝赋值重载
所以该类会自动生成一个默认的移动构造

对于内置类型成员 _age,拷贝构造与 移动构造 都是完成浅拷贝


对于自定义类型成员 _name,因为在yzq命名空间的string类中存在 移动构造,所以调用 其移动构造


在这里插入图片描述

刚调试执行到s1时,s3实际上空间为空
当调试执行到s3时,对于内置类型成员_age 进行浅拷贝 ,所以s3._age 也被置为19
对于 自定义类型 成员 _name,因为string类中存在 移动构造,所以调用移动构造(资源转移)
所以 s1._name 空间被置空,s3._name 指向原s1._name的空间的地址


移动赋值

移动赋值与上述的移动构造类似

若没有实现移动赋值,并且没有实现析构函数、拷贝构造、拷贝赋值重载中的任意一个
(若实现了其中任意一个,则说明是深拷贝的类,如何转移应该自己说了算)
编译器就会自动生成一个默认移动赋值

默认生成的移动赋值,
对于内置类型成员,会执行浅拷贝(按字节拷贝)
对于自定义类型成员,则看这个成员是否实现移动赋值,
若实现了就调用移动赋值,若没有实现就调用拷贝赋值

在这里插入图片描述

刚开始时,s4实际上空间为空
调试到移动赋值时,对于内置类型成员_age 进行浅拷贝 ,所以s4._age 也被置为19
对于 自定义类型 成员 _name,因为string类中存在 移动赋值,所以调用移动赋值(资源转移)
所以 s1._name 空间被置空,s4._name 指向原s1._name的空间的地址


default

强制生成默认函数的关键字 -default

由于显示写析构,使其无法生成默认的移动赋值,影响自定义类型成员 _name 移动赋值变成深拷贝


通过 default 强制生成默认移动赋值,即使有显示的析构函数存在,也不影响 自定义类型成员 _name 的移动赋值


delete

禁止生成默认函数的关键字 delete

istream在C++11中,不期望被拷贝,(拷贝会涉及缓冲区等问题)


默认成员函数,如果不写会默认生成,加入delete后可禁止生成

3.可变参数模板

可变参数模板 :可以接受可变参数的函数模板和类模板

声明一个参数包Args…args,这个参数包中包含0到任意个模板参数


参数是不限制类型和个数的


可变参数包的解析

通过增加一个模板参数,让编译器去解析参数包的东西
应用递归推导思维


主函数中的test是无参的,所以调用无参的test函数


当有一个参数a是,将a传给test作为第一个参数val,而test的第二个参数作为参数包就没有了
(参数包可以包含0个参数)
在带有形参的test函数中调用无参的test函数,进行换行


当有两个参数a和b时,将a传给test作为第一个参数val,将b传给test作为第二个参数 参数包
当test函数内部再次调用 test时,由于 参数包中的参数不为0,所以再次调用 带参的test

将b传给新的test作为第一个参数val , 新的test的第二个参数 参数包为0
当test函数内部再次调用 test时,由于参数包参数为0,所以去调用 无参的test ,进行换行

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI产业应用再提速,AI基础软件发挥巨擎作用

5月31日,由中国信息通信研究院、中国人工智能产业发展联盟主办,北京九章云极科技有限公司联合主办的【创造智能探索未知】杭州通用人工智能论坛-AI基础软件前沿技术分论坛在杭州成功举办。大会聚焦AI基础软件前沿技术,挖掘人工智能基础软件大…

IP地址定位原理

IP地址定位是一种通过IP地址来确定位置的技术,在互联网和移动网络的应用十分广泛。本文将介绍IP地址定位的原理和实现方式。 IP地址定位原理 IP地址是Internet Protocol(简称IP)的缩写,是互联网上的一个地址标识符用于识别连接到…

头文件header file和源文件 source file

头文件 header file,后缀是.h,头文件负责类的定义,函数声明,常量的定义 源文件source file,后缀是.cpp, 函数的实现 最主要的作用就是将函数的声明和实现分开,如果想将类和函数交给别人使用&a…

总结894

学习目标: 月目标:6月(线性代数强化9讲遍,背诵15篇短文,考研核心词过三遍) 周目标:线性代数强化3讲,英语背3篇文章并回诵,检测 每日必复习(5分钟&#xff0…

天然气网络潮流计算模型研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

网络安全零基础之从原理看懂的XSS

01、XSS 的原理和分类 跨站脚本攻击 XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆 故将跨站脚本攻击缩写为 XSS,恶意攻击者往 Web 页面里插入恶意 Script 代码,当用户浏览该页面时&…

软件开发模型

一、 概述   软件开发模型(Software Development Model)是指软件开发全部过程、活动和任务的结构框架。软件开发包括需求、设计、编码、测试和维护 阶段。   软件开发模型能清晰、直观地表达软件开发全过程,明确规定了要完成的主要活动和任务,用来作…

【状态估计】基于线性卡尔曼滤波器和粒子滤波器无人机估计地形高度(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【数据可视化】Plotly Express绘图库使用

Plotly Express是一个基于Plotly库的高级Python可视化库。它旨在使绘图变得简单且直观,无需繁琐的设置和配置。通过使用Plotly Express,您可以使用少量的代码创建具有丰富交互性和专业外观的各种图表。以下是Plotly Express的一些主要特点和优势&#xf…

2020310

Selenium: 基于WebDriver协议的 Web应用程序测试的工具 精简版: selenium脚本通过http请求发送命令和参数给httpserver httpserver通过json wire protocol格式转发命令和参数给webdriver webdriver通过原生API或者JavaScript代码执行操作给浏览器 浏览器通过json wi…

什么是AI业务流程质检,如何用它做好销售和服务过程监督

近几年,随着语音转写、语义理解和机器学习等技术的成熟,越来越多的企业开始部署基于AI技术的智能质检系统,来帮助坐席、销售和服务团队提高沟通质量管理能力,同时提升沟通中的客户体验。 不过,不论是最初的人工质检&a…

object类型(equals、hashCode、getClass、getName)

equals方法的改写 Override//重写equals方法,重写方法后对比的属性值(没有重写前对比的是属性值)public boolean equals(Object obj) {Students s (Students) obj;return this.name.equals(s.name) && this.age s.age;}public clas…

2000-2019年280多个地级市就业人数数据(全市)/城市就业数据

2000-2019年280多个地级市就业人数数据(全市) 1、时间范围:2000-2019年 2、范围:包括280多个地级市 3、来源:城市NJ 4、统计口径:全市 5、单位:万人 6、缺失情况:与城市年鉴缺失情况…

Mysql中联合索引的最左匹配

联合索引 通过将多个字段组合成一个索引,该索引就被称为联合索引。 比如,将商品表中的 product_no 和 name 字段组合成联合索引(product_no, name),创建联合索引的方式如下: CREATE INDEX index_product_no_name ON product(pr…

剑指 Offer 09: 用两个栈实现队列

简单明了,带你直接看懂题目和例子。 输入: ["CQueue","appendTail","deleteHead","deleteHead"] 这里是要执行的方法,从左到右执行 [[],[3],[],[]]对应上面的方法,是上面方法的参数。CQ…

docker资源控制cgroup

一、CPU控制 cgroups,是一个非常强大的linux内核工具,他不仅可以限制被namespace隔离起来的资源, 还可以为资源设置权重、计算使用量、操控进程启停等等。所以cgroups (Control groups) 实现了对资源的配额和度量。 cgroups有四大功能: 资源限制:可以…

前后端交互三、Ajax加强

零、文章目录 前后端交互三、Ajax加强 1、XMLHttpRequest的基本使用 (1)什么XMLHttpRequest XMLHttpRequest(简称 xhr)是浏览器提供的 Javascript 对象,通过它,可以请求服务器上的数据资源。jQuery 中的…

企业电子招标采购系统源码java 版本 Spring Cloud + Spring Boot

项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及…

JVM原理:JVM垃圾回收算法(通俗易懂)

目录 前言正文垃圾标记算法引用类型强引用软引用弱引用虚引用 引用计数法循环引用问题 根可达性分析法虚拟机栈(栈帧的局部变量表)中的引用方法区中类静态属性引用方法区中常量引用本地方法栈(Native方法)引用 垃圾回收算法标记清…

InstructGPT:Training language models to follow instructions with human feedback

Training language models to follow instructions with human feedback 通过人类反馈的微调,在广泛的任务中使语言模型与用户的意图保持一致 aligning language models with user intent on a wide range of tasks by fine-tuning with human feedback 实验动机 …