(赋值)运算符号重载

概念以及语法

运算符重载:operator
函数原型:返回值类型 operator 操作符(参数列表)
//操作符有几个操作数就有几个参数

//操作符只包含C/C++已经有的,就是说我们不能创建新的操作符,只能重载已有的运算符
例如使用operator来重载@,.等运算符,因为C/C++本身没有这个运算符

必须有一个自定义类型的参数
这个很好理解,假如没有自定义类型,那就没有必要重载运算符了
原有的操作符就能解决,这也是运算符重载的来由,例如一般数字加减乘除我们可以使用+-*/,但是假如我们要对两个日期进行加减呢?原有的运算符体系久无法解决,这就需要我们自己写一个,这就是运算符重载

深入理解:

不能重载运算符去改变内置类型
什么意思?
例如要对+加号重载,但是你不能把这个原本是处理加法的符号,改成减法的
在类成员时,形式上只有一个参数,那是因为有一个隐含的this本类对象的参数
不能重载的运算符:.* (点星)  、::(域访问)、  sizeof   、  ?:、.
赋值运算符重载:
也是默认成员函数之一
void operator= (const classname x)//其中一个参数为this
{
....
}

(流插入运算符的优先级很高)
内置类型的赋值运算符,是从右到左,有返回值,返回值为左操作数
赋值表达式的返回值不能是const,也不能是指针(下面有解释)

上述的赋值运算符重载还有一个问题:
那就是不支持连续赋值
例如有三个类对象:n1、n2、n3
n1 = n2 =n3
试想,这个连续赋值表达式有问题吗?
如果是内置类型就不会有问题
但是,现在他们是自定义类型
注意,赋值表达式是有一个返回值的
这个返回子一般来说默认为左操作数
但是,假如上述写的赋值运算符重载返回值是void
也就是说,没有返回值
那么当n2 = n3执行完之后,就完了
没有返回值了
那么n1怎么办?
所以就会报错
所以需要完善一下我们的赋值运算符重载
而这里的问题根源是没有返回值
既然没有返回值,那我们就给个返回值
返回什么?
返回左操作值
左操作值是什么?
这个赋值重载函数是n2= n3
所以返回n2
也就是*this

但是,还是有问题
什么问题?
这个返回值是一个传值返回
而且返回的是一个自定义类型
返回值本质都是返回一个拷贝
自定义作为返回值,会去调用其对应的拷贝构造
太浪费,也麻烦
所以,更加优化的写法是将返回值设置为引用&
那么,返回值要不要加一个const呢?
不能加
因为对于内置类型的赋值:(a = b )= c;
先把b赋值给a,左边括号内的返回值是左操作数就是a本身,只是被赋值为b了
然后,再将c赋值给a
也就是说,这里的a作为第一个表达式的返回值,是可以修改的
所以,这是C++规定的
所以,最好我们也遵循同样的规则
就是不加const

那么不能返回指针,是为什么呢?很简单,因为指针不能直接进行读写,用引用代替

同时,可以对同一个类对象赋值的时候,加一个特殊处理
例如:a1 = a1;
因为不排除有大可爱会写这样的代码

赋值运算符重载:


所以,赋值运算符重载格式:
1、参数类型const T& 引用传参提高效率
2、返回值类型:T&,返回引用可以提高返回效率,同时可以支持连续赋值
3、检查是否给自己给自己赋值
4、返回*this(即左操作符),也就是和C++一致

同时,运算符重载不可以定义为全局
为什么?
如果定义为全局函数
那么类内部就没有我们定义的赋值重载
那么编译器就会自动生成一个
那么问题就来了:
类内部有一个赋值重载
你全局域也有一个赋值重载
那调用的时候到底听谁呢?
所以,就强制规定,不能定义为全局

因为赋值重载函数是默认的成员函数之一
所以,我们没有显示实现时,编译器就会自动生成一个
默认生成的赋值重载和默认生成的拷贝构造函数一样
对内置类型不调用,直接赋值
但是对于自定义类的赋值,就会调用对应类的赋值重载

总结起来就是:
构造函数和析构函数均对内置类型不处理,对自定义类型调用
拷贝构造和赋值重载对内置类型拷贝不做处理,对自定义类型调用对应的拷贝构造(都是以值得性质,按照字节序进行浅拷贝)

相关知识:


不声明定义分离就是内联 

当一个数组被频繁的调用的时候,可以设置为静态,就不必频繁的开辟空间
两个同时存在的变量才叫赋值,否则是拷贝构造

先-后-=
因为减法直接在引用上进行处理,不需要拷贝一份新的
但是-=需要拷贝一份对象进行处理返回

前置++和后置++怎么处理?
强制处理:
void namespace::opraretor++()//前置
void namespace::opraretor++(int)//后置

调试是可以拖的(free不可以)
全局、静态可以使用引用返回,比较方便,可以直接读写

拷贝构造是将一个已经创建的、同类型的作为参数,拷贝到另外一个类对象。是初始化
但是赋值运算重载是对已经存在的两个类对象,将一个类对象赋值给另外一个类对象

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

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

相关文章

VMware安装Ubuntu 18.04.2

下载Ubuntu映像 下载地址:http://old-releases.ubuntu.com/releases/18.04/ 下载名称: ubuntu-18.04.2-desktop-amd64.iso 清华镜像站:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/ 阿里云镜像站:https://mirrors.ali…

python 统计中国观鸟记录中心官网已观测的鸟类种类

python 统计中国观鸟记录中心官网已观测的鸟类种类 中国观鸟记录中心网站:https://www.birdreport.cn/ 先下载官网 Excel 文件 文件放置目录如下: home dataset xxx.xlsxxxx.xlsxxxx.xlsx Excelgrep.py (进行文件内容提取的程序&#xff…

关于Ubuntu虚拟机突然上不了网的问题

今天刚重新把Ubuntu虚拟机下回来准备大干一场,结果去吃饭回来虚拟机就上不去网了,具体体现为右上角没有网络的图标,下图是有网络的情况,废话不多说,直接给出解决方案:博客在此 我就是运行了这三行代码就成功…

如何杀死服务器出现的僵尸进程

今天在服务器上进行深度学习训练的时候,发现已经结束程序代码,但是GPU还是显示显存在运行。 为了解决这些问题,网上查找了大量的资料,发现是因为僵尸进程的原因,因此记录相关的解决步骤,方便自己和大家。 …

Error: Unable to find git in your PATH. flutter dart

我的是重装git ,参考 flutter Unable to find git in your PATH - ZJH_BLOGS - 博客园 (cnblogs.com)

一周速递|全球车联网产业动态(2024年3月17日)

政策法规 1、3月16日,在中国电动汽车百人会论坛(2024)国际论坛上,国家发改委、工信部、科技部、商务部、住建部等国家部委表示将采取更多务实举措,支持新能源汽车行业企业发展,加大对全固态电池、智能网联…

Elasticsearch(12) match_bool_prefix的使用

elasticsearch version: 7.10.1 match_bool_prefix 是 Elasticsearch 中用于执行布尔前缀查询的一种查询类型。这种查询类型特别适用于当你想要匹配一个字段的前缀,并且希望这个字段中的词语是按照一定顺序出现的场景。 match_bool_prefix 语法 { &q…

设计模式 — — 单例模式

一、是什么 单例模式只会在全局作用域下创建一次实例对象,让所有需要调用的地方都共享这一单例对象 二、实现 // 单例构造函数 function CreateSingleton (name) {this.name name;this.getName(); };// 获取实例的名字 CreateSingleton.prototype.getName func…

✅技术社区—跨域问题及解决方案

一、什么是跨域、为什么会跨域? 我们把问题分解 谁出现的跨域? 》 浏览器! 为何出现? 》 同源策略 什么是同源策略? 根据百度百科 同源策略/SOP(Same origin policy)是一种约定&#xff0…

Linux 时间系统调用

UNIX及LinuxQ的时间系统是由「新纪元时间」Epoch开始计算起。Epoch是指定为1970年1月1日凌晨零点零分零秒,格林威治时间。目前大部份的UNX系统都是用32位来记录时间,正值表示为1970以后,负值则表示1970年以前。 对于当前时间到Epoch 我们用两…

代码算法训练营day10 | 232.用栈实现队列、225. 用队列实现栈

day10: 232.用栈实现队列225. 用队列实现栈 232.用栈实现队列 题目链接 状态: 文档:programmercarl.com 思路: 用栈实现队列。要先明白两者的区别。 栈:单开门,先进后出,只有一端能进出。 队列:…

继承 ResponseEntityExceptionHandler

目录 作用概述 示例-HttpRequestMethodNotSupportedException 示例-自定义异常处理 总示例 使用了ResponseEntityExceptionHandler后,为什么发生了异常后返回体为空 方法执行顺序 作用概述 这是一个方便的基类,用于希望通过 ExceptionHandler 方法…

Vue项目的搭建

Node.js 下载 Node.js — Download (nodejs.org)https://nodejs.org/en/download/ 安装 测试 winR->cmd执行 node -v配置 在安装目录下创建两个子文件夹node_cache和node_global,我的就是 D:\nodejs\node_cache D:\nodejs\node_global 在node_global文件下再创建一个…

并查集(详解+例题)

1、作用 将两个集合合并 询问两个元素是否在一个集合中 2、基本原理 每个集合用一颗树表示。树根的编号就是整个集合的编号。每个节点存储它的父节点,p[x]表示x的父节点。 3、实现 问题1:如何判断树根:if(p[x]x); 问题2:如何求…

C++ 特殊类及单例模式

文章目录 1. 前言2. 不能被拷贝的类3. 不能被继承的类4. 只能在堆上创建对象的类5. 只能在栈上创建对象的类6. 只能创建一个对象的类(单例模式) 1. 前言 在实际场景中,我们在编写类的过程中总会遇到一些特殊情况,比如设计一个类不…

深入解析红黑树(RB-Tree):原理、操作及应用

文章目录 一、红黑树的特点与性质二、红黑树的实现1、实现红黑树的插入操作2、红黑树的验证方法a. Check 函数b. IsBalance 函数 红黑树作为一种自平衡的二叉搜索树,在计算机科学领域中占据着重要的地位。它的设计旨在在维持树的平衡性的同时,保证各种操…

红队攻防之exe文件签名免杀

达则兼善天下,穷则独善其身 1、生成 cobaltstrike bin文件,选择raw选项。 2、使用 cobaltstrike分离免杀工具生成loader.exe文件。 3、使用UPX对生成的exe文件进行加壳,加壳前后对比文件的大小。 4、对loader.exe进行制作并签发证书-数字签名…

数通-OSPF基础-01

动态路由;两端设备必须使用相同的动态路由协议(形成路由域) 设备1运行RIP——设备2运行RIP、OSPF——设备3运行OSPF,两个协议之间进行路由学习(路由引入技术) 动态路由更新方式:1.周期更新——…

国家推荐标准 20986 2023 信息安全技术 网络安全事件分类分级指南 学习记录

网络安全事件分类分级指南是指在网络安全领域对不同类型的安全事件进行分类和分级的指南和标准。这样的分类分级指南有助于标准化对安全事件的处理和应对措施,并能够帮助组织更好地应对和管理安全事件。 一般来说,网络安全事件可以根据其严重性、影响程…

UDF提权

目录 一、UDF概述 二、提权条件 三、漏洞复现 (一) 信息收集 1. Nmap信息收集 1.1、查看当前IP地址 1.2、扫描当前网段,找出目标机器 1.3、快速扫描目标机全端口 2. dirb目录扫描 3. 第一个flag 3.1、目录遍历漏洞 3.2、flag 4. 敏感信息利用 (二) 漏…