【C++】赋值运算符重载

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

文章目录

  • 前言:
  • 一、赋值运算符重载的定义
  • 二、赋值运算符重载的使用
  • 三、使用细节
  • 四、运算符重载的参数问题

前言:

C++为了增强代码的可读性引入了运算符重载。运算符重载是具有特殊函数名的函数,其目的就是让自定义类型可以像内置类型一样可以直接使用运算符进行操作。运算符重载,就是对已有的运算符赋予多重含义,使同一运算符作用于不同类型的数据时产生不同的行为。运算符重载的目的是使得 C++ 中的运算符也能够用来操作对象。

例如:两个日期的比较,肯定不能单纯的使用==去比较,==只能运算两个标准类型的值。所以这时我们可以写一个函数来实现日期的比较。并使用运算符重载的方式给这个函数,名命名为‘-’.这样我们就可以使用 ==实现像是标准类型那般使用。

一、赋值运算符重载的定义

函数名字:关键字operator后面接需要重载的运算符符号
函数格式:

<返回类型说明符> operator <运算符符号>(参数列表)
{
     函数体
}

二、赋值运算符重载的使用

如下,比较两个日期函数。

#include<iostream>
using namespace std;

class Date
{
public:
	Date(int year = 0, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
public:
//private:
	int _year;
	int _month;
	int _day;
};

bool operator==(const Date& x1,const Date& x2)
	{
		return x1._year == x2._year
			&& x1._month == x2._month
			&& x1._day == x2._day;
	}
int main()
{
	//创建两个对象,并赋初始值
	Date d1(1919, 9,9);
	Date d2(1919,9,9);
	if (d1 == d2) {
		cout << "true" << endl;
	}
	else {
		cout << "false" << endl;
	}
	return 0;
}

在这里插入图片描述
在这里插入图片描述

注意点:

  • 由于是自定义类型传参,我们若是使用传值传参,会额外调用一次拷贝构造函数,所以函数的参数最好使用引用传参
  • 上述代码中类的成员变量访问限定符是public。否则下面的函数无法访问到。可以使用友元函数就可以访问到函类中的private型变量了。
  • 对于参数,在函数体内不会对其进行修改,所以最好加上const进行修饰。
  • bool operator==(const Date& x1,const Date& x2)定义在类外,是全局函数,参数中不存在this指针。

三、使用细节

  • 不能通过连接其他符号来创建新的操作符:比如operator@,只能是运算符
  • 重载操作符必须有一个类类型参数。
  • 用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义
  • 作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐
    藏的this
  • .* :: sizeof ?: . 注意以上5个运算符不能重载。

四、运算符重载的参数问题

1.重载操作符必须有一个类类型参数。
2.函数如果在类中,那么它的参数中才有会有隐藏的this指针(它会抢占最左边位置)。但是,函数如果定义在类外,就成一个全局函数,就没有this指针了。
3.一般的运算符写成成员函数。但是流运算符函数要写在类外,在类中有声明,这样就要自己给参数,没有this指针,就可以写成cou<<d1;在传参时,有一个默认的隐藏的this指针参数。会影响顺序。
例如:
下面的代码是写在类外的,所以两个参数都是自己手动传的。

bool operator==(const Date& x1,const Date& x2)
	{
		return x1._year == x2._year
			&& x1._month == x2._month
			&& x1._day == x2._day;
	}

将代码写进类中。

bool operator==(const Date& x2)
	{
		return _year == x2._year
			&& _month == x2._month
			&& _day == x2._day;
	}

参数传入
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决noauth authentication required异常

今天在使用redis数据库的时候&#xff0c;突然给报了个这个错误&#xff0c;上网一查才知道是因为 Redis 服务器需要密码进行身份验证&#xff0c;因此&#xff0c;我们需要通过auth password 进行身份验证。不过我这个密码还是试了很多次才想起来的&#xff0c;哦好像是听网课…

2023.11.29 关于 MyBatis resultMap 和 多表查询

目录 resultType 和 resultMap 多表查询 resultType 和 resultMap 在 MyBatis 中二者被用于设置查询后所返回的数据类型 resultType 大多数情况下均可使用 resultType 进行设置返回数据类型 实例理解 下图为数据库中的一个 user 表&#xff0c;该 user 表包含四个字段 为了能…

7-1 哈夫曼树与哈夫曼编码

哈夫曼树与哈夫曼编码 题目描述输入格式输出格式输入样例输出样例 分数 30 作者 伍建全 单位 重庆科技学院 题目描述 哈夫曼树(Huffman Tree)又称最优二叉树&#xff0c;是一种带权路径长度最短的二叉树。所谓树的带权路径长度&#xff0c;就是树中所有的叶结点的权值乘上其到…

米贸搜|如何用Facebook为eBay实现引流?

要利用Facebook为eBay实现引流&#xff0c;可以尝试以下方法&#xff1a; 创建专页或社群&#xff1a;在Facebook上创建一个专页或社群&#xff0c;专注于你在eBay上销售的产品或相关主题。确保专页或社群的名称和描述清楚地表明与eBay有关。 定期发布内容&#xff1a;在Face…

MySQL数据库的安装

MySQL官网&#xff1a;https://www.mysql.com/ 进入下载页面&#xff1a;https://www.mysql.com/downloads/ 选择社区版&#xff1a; 选择MySQL Community Server&#xff1a; 根据自己的需要选择版本。例如选择8.2.0版本&#xff1a; 例如选择Windows (x86, 64-bit), M…

前端:实现二级菜单(点击实现二级菜单展开)

效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, i…

毕业设计单片机可以用万能板吗?

毕业设计单片机可以用万能板吗? 可以是可以&#xff0c;就是焊接起来比较麻烦&#xff0c;特别是有好几个重复连线点的时候&#xff0c;检测起来就不那么容易了&#xff0c;而且布线看起来乱糟糟的&#xff0c;如果后期一不小心把线弄断了&#xff0c;查起来就更麻烦了&#x…

深入了解Java8新特性-日期时间API之ZonedDateTime类

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概19000多字&#xff0c;预计阅读时间长需要10分钟以上。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&…

堆栈_删除字符串所有相邻重复项

//给出由小写字母组成的字符串 S&#xff0c;重复项删除操作会选择两个相邻且相同的字母&#xff0c;并删除它们。 // // 在 S 上反复执行重复项删除操作&#xff0c;直到无法继续删除。 // // 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 // // // // 示…

Java程序打包

File-Export,选择Java下的Runnable JAR file选项&#xff08;选择JAR file是不会运行的&#xff09;&#xff0c;next, 选择程序的入口类&#xff08;Launch configuration选项&#xff09;及导出位置&#xff0c;Finish即可。

人工智能驱动的医疗辅助:陪诊系统的技术原理与应用

随着人工智能技术的不断发展&#xff0c;医疗领域也迎来了新的可能性。本文将深入探讨陪诊系统的技术原理及其在医疗领域中的应用。我们将重点关注人工智能的核心概念&#xff0c;如自然语言处理、机器学习和语音识别&#xff0c;以解释陪诊系统是如何在医疗环境中发挥作用的。…

Vue的Nuxt项目部署在服务器,pm2动态部署和npm run build静态部署

Nuxt项目的部署有两种方式&#xff0c;一种是静态部署&#xff0c;一种是动态部署 静态部署需要关闭项目的ssr功能&#xff0c;动态部署则不需关闭&#xff0c;所以怎么部署项目就看你用不用ssr功能了 。 1.静态部署 先说静态部署&#xff0c;很简单&#xff0c;只需要在nuxt…

无限移动的风景 css3 动画

<style>*{margin:0;padding:0;/* box-sizing: border-box; */}ul{list-style: none;}#nav{width:900px;height:100px;border:2px solid rgb(70, 69, 69);margin:100px auto; overflow: hidden;}#nav ul{animation:moving 5s linear infinite;width:200%; /*怎么模拟动画…

量化误差的测量

因为转换的精度有限&#xff0c;所以将模拟值数字化时会不可避免地出现量化误差。量化误差由转换器及其误差、噪声和非线性度决定。当输入信号和计数器时基有区别时就会产生量化误差。根据输入信号的相位和计数器时基的匹配程度&#xff0c;计数器有下列三种可能性&#xff1a;…

嵌入式硬件电路设计

一、嵌入式硬件电路设计概述 随着物联网、人工智能技术的发展&#xff0c;我们的生活越来越智能化&#xff0c;信息化。智能手机&#xff0c;智能手环&#xff0c;智能锁&#xff0c;智能冰箱&#xff0c;自动驾驶&#xff0c;机器人等智能产品层出不穷&#xff0c;人类即将进入…

PSP - 解决 ESMFold 推理长序列蛋白质结构的显存溢出问题

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/134709211 使用 ESMFold 推理长序列 (Seq. Len. > 1500) 时&#xff0c;导致显存不足&#xff0c;需要设置 chunk_size 参数&#xff0c;实现长…

Vue大屏自适应终极解决方案

v-scale-screenv-scale-screen是一个大屏自适应组件&#xff0c;在实际业务中&#xff0c;我们常用图表来做数据统计&#xff0c;数据展示&#xff0c;数据可视化等比较直观的方式来达到一目了然的数据查看&#xff0c;但在大屏开发过程中&#xff0c;常会因为适配不同屏幕而感…

前端三大MV*模式:MVC、mvvm、mvp模式介绍

MVC&#xff08;同步通信为主&#xff09;&#xff1a;Model、View、Controller MVP(异步通信为主)&#xff1a;Model、View、Presenter MVVM(异步通信为主)&#xff1a;Model、View、ViewModel mvc模式介绍 MVC&#xff08;Model–View–Controller&#xff09;模式是软件…

C语言——编写程序,判断从键盘输入字符的类型(大写字母、小写字母、数字、其他四类)

#define _CRT_SECURE_NO_WARNINGS 1#include <ctype.h> #include <stdio.h> int main() { char c;printf("请输入一个字符: \n");scanf("%c",&c);if (isupper(c)) {printf("这是一个大写字母\n");} else if (islower(c)) {pr…

解决tomcat 启动 , 中文乱码问题

解决tomcat 启动 , 中文乱码问题. 第一步找到server.xml, 找到连接器, 添加 URIEncoding"UTF-8" 注意是英文的引号. 第二步, 找到 logging.properties , 在其中找到 第三步,启动服务, 观察现象,亲测有效.
最新文章