当前位置: 首页 > news >正文

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+,由于retoperator+里的局部变量,出了作用域就会自动删除,因此会先将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 就同层级别&#xf…...

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体系认证办理&#xff0c;可以自行申请吗&#xff1f;为什么都要找咨询公司&#xff1f; 很多人认为ISO咨询公司为中介机构&#xff0c;希望直接找认证公司进行认证。其实认证机构担任的是认证审核职责&#xff0c;咨询机构担任的是咨询职责。按中国国家任可监委员会的…...

二、Neo4j源码研究系列 - 单步调试

二、Neo4j源码研究系列 - 单步调试 一、背景介绍 上一篇我们已经把了neo4j的源码准备以及打包流程完成了&#xff0c;本篇将讲解如何对neo4j进行单步调试。对于不了解如何编译打包neo4j的读者&#xff0c;请阅读《一、Neo4j源码研究系列 - 源代码准备》。 大纲&#xff1a; …...

基于Qt WebEngine 的Web仪器面板GUI程控技术

随着IIoT的发展&#xff0c;很多工业仪器也具备了远程管理的GUI。与早期使用串口进行命令交互不同&#xff0c;这些GUI可以直接在远程呈现数据。 作为希望对仪器、软件进行二次开发的小公司来说&#xff0c;会遇到GUI人工操作转自动化的需求。在无法通过串口等传统接口进行自动…...

海康摄像头使用RTSP

1.协议格式。海康威视IP摄像头rtsp协议地址如下&#xff1a;rtsp://[username]:[passwd][ip]:[port]/[codec]/[channel]/[subtype]/av_stream主码流&#xff1a;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属性&#xff1a;"moduleResolution": "Node"假设有一个abc.js其内容如下&#xff1a;var Circle (function () {function Circle() {}Circle.prototype.draw function () {console.log("Cirlce is drawn…...

小帮软件机器人应用于通信集团财务数据填报、编制、稽核、银企对账

某大型通信集团是国有控股通信运营服务提供商&#xff0c;主要从事国内外通信设施服务业务、固定通信业务、移动通信业务、数据通信业务、网络接入业务、卫星国际专线业务和通信业务相关系统集成业务&#xff0c;管辖20多家子&#xff08;分&#xff09;公司、服务运营和支持网…...

37. CF-Weights Distributing

链接 这是一个比较经典的题目。容易想到求出两段路径重合的部分&#xff0c;然后贪心的放权值。那么跑三次最短路&#xff0c;枚举重合部分的端点即可。 正解没什么好说的。这题有趣的地方在于&#xff0c;如果数据比较弱&#xff0c;可能会把一些错误做法放过去。 一种错误…...

百丽时尚×优维科技×道客战略启动「云原生一体化项目」

3月7日&#xff0c;由百丽时尚集团&#xff08;以下简称&#xff1a;百丽时尚&#xff09;联合优维科技、道客共同举办的「云原生一体化项目启动会」在深圳百丽国际大厦圆满落幕&#xff0c;项目合作三方齐聚一堂&#xff0c;就云原生一体化建设战略方案达成合作共识&#xff0…...

小诺开源技术

小诺开源技术 文章目录小诺开源技术前言页面演示介绍文档学习建议登录地址下载地址前言 近期接触了小诺开源技术的一个前端框架&#xff0c;底层是蚂蚁框架&#xff0c;感觉很好用&#xff0c;不过需要稍微学习并适应一下&#xff0c;推荐给大家&#xff0c;本篇仅用于学习&am…...

开源技能图谱平台gotalab/skillport:构建可视化知识大脑的实战指南

1. 项目概述&#xff1a;一个技能图谱与知识管理的开源利器 在信息爆炸的时代&#xff0c;无论是个人学习成长&#xff0c;还是团队知识沉淀&#xff0c;我们常常面临一个核心痛点&#xff1a; 知识是零散的、孤立的&#xff0c;难以形成体系&#xff0c;更难以高效复用 。你…...

从-15dBm到+16dBm:STC8G信标FM射频放大链路实测与优化

1. 从零开始的FM信标信号放大实战 去年我在做一个野外定位项目时&#xff0c;遇到了一个棘手的问题&#xff1a;用STC8G微控制器生成的FM信标信号&#xff0c;在空旷地带的有效传输距离还不到50米。当时测得的初始输出功率只有-15dBm左右&#xff0c;这个强度连穿过一片小树林都…...

别再只会用Bridge了!从KVM网络配置到Open vSwitch实战,聊聊虚拟交换机的那些‘坑’

从传统桥接到Open vSwitch&#xff1a;虚拟网络进阶实战指南 在虚拟化技术普及的今天&#xff0c;网络配置往往成为制约整体性能的关键瓶颈。许多运维工程师在初期使用KVM默认的桥接或NAT网络时&#xff0c;能够满足基本需求&#xff0c;但随着业务规模扩大&#xff0c;传统方案…...

如何通过Noto Emoji实现跨平台表情符号统一:技术原理与应用实践

如何通过Noto Emoji实现跨平台表情符号统一&#xff1a;技术原理与应用实践 【免费下载链接】noto-emoji Noto Emoji fonts 项目地址: https://gitcode.com/gh_mirrors/no/noto-emoji 在数字通信日益全球化的今天&#xff0c;表情符号已成为跨越语言障碍的重要视觉语言。…...

CODESYS与C#共享内存通讯踩坑实录:从“找不到路径”到稳定运行的调试指南

CODESYS与C#共享内存通讯实战&#xff1a;从命名空间陷阱到工业级稳定方案 在工业自动化项目中&#xff0c;CODESYS与上位机程序的实时数据交换堪称"生命线"。共享内存作为性能最高的IPC方式&#xff0c;理论上能达到微秒级响应——直到你在部署现场遇到那个经典的&q…...

为OpenClaw智能体工作流配置Taotoken作为统一的模型服务后端

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为OpenClaw智能体工作流配置Taotoken作为统一的模型服务后端 对于使用OpenClaw框架构建AI智能体的开发者而言&#xff0c;一个稳定…...

保姆级教程:用Arduino IDE给GRBL固件刷机,手把手搞定激光雕刻机大脑

GRBL固件刷机全指南&#xff1a;从零构建激光雕刻机控制核心 当你第一次拿到激光雕刻机的控制板时&#xff0c;最关键的步骤莫过于为它注入"灵魂"——GRBL固件。作为开源CNC控制领域的标杆&#xff0c;GRBL以其高效稳定的运动控制算法赢得了全球创客的青睐。但面对A…...

SingleFile革命性方案:为什么传统网页保存方法注定失败,而单文件保存正在重新定义数字保存范式

SingleFile革命性方案&#xff1a;为什么传统网页保存方法注定失败&#xff0c;而单文件保存正在重新定义数字保存范式 【免费下载链接】SingleFile Web Extension for saving a faithful copy of a complete web page in a single HTML file 项目地址: https://gitcode.com/…...

对比直接使用厂商API,Taotoken在路由容灾方面的体验差异

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比直接使用厂商API&#xff0c;Taotoken在路由容灾方面的体验差异 1. 单一服务依赖的潜在挑战 在直接使用单一模型厂商的API进行…...

PCL2启动器完整使用指南:从零开始打造个性化Minecraft体验

PCL2启动器完整使用指南&#xff1a;从零开始打造个性化Minecraft体验 【免费下载链接】PCL Minecraft 启动器 Plain Craft Launcher&#xff08;PCL&#xff09;。 项目地址: https://gitcode.com/gh_mirrors/pc/PCL PCL2启动器是一款功能强大的Minecraft游戏启动工具&…...