c++ :运算符重载函数中的细节

赋值运算符重载与拷贝构造函数

(1)区分初始化时的赋值(一般就叫初始化),和非初始化时的赋值(一般就叫赋值)
(2)实验验证初始化和赋值时各自对应

避免赋值运算符中的自赋值

(1)自赋值就是Person a; a = a;
(2)自赋值如果不处理,轻则浪费效率,重则导致内存丢失(该深拷贝时做了浅拷贝,在2.4.8中详解)
(3)避免自赋值很简单,只需要在赋值运算符重载函数所有操作前加上一个判断 if (this != &other)即可

  // 重载赋值运算符// Coordinate operator=(const Coordinate &other)// {//这样会导致重载赋值运算时会执行这个函数Coordinate &operator=(const Coordinate &other) {  //这样就不会std::cout << "  重载赋值运算符 " << std::endl;if (this == &other) {return *this;  // 处理自赋值}x = other.x;y = other.y;return *this;}

赋值运算符重载函数返回引用

返回引用好处1:提升程序效率
(1)赋值运算符重载函数返回值可以返回对象类型,也可以返回对象引用类型,都能工作。代码验证
(2)区别在于:返回引用可以避免一次返回值值传递的对象复制,这需要消耗资源的。代码验证
(3)总结:虽然C++语法并未强制要求,但是好的写法是应该返回引用

返回引用好处2:允许连续赋值式
(1)返回对象而不是引用时,在连续赋值(c = a = b;)时会编译可以,运行也可以,但是效率低同1中所讲。
(2)原因是先执行a=b操作,返回值再作为第2次赋值运算的右值(也就是函数参数),对象和引用是类型兼容的
(3)总结:连等在返回对象和引用时都可以,但是在返回void时就不可以了

  Coordinate &operator=(const Coordinate &other) {  //这样就不会std::cout << "  重载赋值运算符 " << std::endl;if (this == &other) {return *this;  // 处理自赋值}x = other.x;y = other.y;return *this;}Coordinate *operator=(const Coordinate *other) {std::cout << "  *other重载赋值运算符 " << std::endl;if (this == other) {return this;  // 处理自赋值}x = other->x;y = other->y;return this;}Coordinate a(3, 4);Coordinate b = a;  // 拷贝构造函数Coordinate c;c = &a;      //*other重载赋值运算符 c =  b;  // 重载赋值运算符std::cout << "a: " << a << std::endl;std::cout << "b: " << b << std::endl;std::cout << "c: " << c << std::endl;

总结

定义新变量并且使用已有变量对堆新变量进行初始化时会调用拷贝构造函数
对已经定义的变量使用已有变量进行赋值运算时会调用赋值运算符

函数返回值不同,不能构成重载
运算符重载传参的尴尬,导致引用的产生

学习记录,侵权联系删除。
来源:朱老师物联网大课堂

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

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

相关文章

鞭炮插画:成都亚恒丰创教育科技有限公司

鞭炮插画&#xff1a;年味里的绚烂记忆 在岁末年初的温柔时光里&#xff0c;总有一抹色彩&#xff0c;能瞬间唤醒沉睡的年味——那便是鞭炮插画中跃动的红与金&#xff0c;成都亚恒丰创教育科技有限公司 它们不仅仅是纸与墨的交织&#xff0c;更是情感与记忆的桥梁&#xff0c…

自适应手机版大学职业技术学院网站模版源码系统 带完整的安装代码包以及搭建部署教程

系统概述 随着智能手机的普及和移动互联网技术的飞速发展&#xff0c;用户越来越倾向于通过移动设备访问网站。对于大学职业技术学院而言&#xff0c;一个能够自适应各种屏幕尺寸、操作流畅、内容丰富的移动端网站&#xff0c;不仅能够提升用户体验&#xff0c;还能有效扩大学…

最短路之朴素版的dij板子

模板&#xff1a; 注意这个只是单向的双向的需要在更新一次 #include<bits/stdc.h>using namespace std;typedef long long ll; typedef pair<int, int>PII; const int N2e510; const int MOD 998244353; const int INF0X3F3F3F3F; const int dx[]{-1,1,0,0,-1,…

【Python Tips】将一个列表List元素添加进另一个列表List

一、引言 在处理Python列表数据类型时&#xff0c;有时需要合并两个列表&#xff0c;下面是几种列表合并的操作代码&#xff0c;尤其是对于长列表的高效合并方式&#xff0c;记录在此。 二、列表合并方式 1. 使用extend方法 extend方法将一个列表中的所有元素添加到另一个列表…

mysql快速精通(三)表关系

主打一个实用 一. 一对多&#xff08;多对一&#xff09;关系 例如班级和学生&#xff0c;这种类型我们一般建两个表,一方为主表&#xff0c;多方为从表 二. 多对多 例如课程与学生&#xff0c;这种类型我们一般需要建三张表&#xff0c;两张一方主表&#xff0c;与一张多方从表…

初识影刀:EXCEL根据部门筛选低值易耗品

第一次知道这个办公自动化的软件还是在招聘网站上&#xff0c;了解之后发现对于办公中重复性的工作还是挺有帮助的&#xff0c;特别是那些操作非EXCEL的重复性工作&#xff0c;当然用在EXCEL上更加方便&#xff0c;有些操作比写VBA便捷。 下面就是一个了解基本操作后&#xff…

[Linux]CentOS软件的安装

一、Linux 软件包管理器 yum 1.Linux安装软件的方式 在linux中安装软件常用的有三种方式&#xff1a; 源代码安装&#xff08;我们还需要进行编译运行后才可以&#xff0c;很麻烦&#xff09; rpm安装&#xff08;Linux的安装包&#xff0c;需要下载一些rpm包&#xff0c;但是…

基于机器学习的锂离子电池容量估计(MATLAB R2021B)

锂离子电池已经广泛应用于电动汽车或混合动力汽车的能源存储装置。由于电化学成分的衰退&#xff0c;锂离子电池随着使用时间的增加&#xff0c;电池性能不断退化&#xff0c;导致电池容量和功率发生衰退。电池容量衰退的因素主要有金属锂沉积&#xff0c;活性物质分解和电解液…

深度学习DeepLearning多元线性回归 学习笔记

文章目录 多维特征变量与术语公式多元线性回归正规方程法Mean normalizationZ-score normalization设置合适的学习率Feature engineering 多维特征 变量与术语 列属性xj属性数n x ⃗ \vec{x} x (i)行向量某个值 x ⃗ j i \vec{x}_j^i x ji​上行下列均值μ标准化标准差σsigm…

SpringMVC 中常用注解

在 SpringMVC 框架的开发中&#xff0c;注解的合理运用能够极大地提高开发效率和代码的可维护性。今天&#xff0c;让我们一起来总结一下 SpringMVC 中一些常用的注解及其用法。 一、Controller 注解 Controller 用于标识一个控制器类&#xff0c;该类中的方法用于处理用户的请…

ArduPilot开源代码之AP_AHRS_Backend

ArduPilot开源代码之AP_AHRS_Backend 1. 源由2. 类继承关系3. 框架设计2.1 构造函数和析构函数2.2 不可复制2.3 嵌套结构和枚举2.4 虚方法2.5 静态方法2.6 实用方法2.7 纯虚方法2.8 条件编译 3. 虚方法设计3.1 初始化3.1.1 构造函数3.1.2 析构函数3.1.3 AP_AHRS_Backend::init …

Chromium CI/CD 之Jenkins实用指南2024-如何创建新节点(三)

1. 前言 在前一篇《Jenkins实用指南2024-系统基本配置&#xff08;二&#xff09;》中&#xff0c;我们详细介绍了如何对Jenkins进行基本配置&#xff0c;包括系统设置、安全配置、插件管理以及创建第一个Job。通过这些配置&#xff0c;您的Jenkins环境已经具备了基本的功能和…

基于pyqt5实现xlsx选择器应用程序

环境搭建 基于python3.12pyqt5 pip3 install PyQt5 pip3 install pyinstallerpyinstaller --onefile --windowed test.py代码 新建main.py import sys from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLineEdit, QFileDial…

leetcode 665.非递减数列

1.题目要求: 给你一个长度为 n 的整数数组 nums &#xff0c;请你判断在 最多 改变 1 个元素的情况下&#xff0c;该数组能否变成一个非递减数列。我们是这样定义一个非递减数列的&#xff1a; 对于数组中任意的 i (0 < i < n-2)&#xff0c;总满足 nums[i] < nums[i…

Java 设计模式系列:外观模式

简介 外观模式&#xff08;Facade Pattern&#xff09;是一种设计模式&#xff0c;又名门面模式&#xff0c;是一种通过为多个复杂的子系统提供一个一致的接口&#xff0c;而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口&#xff0c;外部应用程序不用关心内部…

Android中RecyclerView使用详解(一)

目录 概述优点列表布局RecyclerView一、创建RecyclerView并且在布局中绑定二、实现RecyclerView单个item的布局三、给RecyclerView写一个对应的适配器Adapter1.创建自定义的ViewHolder2.继承Adapter&#xff0c;泛型使用我们自定义的ViewHolder3.重写Adapter的三个方法onCreate…

线程安全(二)synchronized 的底层实现原理、锁升级、对象的内存结构

目录 一、基础使用1.1 不加锁的代码实现1.2 加锁的代码实现二、实现原理2.1 synchronized 简介2.2 对象监控器(Monitor)2.3 加锁过程第一步:判断 Owner 指向第二步:进入 EntryList 阻塞第三步:主动进入 WaitSet 等待三、锁升级3.1 对象的内存结构3.2 Mark Word 对象头3.3 …

MySQL sql_safe_updates参数

sql_safe_updates 是 MySQL 中的一个系统变量&#xff0c;用于控制 MySQL 服务器是否允许在没有使用 KEY 或 LIMIT 子句的 UPDATE 或 DELETE 语句上执行更新或删除操作。当这个变量被设置为 ON 时&#xff0c;MySQL 会拒绝那些可能影响到表中大量行的 UPDATE 或 DELETE 语句&am…

SpringBoot实战:多表联查

1. 保存和更新公寓信息 请求数据的结构 Schema(description "公寓信息") Data public class ApartmentSubmitVo extends ApartmentInfo {Schema(description"公寓配套id")private List<Long> facilityInfoIds;Schema(description"公寓标签i…

LLM用于时序预测真的不行,连推理能力都没用到

语言模型真的能用于时序预测吗&#xff1f;根据贝特里奇头条定律&#xff08;任何以问号结尾的新闻标题&#xff0c;都能够用「不」来回答&#xff09;&#xff0c;答案应该是否定的。事实似乎也果然如此&#xff1a;强大如斯的 LLM 并不能很好地处理时序数据。 时序&#xff0…