C++中拷贝构造和赋值重载的注意事项以及编译器的优化处理
C++中拷贝构造和赋值重载的注意事项以及编译器的优化处理
- 前言
- 1. 拷贝构造和赋值重载的易混淆点和注意事项
- 1.1 易混淆点
- 1.2 注意事项
- 2.编译器对拷贝构造和赋值重载的优化处理
前言
本文可以帮助你对下面:
(1)何时调用拷贝构造何时调用赋值重载
(2)在拷贝构造函数和赋值重载函数的参数加const的意义
(3)自定义类型的隐式类型转换
(4)编译器对自定义类型隐式类型转换的优化
(5)自定义类型引用常量的意义
方面有更加深刻的理解
1. 拷贝构造和赋值重载的易混淆点和注意事项
1.1 易混淆点
上图代码中的Date d2(d1);
这句话大家可以很快就判断出是拷贝构造。
上图代码中的Date d3 = d1 + 15;
是拷贝构造,Date d2 = d1 + 10;
是赋值重载
原因如下:
(1)由于d3
是为初始化的Date对象并用d1+15来初始化,即使使用等号来初始化,编译器还是会识别它为拷贝构造,相当于把Date d3 = d1 + 15;
转化为Date d3(d1);
因此是拷贝构造。
(2)然而d2
是已经存在的对象,并用d1+10来赋值因此是赋值重载。
1.2 注意事项
拷贝构造和赋值重载函数的参数,最好加const,否则以上面的例子为例,可能会出错:
以代码Date d3 = d1 + 15;
为例:
如上图首先先调用运算符重载operator+
,由于ret
是operator+
里的局部变量,出了作用域就会自动删除,因此会先将ret拷贝到临时对象后才返回值(调用了拷贝构造),而临时对象为右值,具有常性(相当于用const修饰),这个临时对象又作为拷贝构造函数的参数,由于参数的类型是const Date
,而拷贝构造函数需要接收Date&
类型的参数,存在引用的权限放大的问题,因此编译器会报错!
同理,Date d2 = d1 + 10;
也会报错。
所以我们习惯在拷贝构造和赋值重载函数的参数中为其添加const进行修饰,有两个好处:
(1)防止误写入
(2)避免权限放大问题
2.编译器对拷贝构造和赋值重载的优化处理
观察上面的两句话,第一句Date d1(2022);
是大家熟知的构造函数
让人疑惑的是第二句Date d2(2022);
中的Date类型的d2为什么能用int类型的2022来赋值呢?
其实这里是隐式类型的转化,在类的构造函数没有被explicit
修饰的时候,编译器允许这种转化。
也就是把2022这个整形变量隐式转化为Date类型的变量。隐式类型转化的步骤如下:
(1)传一个参数调用构造函数来初始化一个const Date
类型的临时对象
(2)调用Date的拷贝构造函数,将临时对象作为拷贝构造函数的参数,从而初始化d2.
也就是说,Date d2 = 2022;
这个语句会先调用一次构造函数,再调用一次拷贝构造函数,但是大胆点的编译器(如VS2019)会对其步骤进行优化,对其进行合二为一。
也就是直接将2022作为d2的构造函数的参数对d2进行初始化。
值得一提的是,在对int类型的常量2022进行引用操作的时候,编译器就会老老实实按照创建临时对象并调用其构造函数进行初始化,类型为const Date
。再对其进行引用。
因此Date& d2 = 2022;
的写法是错误的,存在权限放大
正确的写法是const Date& = 2022;
实际意义可以体现在String类:
下图中的Func("hello");
这句话就是用"hello"初始化了一个const String
类的对象,因此用string来引用的时候会报错,要想用"hello"来调用Func函数的话,就必须加上const。
加上const前,编译器报错:
加上const后,可以正常调用:
相关文章:
C++中拷贝构造和赋值重载的注意事项以及编译器的优化处理
C中拷贝构造和赋值重载的注意事项以及编译器的优化处理前言1. 拷贝构造和赋值重载的易混淆点和注意事项1.1 易混淆点1.2 注意事项2.编译器对拷贝构造和赋值重载的优化处理前言 本文可以帮助你对下面: (1)何时调用拷贝构造何时调用赋值重载 &a…...
Java设计模式_单例模式
Java设计模式_单例模式 亦称: 单件模式、Singleton 意图 单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a…...
刚刚学完CSS :display float,flex flow 傻傻分不清了
目录 描述 示例: CSS 中的 display CSS 中的 float CSS 中的 flex 描述 刚刚学完CSS ,导致浮动(float),弹性布局(display:flex)好几个字段配置属性已经分不清了。 display float 就同层级别…...
python建立图片索引数据库,根据一段文字,找到存放在电脑上最匹配的图片
python建立图片索引数据库,根据一段文字,找到存放在电脑上最匹配的图片 作者:虚坏叔叔 博客:https://xuhss.com 早餐店不会开到晚上,想吃的人早就来了!😄 一、程序的用处 一键视频 可以根据一…...
MySQL OCP888题解048-letter N in slow query log(慢查询日志里的字母N)
文章目录1、原题1.1、英文原题1.2、中文翻译1.3、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3.1、知识点1:mysqldumpslow - 总结缓慢的查询日志文件4、实验4.1、实验14.1.1、实验目的4.1.2、实验前准备4.1.3、实验步骤4.1.4、实验结论5、总结1、原题 1.1…...
数据采集 - 笔记 2
1快速实现西门子S7系列PLC数据采集 快速实现西门子S7系列PLC数据采集 - 知乎 2 什么是时序数据库? 时序数据库(Time Series Database)是一种特殊类型的数据库,用于存储和处理时间序列数据。时间序列数据是指按时间顺序排列的数…...
电子技术——数字IC技术,逻辑电路和设计方法
电子技术——数字IC技术,逻辑电路和设计方法 在我们之前的学习中,我们学习了CMOS技术,然而CMOS技术并不是唯一的数字逻辑技术,因此,本节系统的介绍当今使用的数字技术和逻辑电路族。 数字IC技术和逻辑电路族 逻辑电…...
[ROS2 知识] 包依赖关系和rosdep详述
一、说明 如果你建立一个工作空间,试图将所有包的依赖项搞明白,或者期望将包的依赖项全部安装到工作空间中,您看本文是正确选择。本文将解释如何使用 rosdep 管理外部依赖项。 二、介绍rosdep 2.1 rosdep是何物? rosdep 是 ROS 的依赖管理实用程序,可以与 ROS 包和外部库…...
mysql创建索引导致死锁,数据库崩溃,完美解决方案
文章目录写在前面一、短事务场景下,执行DDL语句场景分析1、短事务场景下,执行表字段添加操作2、短事务场景下,执行表字段修改操作3、短事务场景下,执行表字段删除操作(1)往里添加一条数据试试4、短事务场景…...
c++11 标准模板(STL)(std::unordered_map)(八)
定义于头文件 <unordered_map> template< class Key, class T, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator< std::pair<const Key, T> > > class unordered…...
企业ISO体系认证办理,可以自行申请吗?为什么都要找咨询公司?
企业ISO体系认证办理,可以自行申请吗?为什么都要找咨询公司? 很多人认为ISO咨询公司为中介机构,希望直接找认证公司进行认证。其实认证机构担任的是认证审核职责,咨询机构担任的是咨询职责。按中国国家任可监委员会的…...
二、Neo4j源码研究系列 - 单步调试
二、Neo4j源码研究系列 - 单步调试 一、背景介绍 上一篇我们已经把了neo4j的源码准备以及打包流程完成了,本篇将讲解如何对neo4j进行单步调试。对于不了解如何编译打包neo4j的读者,请阅读《一、Neo4j源码研究系列 - 源代码准备》。 大纲: …...
基于Qt WebEngine 的Web仪器面板GUI程控技术
随着IIoT的发展,很多工业仪器也具备了远程管理的GUI。与早期使用串口进行命令交互不同,这些GUI可以直接在远程呈现数据。 作为希望对仪器、软件进行二次开发的小公司来说,会遇到GUI人工操作转自动化的需求。在无法通过串口等传统接口进行自动…...
海康摄像头使用RTSP
1.协议格式。海康威视IP摄像头rtsp协议地址如下:rtsp://[username]:[passwd][ip]:[port]/[codec]/[channel]/[subtype]/av_stream主码流:rtsp://admin:12345192.168.1.64:554/h264/ch1/main/av_streamrtsp://admin:12345192.168.1.64:554/MPEG-4/ch1/mai…...
编程语言分类
目录 ❤ 机器语言 机器语言的编程 ❤ 汇编语言 ❤ 高级语言(编程语言) 编译型 解释型 ❤ 动态语言和静态语言 ❤ 强类型定义语言和弱类型定义语言 ❤ 主流语言介绍 C语言 C java python JavaScript SQL PHP python从小白到总裁完整教程目录:https://blog…...
[nodejs开发] typescript引入js模块或文件
首先更改tsconfig.json 中的compilerOptions属性:"moduleResolution": "Node"假设有一个abc.js其内容如下:var Circle (function () {function Circle() {}Circle.prototype.draw function () {console.log("Cirlce is drawn…...
小帮软件机器人应用于通信集团财务数据填报、编制、稽核、银企对账
某大型通信集团是国有控股通信运营服务提供商,主要从事国内外通信设施服务业务、固定通信业务、移动通信业务、数据通信业务、网络接入业务、卫星国际专线业务和通信业务相关系统集成业务,管辖20多家子(分)公司、服务运营和支持网…...
37. CF-Weights Distributing
链接 这是一个比较经典的题目。容易想到求出两段路径重合的部分,然后贪心的放权值。那么跑三次最短路,枚举重合部分的端点即可。 正解没什么好说的。这题有趣的地方在于,如果数据比较弱,可能会把一些错误做法放过去。 一种错误…...
百丽时尚×优维科技×道客战略启动「云原生一体化项目」
3月7日,由百丽时尚集团(以下简称:百丽时尚)联合优维科技、道客共同举办的「云原生一体化项目启动会」在深圳百丽国际大厦圆满落幕,项目合作三方齐聚一堂,就云原生一体化建设战略方案达成合作共识࿰…...
小诺开源技术
小诺开源技术 文章目录小诺开源技术前言页面演示介绍文档学习建议登录地址下载地址前言 近期接触了小诺开源技术的一个前端框架,底层是蚂蚁框架,感觉很好用,不过需要稍微学习并适应一下,推荐给大家,本篇仅用于学习&am…...
AidLux AI应用案例悬赏选题 | 纺织品表面瑕疵检测
AidLux AI 应用案例悬赏征集活动 AidLux AI 应用案例悬赏征集活动是AidLux推出的AI应用案例项目合作模式,悬赏选题将会持续更新。目前上新的选题涉及泛边缘、机器人、工业检测、车载等领域,内容涵盖智慧零售、智慧社区、智慧交通、智慧农业、智能家居等…...
UE官方教程笔记02-实时渲染基础下
对官方教程视频[官方培训]02-实时渲染基础下 | 陈拓 Epic的笔记没听懂的地方就瞎写反射实时渲染中反射是一个非常有挑战的特性UE中有多种不同的方案,各有各的优势和缺点反射捕获屏幕空间反射平面反射LumenRT Reflection反射捕获在指定位置捕获一张Cube Map需要预计算…...
grep命令——在文件中搜索指定的文本模式
grep是英文词组“global search regular expression and print out the line”的缩写,意思是全局搜索正则表达式,并将结果输出。 通常将grep命令与正则表达式搭配使用,命令选项作为搜索过程中的补充或对输出结果的筛选,命令模式十…...
数据结构刷题(二十二):90子集II、491递增子序列、46全排列
1.子集II题目链接思路:这是一道标准的组合问题数组排序去重。依然是使用回溯。注意:去重代码只需要判断同一树层上是否有重复,同组合总和II(https://blog.csdn.net/xiaomingming99/article/details/129396344)解法&…...
AI+人类,实现高效网络安全
导语 聊天机器人和生成式人工智能(如 ChatGPT)突然成为主流让很多人感到担忧。很多人开始担忧,人工智能取代人的时代已经到来。 幸运的是,事实并非如此。 更有可能的情况是,人类将与 AI 合作创建工作角色的混合模型。…...
牛客小白月赛68【A-E】
文章目录A.Tokitsukaze and New Operation【模拟】B.Tokitsukaze and Order Food Delivery【模拟、特判】C.Tokitsukaze and Average of Substring【暴力、前缀】D.Tokitsukaze and Development Task【记忆化搜索】E.Tokitsukaze and Colorful Chessboard【预处理,二…...
WIFI P2P架构
WI-FI P2P定义架构3个组件组织结构技术标准P2P DiscoveryDevice Discovery(扫描)流程p2p probe 管理帧Group Formation(组网)GO Negotiation(GON)流程P2P Public Action管理帧Provision Discoveryÿ…...
架构师之中台思维_系统发展之路_结果和抽象之间平衡的艺术
父文章 如何成为一名架构师,架构师成长之路_golang架构师成长之路_个人渣记录仅为自己搜索用的博客-CSDN博客 任何系统的发展都是如此. 1. 业务增长 2. 烟囱增长 _ 结果优先 _ 太快去抽象抽象不好 3. 太多的烟囱, 3.1 抽象复用为平台 3.2 面对更多新的业务,提供不同的枚举值…...
23届非科班选手秋招转码指南
1.秋招情况介绍 1.1自我介绍 我是一名23届非科班转码选手,本硕均就读于某211院校机械专业,秋招共计拿下12份offer,包括大疆创新、海康威视、联发科技、理想汽车、中电28、阳光电源等各行业、各种性质企业的意向。主要的投递岗位为嵌入式软件…...
《传感器技术》考试学习笔记
文章目录一、选择题二、简答题1.什么是传感器?传感器的共性是哪些?2.差动变气隙式传感器电感传感器的灵敏度推导过程是什么(推导公式)?与单极性进行比较它们的优缺点是哪些?3.霍尔传感器如何进行微位移测量…...
城乡规划专业招聘信息网/seo优化网站模板
文章目录1.科学计算库2.什么是机器学习3.人工智能主要分支1.人工智能、机器学习和深度学习2.主要分支介绍3.人工智能发展必备三要素:3. 机器学习工作流程1.流程总结2.获取到的数据集介绍3.数据基本处理4. 特征工程1.什么是特征工程2. 为什么需要特征工程(Feature En…...
wordpress登录查看插件/北京优化网站推广
前两天在一个论坛上看到一篇帖子,上面列举了很多经典书籍,推荐给大家。看了下面的回帖。有很多说看这么多书是没有用的,看几本就行了,看了这么多书也学不到别人的经验。我惶恐了,自己非常喜欢看书,难道以前…...
b2b网站方案/北京seo代理公司
首先介绍一下是什么意思: 意思就是当你给一个vue组件绑定事件时候,要加上native!如果是普通的html元素!就不需要 <div id "app"><my-component click"i_said"></my-component> </div&g…...
太极馆如何做网站/微信推广软件有哪些
课上作业补做 循环与递归第二章编程题 P32 4.1P32 4.2第三章编程题 P49 4.1P49 4.2P49 4.3P49 4.4P49 4.5P49 4.6转载于:https://www.cnblogs.com/zhuyue-study/p/8647566.html...
网站开发深圳公司/项目推广方式有哪些
关于docker的使用,可以参考之前的系列文章。测开必备技能--docker环境搭建测开必备技能--docker常用命令操作这里不在对于docker的的知识做概述。我们在之前的文章中分享过性能相关的基础知识,可以在性能测试系列十一 压测工作结束后,里面有系…...
江苏水利建设网站/搜索引擎优化是什么
操作步骤如下图所示: 转载于:https://www.cnblogs.com/Guhongying/p/10642784.html...