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

news2024/9/28 5:29:19

文章目录

  • 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 ,进行换行

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

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

相关文章

phpstorm+xdebug/php项目调试

前提:项目使用xampp集成 一、下载xdebug,当到xampp/php/exp目录下 二、配置php.ini [Xdebug] zend_extension"D:/xampp/php/ext/php_xdebug.dll" xdebug.collect_paramsOn xdebug.collect_returnOn xdebug.auto_traceOn xdebug.trace_output_…

asp.net探头监控管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net探头监控管理系统 是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使用c#语言 开发 asp.net探头监控管理系统VS开发s…

BUUCTF 大帝的密码武器 1

题目描述:(下载题目,然后修改后缀名为.zip打开:) 公元前一百年,在罗马出生了一位对世界影响巨大的人物,他生前是罗马三巨头之一。他率先使用了一种简单的加密函,因此这种加密方法以…

pyecharts案例一——生成美日印三国疫情确诊人数折线图

数据获取 首先从美国的疫情数据的json字符串中获取出我们需要的日期和确诊数量数据 ,可以使用json格式化工具里面的试图查看嵌套结构,从而获取我们期望的数据。 再强调{} 是字典,[]是列表 完整代码 import json from pyecharts.charts i…

什么电脑配置玩暗黑破坏神4比较好?驱动人生游戏配置推荐

《暗黑破坏神4》已经在PC、PS4、PS5、Xbox One和Xbox Series X/S平台上发行一段时间了,不少驱动人生的小伙伴已经体验到了《暗黑破坏神4》,游戏的画面效果非常精美,但也对电脑配置有一定的要求。如果想要流畅地玩这款游戏,不仅要有…

劝学:Android 14 Framework 引入了哪些“新”技术栈

作者:Mr_万能胶 2023 年 Google I/O 已于 2023 年 5 月 10 日 拉开帷幕,Android 14 Beta 版本近期也已经 释放到 Google partners,本文主要分析 Google 在 Android 14 框架代码中引入了哪些新的技术栈,而对于新功能和 API Change&…

软件工程全周期全过程20项文档模板,附下载。从《合同》到《需求规格说明书》到软件设计、开发、实施、验收、维护等全过程相关文档模板

软技工程全生命周期图 计算机软件研制产品的实现过程一般分为七个阶段: (一)──软件系统要求分析阶段,包括软件研制要求的确定、签订合同、软件设计和开发的策划; (二)──软件需求分析阶段&…

cleanrl

tensorboard gym RecordEpisodeStatistics RecordVideo

C#曲线绘制1-自定义封装曲线

目录 0、简要说明 1、GraphEdit.cs类封装 2、效果1 (1)创建窗体程序 (2)检测鼠标是否在数据点上 3、效果2 (1)创建窗体程序 4、工程下载连接 0、简要说明 C#绘制曲线自定义类封装 1、封装绘制曲线类…

Android架构灵魂组件Lifecycle的生命周期机制详解

前言:写作就跟生活一样,是一趟发现之旅。 前言 在早期 Andorid 架构中,生命周期的事件监听和状态查询,我们需要自定义一套提供侦测功能的 Activity/Fragment 基类及回调接口,在 Activity/Fragment 的生命周期方法中实…

618必买清单,几款实用的数码好物分享

只剩一周的618,各大电商平台都在为我们献上一场豪华盛宴!小伙伴们,你们的购物车已经快满了吗?楼主翻了翻自己的账单,发现很多商品的活动力度都非常给力,简直就是给我们的钱包来了一次“减负”操作。今天&am…

记录基于Vue.js的移动端Tree树形组件

目录 一、Liquor Tree 入门 : Development Component Options 组件选项 Structure 结构 二、vue-treeselect Introduction 介绍 Getting Started 入门 Vue 树形选择器( Vue tree select )组件在搭建 Vue 的 app 中特别常用&#xff0…

算法提高-图论- 负环

负环 负环AcWing 904. 虫洞AcWing 361. 观光奶牛AcWing 1165. 单词环 负环 本博客主要介绍spfa求负环 一般用第二种方法 第一种方法如果每个点入队n次,每次入队也要遍历n次,那么时间复杂度就是n2 第二种方法时间复杂度是n,只要发现最短路边数…

城市道路路面病害检测识别分析,以RDD赛事捷克-印度-日本集成融合数据集为例,基于yolov5m模型开发构建城市道路病害检测识别系统

城市道路病害检测是最近比较热门的一个任务领域,核心就是迁移深度学习目前已有的研究成果来实现实时城市道路路面病害的检测识别分析,在我之前的很多博文中都有做过类似桥梁、大坝、基建、隧道等水泥设施裂缝裂痕等目标检测相关的项目,除此之…

SQL Server 2008 定时自动备份和自动删除方法

SQL Server 2008 数据定时自动备份和自动删除方法,同一个计划兼备数据备份数数据删除的操作方法 工具/原料 SQL Server 2008 方法/步骤 1、 点击实例名下的【管理】-【维护计划】-点击鼠标右键,点击【维护计划向导】,填写计划名称&…

崛起的中国卫浴:市场与创新双驱动

5月28日,国产大飞机C919完美完成了商业航班首飞。从中国制造到中国创造,C919的成功是无数中国企业、中国品牌的缩影。 改革开放至今的短短四十年间,中国经历了“以市场换技术-模仿式创新-源创新”三个阶段,上世纪90年代&#xff…

【IMX6ULL驱动开发学习】07.注册驱动设备_分配固定的次设备号_cdev

一、register_chrdev 在之前的hello驱动中,注册驱动设备的方式如下 /*初始化设备方法1:自动分配设备号,占用所有次设备号*/ major register_chrdev(0,"hello_drv",&hello_fops);使用 register_chrdev 分配设备号的方式比较…

【JAVA开发环境配置】 我也可以让JDK版本来去自由的切换了! 哈哈哈哈 舒服!

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享博主 🐋 希望大家多多支持一下, 我们一起进步!😄 🏅 如果文章对你有帮助的话,欢迎评论 💬点赞&#x1…

单页面控制中心 vue-router

一、 路由的基本配置 1. 在router->index.js中,配置一个懒路由,定义页面加载哪个组件 import Vue from vue import VueRouter from vue-routerVue.use(VueRouter)const routes []// 配置一个懒路由,不然会加载页面下所有组件 const router new Vu…

基于微信小程序的失物招领系统设计与实现

博主介绍:✌擅长Java、微信小程序、Python、Android等,专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟 Java项目精品实战案…