Cxx primer-chap13-Copy Control

news2024/9/21 4:31:59
  1. copy控制涉及类的五个成员函数:在这里插入图片描述,这五个成员函数被显式或隐式的被调用,各司其职:在这里插入图片描述
  2. 我们必须根据类的实际情况来确定是否需要显式定义这些成员函数:在这里插入图片描述
  3. 什么是拷贝构造函数呢?简单讲就是该函数的第一个形参是reference to const的类类型,如果有其他形参的话,必须有默认实参:在这里插入图片描述,至于为什么第一个形参是reference to const有两点原因:reference是杜绝递归调用,const是希望防止修改被拷贝的对象以及接收const对象。
  4. 拷贝构造函数发生的地方有很多,例如形参初始化、非引用的返回类型等等,所以我们也没有显式的使用explicit,值得注意,拷贝初始化不一定就是调用copy constructor。也有可能调用move constructor:在这里插入图片描述
  5. 拷贝构造函数被用于初始化非引用类型的形参解释了为什么拷贝构造函数本身需要第一个参数为引用类型的对象:在这里插入图片描述
  6. 编译器可能会优化copy/move constructor:在这里插入图片描述,我们可以使用g++的选项来禁用优化,注意C++版本建议为11:g++ -fno-elide-constructors -std=c++11 -Wall -o main main.cc
  7. 什么是overload operators?简单讲,它是一个名为operator?,同时形参为操作数的函数:在这里插入图片描述
  8. 编译器也会自动生成一个合成的拷贝赋值操作符:在这里插入图片描述
  9. 析构函数做了构造函数相反的事情,释放资源:在这里插入图片描述,因为它没有形参,所以它不可以被重载。具体而言,它也想构造函数分成两个部分:function bodydestruction部分:在这里插入图片描述
  10. 析构函数就是做了构造函数相反的事情,就是类的设计者希望在最后一次使用对象后进行的
    一系列善后操作。析构函数有两部分组成:函数体 + 隐式析构成员阶段。当我们没有显式定义析构时,编译器就会为我们定义合成的析构函数。除了我们手动申请的动态内存需要我们手动释放外,其他对象的析构函数是被自动调用的 :在这里插入图片描述,具体而言:在这里插入图片描述
  11. 一个经验法则是,如果你需要显式定义析构函数的话,那么也可能需要显式定义copy constructor/assignment在这里插入图片描述,否则可能会使得类内的成员指针指向同一个动态分配的对象。后果就是充满bug!
  12. 如果需要copy constructor,那么也极有可能需要copy assignment:在这里插入图片描述。但是我们可能不需要显式的析构函数,不过这种需求较为奇葩:在这里插入图片描述
  13. 我们可以显式要求编译器为我们生成合成的控制成员函数:在这里插入图片描述
  14. 对于不支持拷贝的类而言(stream),我们应该禁用copy constructor/assignment。在新标准前,我们需要显式声明无定义+private以防止编译器自动生成。新标准支持我们用简便的方式做到这一点= delete:在这里插入图片描述,但是析构函数不应该被删除:在这里插入图片描述,否则就无法定义该类的对象。
  15. 拷贝控制成员可能被编译器合成为=delete:在这里插入图片描述,宗旨就是为了自圆其说,安全。
  16. 类的copy operations决定该类像value还是pointer,当然如果你禁止copy,那就都不是:在这里插入图片描述
  17. XX- assignment = destructor(释放左操作数已有的空间) + XX-constructor(拷贝右操作数),我们需要合理的顺序保证正确进行,尤其是self- assignment:在这里插入图片描述
  18. 像pointer那样共享潜在的数据时,没有我们想的简单。我们需要像计数指针一样保证对象安全:在这里插入图片描述,所以计数器就很有必要:在这里插入图片描述,但是我们不能简单地将它作为类成员,而是将其作为类外的动态内存对象:在这里插入图片描述
  19. 我们为类自定义swap函数时,就可以让库中的算法调用该函数,而不是库版本的swap,它开销更大一些:在这里插入图片描述,对于库版本swap的可能实现:在这里插入图片描述
  20. swap函数用于assignment的swap-and-copy技术:在这里插入图片描述
  21. 如果能避免copy,那么尽量使用move:在这里插入图片描述,目前来看,move constructor在合适条件下(右值引用),会被自动地调用。如果我们想要强制手动调用,可以使用std::move(),move操作保证所有权转移后,原来的对象处于可以被销毁的安全状态(也是为什么move constructor/assignment不是const形参的原因):在这里插入图片描述,看例子:在这里插入图片描述,以及实际性能:在这里插入图片描述
  22. 首先有很多环境下会发生copy,但这些里面有一些环境中copy没有性价比,例如copy后,原来的对象会被立即释放掉,此外有一些对象无法copy,例如stream、unique_ptr等。新标准下,我们鼓励move以加快速度:在这里插入图片描述
  23. 为了配合move,新标准引入右值引用类型。它是一个必须被绑定到右值的引用类型,换句话说就是只能被绑定到即将被摧毁的对象上。从而方便我们将其资源move到其他对象:在这里插入图片描述,左值是持久的对象本身,而右值是临时的昙花一现:在这里插入图片描述,这里注意lvalue reference to constrvalue reference在这里插入图片描述
  24. 左值/右值都是表达式的属性罢了,因为一个变量是一个只有操作数没有操作符的表达式,所以它也有左值/右值的属性,不巧的是,Variable expressions are lvalues.:在这里插入图片描述,材料建议联系变量是持久,而右值是短暂的进行理解。
  25. 我们可以使用std::move()操作将某个左值对象转换成右值:在这里插入图片描述,注意,被move对象的value可能会发生变化。此外我们使用std::move()是为了防止命名冲突。
  26. 为了让自定义的类受益于move而非copy,我们需要定义move constructormove assignment在这里插入图片描述,里面的noexpect关键字是显式声明该函数不会抛出异常,从而减少系统对异常的检查:在这里插入图片描述,以让系统放心使用:在这里插入图片描述
  27. 注意move是新标准推出代替copy出现的某些场景的,例如copy即将被摧毁的对象的场景下,我们希望编译器能使用move避免copy,所以move操作并不总是被自动生成,它是稀罕物:在这里插入图片描述
  28. 如果一个类同时有copy和move版本,我们根据普通的函数匹配来确定调用:在这里插入图片描述,通常精确匹配优先,如果没有move版本,那么就会强制转换rvalue以调用copy版本:在这里插入图片描述
  29. 如果一个类有copy和move的构造函数,同时用swap-and-copy实现的赋值运算符的话,那么该运算符会起到copy和move assignment的效果,但是它们和分开定义有有很大的性能差别:在这里插入图片描述
  30. 五个copy control成员看成一个单元,如果你需要显式的析构,那么大概率需要copy constructor/assignment,最后move constructor/assignment是锦上添花:在这里插入图片描述
  31. 少在用户代码使用move:在这里插入图片描述
  32. 其他的成员函数也可以就move和copy进行函数重载:在这里插入图片描述,例如:在这里插入图片描述
  33. 我们可以使用引用限定符来限定左操作数是左值:在这里插入图片描述在这里插入图片描述,对于引用限定,要不全有,要么全无,不能造成歧义:在这里插入图片描述

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

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

相关文章

malloc函数与free函数

目录 开头1.怎样把数组初始化时的项数变成变量?malloc函数free函数 2.malloc函数与free函数的实际运用CC6 牛牛的排序随机乱码打印随机数组打印 结尾 开头 大家好,我叫这是我58。今天,我们来学一下如何把数组初始化时的项数变成变量的一些知识。 1.怎…

【书生大模型实战营第三期 | 入门岛第3关-Git 基础知识】

学习Git版本控制系统心得体会 摘要 通过参与InternLM Git教程,我对Git这一开源的分布式版本控制系统有了更深入的理解和实践。Git以其高效的团队协作能力、详尽的代码历史记录以及灵活的分支管理功能,成为软件开发中不可或缺的工具。 文章大纲 Git简介…

自查出癌症后 凯特王妃的生活观发生了变化 王室的粉丝们也应该会很少见到她

凯特米德尔顿今年的健康问题令人意外,这也改变了王室的面貌。这位威尔士王妃每次露面都引来巨大关注,因此王室不得不发挥创意,将更多精力放在威廉王子、索菲、爱丁堡公爵夫人,甚至查理三世国王的社交日程上。王室粉丝们可能期待着凯特恢复健康,恢复正常日程,但内部人士称…

unity 粒子系统学习

差不多了解了基本的ui面板,学一下粒子系统 取消轮廓线 这样粒子biubiu的时候就没有橙黄色的轮廓线了

lvs的dr模式实现

目录 一、实验环境准备 1、五台红帽9系统的主机 2、关闭所有的防火墙以及关闭selinux 二、在lvs中配置 1、在lvs中安装lvs软件并设置开机启动 2、在lvs中打开内核路由功能,并把它写入/etc/sysctl.conf文件中 3、webserver1和webserver2下载httpd 4、在lvs主机…

【Redis进阶】Redis单线程模型和多线程模型

目录 单线程 为什么Redis是单线程 处文件事件理器的结构 文件处理器的工作流程 总结 文件事件处理器 连接应答处理器 命令请求处理器 命令回复处理器 多线程 为什么引入多线程 多线程架构 多线程执行流程 关于Redis的问题 Redis为什么采用单线程模型 Redis为什…

【STM32】USART串口和I2C通信

个人主页~ USART串口和I2C通信 USART串口一、串口1、简介2、电路要求3、参数及时序 二、USART外设1、USART结构2、波特率发生器 三、数据包1、HEX数据包HEX数据包接收 2、文本数据包文本数据包接收 I2C通信一、简介二、通信协议1、硬件电路2、I2C时序基本单元 三、I2C外设1、简…

Chapter 29 类型注解

欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能! 文章目录 前言一、变量的类型注解二、函数的类型注解三、Union类型注解 前言 类型注解为我们提供了一种清晰的方式来描述变量和函数的预期类型,使得代码的意图更加明确。…

GMMREG:基于高斯混合模型的鲁棒点集配准

其关键思想都是用连续密度函数表示离散点集,即高斯混合模型。不同点在于本节算法采用L2距离来衡量两个点云之间的相似性,而5.7节中的NDT算法采用的是作者定义的匹配势来衡量,实际上是所有线段对之间的差异。并且本节算法中加入了薄板样条插值…

打造分布式缓存组件【场景】

本文将采用AOP 反射 Redis自定义缓存标签,重构缓存代码,打造基础架构分布式缓存组件 配置 需要在Redis配置类中开启AOP自动代理,即通过EnableAspectJAutoProxy 注解实现该功能 import com.fasterxml.jackson.annotation.JsonAutoDetect; …

「链表」链表原地算法合集:原地翻转|原地删除|原地取中|原地查重 / LeetCode 206|237|2095|287(C++)

概述 对于一张单向链表,我们总是使用双指针实现一些算法逻辑,这旨在用常量级别空间复杂度和线性时间复杂度来解决一些问题。 所谓原地算法,是指不使用额外空间的算法。 现在,我们利用双指针实现以下四种行为。 //Definition fo…

Linux驱动.之I2C,iic驱动层(二)

一、 Linux下IIC驱动架构 本篇只分析,一个整体框架。 1、首先说说,单片机,的i2c硬件接口图,一个i2c接口,通过sda和scl总线,外接了多个设备device,通过单片机,来控制i2c的信号发生&…

VUE和Element Plus

1.VUE 1.下载和配置环境 使用vue编程,我们需要使用到的编程软件是vs code,还需要使用node.js,这个的作用就类似于JDK,当我们都下载好之后,winR键打开命令提示符,我们在这里可以查看版本, npm…

《计算机网络 - 自顶向下方法》阅读笔记

《计算机网络 - 自顶向下方法》阅读笔记 应用层、运输层、网络层、数据链路层 计算机网络和因特网: 因特网: ​ 是一个世界范围的计算机网络,互联了全世界的计算机设备 计算机设备:手机,电脑,游戏机&#…

MATLAB数据可视化:在地图上画京沪线的城市连线

matlab自带的geoplot(lat,lon) 可以在地理坐标中绘制线条。使用 lat和lon分别指定以度为单位的经度和纬度坐标。 绘制京沪线所经城市线条: citys [116.350009,39.853928; 116.683546,39.538304; 117.201509,39.085318; 116.838715,38.304676;...116.359244,37.436…

Java网络编程——HTTP协议原理

协议 我们在网上冲浪时,会在浏览器地址栏输入一个网址,然后就能打开网页了。比如,输入 https://www.douban.com/就可以访问到豆瓣的主页: 那么大家是否好奇:https 是什么意思,作用又是什么呢?…

语言模型简介和Ngram模型(1)

语言模型介绍一 语言模型语言模型概念语言模型应用-语音识别声纹特征提取语言模型挑选成句 语言模型应用-手写识别语言模型应用-输入法语言模型分类语言模型评价指标-困惑度PPL N-gram语言模型马尔科夫假设平滑问题平滑问题解决一平滑问题解决二 插值优化语言模型应用-文本纠错…

unity 创建项目报错feature has expired (H0041),sentinel key not found (H0007)

两个报错同一种处理方式。 1、删除以下路径所有文件:C:\ProgramData\SafeNet Sentinel(注意:ProgramData为隐藏文件) 2、打开Cmd(WinR键,输入cmd回车),进入Unity安装所在盘符&#…

SecureCRT记录会话日志

在使用SecureCRT软件的时候,有个非常实用的功能:记录会话日志,就是可以把当前会话的所有记录保存成文本文件。下面简单介绍一下如何使用这个功能。 首先点击SecureCRT软件左上角的文件 然后点击会话日志即可 然后选择一个路径保存日志&#…

物流仓库安全视频智能管理方案:构建全方位、高效能的防护体系

一、背景分析 随着物流行业的快速发展和仓储需求的日益增长,仓库安全成为企业运营中不可忽视的重要环节。传统的人工监控方式不仅效率低下,且难以做到全天候、无死角覆盖,给仓库资产和人员安全带来潜在风险。因此,引入仓库安全视…