C++ 操作符重载Operator

news2025/4/22 15:19:54

C++可以重载大多数操作符,如算术运算符+号,-号。

位操作符<<,>>

下标符号[]等都可以重载。

重载的意思,是让这些符号,按你定义的行为来执行代码,但是这种自定义,是有限制的,必须有一个自定义类(结构体等也行)参与其中。

比如,int a,int b;然后a+b,这种情况的+号是不能重载的。

所以通常的用法是,编写一个类,然后重载操作符,比如:

#include <iostream>

using namespace std;

class myInt {
public:
	int value;
	int operator+(int num) {
		return value + num;
	}
};

int main()
{
	myInt a;
	a.value = 5;

	int res = a + 18;

	cout << res << endl;
}

输出结果:

结果为23,可见重载执行正常,否则类对象是不支持+号运算的。 

在类中可以看到这这个代码:

	int operator+(int num) {
		return value + num;
	}

 operator+表示重载+号运算符, 最前面的int开头,是表示返回值类型,参数(int num),表示+号右侧类型。

那么像这种在类里面通过成员函数的方式重载的,默认左侧为此类的对象参数。

也就是说int res = a + 18; +号左侧a为myInt对象,右侧为int类型,触发重载,调用重载函数中的代码。

如果我重载了+号,那么在程序中,+号是随处可见的,那么这种情况下,不会引起混乱吗?

其实,你可以把这种重载相当于你自定义了一个另类函数。

那么道理跟函数重载一样,你调用同名函数,为什么不会引起混乱,那是因为有参数类型限制。

确保调用到指定的函数。

操作符重载也是一样,有类型限制的,你调用的是哪个类对象的+号,它就会执行相应的这个类对应的重载代码。

那么我们可以推测,int res=a+18,那么如果int在左侧,myInt在右侧。即int res=18+a;

是不合法的,没有与之匹配的重载,所以这里有着严格的要求,包括+号是二元操作符,只能有左右两个参数,你不能像这样int operator+(int num,int num1) 去定义它。

如果我要实现int res=18+a该怎么做?

重载必须定义为全局或者友元函数才可实现,因为如果是成员函数的话,是要求操作符左侧必须为类对象本身。

而全局和友元则可灵活的指定顺序,如:

全局函数重载方式:

// 全局函数:支持 int + myInt
int operator+(int num,  myInt m) {
	return num + m.value;
}

注意将函数代码放在类定义后面,否则认不到myInt类型,没有声明的话。

这样,就会支持18+a的重载,可以看到有两个参数,因为不是成员函数,所以需要显式指定两个参数,int num为左侧类型,myInt m为右侧类型,这样当int res=18+a,符合全局函数重载描述,即根据参数类型调用指定的重载。执行全局函数的代码。

当然上面只是示例说明,一般我们建议写成友元函数,像这样:


#include <iostream>

using namespace std;

class myInt {
public:
	int value;
	int operator+(int num) {
		return value + num;
	}

	// 友元函数:int + myInt
	friend int operator+(int num, myInt m)
	{
		return num + m.value;
	}
		
};

int main()
{
	myInt a;
	a.value = 5;

	int res = 18 + a;

	cout << res << endl;
}

 结果:

下标操作符重载

接下来我们来重载[]这个操作符,巩固一下我们的学习成果,[]也是一个二元操作符,它的左侧是类对象,右侧是索引。知道了这个,我们就好重载了,如下:

#include <iostream>

using namespace std;

class myInt {
public:
	int a;
	int b;

	int operator[](int index) {
		if (index == 0) return a;
		if (index == 1)  return b;
		else return 0;

	}


};

int main()
{
	myInt mya;
	mya.a = 10;
	mya.b = 100;

	cout << mya[0] << endl;
	cout << mya[1] << endl;

}

结果:

 

关键语句:

	int operator[](int index) {
		if (index == 0) return a;
		if (index == 1)  return b;
		else return 0;

	}

重载[]操作符,如果索引为0,返回a,为1返回b。

运行结果是10和100,说明执行正常。

但这里,只是读取值,一般像[]这种用法,除了读取值,还需要写入值。

而我这里并没有这样的功能,那要怎么实现呢?

 我们需要返回的值,不是按值传递,而是类似于指针的形式,比如mya[0]返回的是个指针:

#include <iostream>

using namespace std;

class myInt {
public:
	int a;
	int b;

	int * operator[](int index) {
		if (index == 0) return &a;
		if (index == 1)  return &b;
		
	}
};

int main()
{
	myInt mya;
	mya.a = 10;
	mya.b = 100;

	*(mya[0]) = 1000;
	cout << *(mya[0]) << endl;
	cout << *(mya[1]) << endl;

}

结果:

可以正常赋值和取值,但是这种实现,使用起来需要加上*操作符,会变得很奇怪。

所以最好的方法是,通过&这个引用操作符, 返回类型为int &,给变量取别名的方式,如下:

#include <iostream>

using namespace std;

class myInt {
public:
	int a;
	int b;

	int & operator[](int index) {
		if (index == 0) return a;
		if (index == 1)  return b;
		
	}
};

int main()
{
	myInt mya;
	mya.a = 10;
	mya.b = 100;

	mya[0] = 1000;
	cout << mya[0]<< endl;
	cout << mya[1]<< endl;

}

结果输出1000和100,正常,这样看起来就顺眼多了。 

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

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

相关文章

Docker 镜像、容器和 Docker Compose的区别

前言&#xff1a;Docker 的镜像、容器和 Docker Compose 是容器化技术的核心组件&#xff0c;以下是对它们的详细解析及使用场景说明。 ​​1、Docker 镜像&#xff08;Image&#xff09;​​ ​​定义​​&#xff1a; 镜像是只读模板&#xff0c;包含运行应用程序所需的代码、…

Linux深度探索:进程管理与系统架构

1.冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是由⼀个个的硬件组件组成。 输入设备&#xff1a;键盘&#xff0c;鼠标…

一段式端到端自动驾驶:VAD:Vectorized Scene Representation for Efficient Autonomous Driving

论文地址&#xff1a;https://github.com/hustvl/VAD 代码地址&#xff1a;https://arxiv.org/pdf/2303.12077 1. 摘要 自动驾驶需要对周围环境进行全面理解&#xff0c;以实现可靠的轨迹规划。以往的方法依赖于密集的栅格化场景表示&#xff08;如&#xff1a;占据图、语义…

4月21日星期一今日早报简报微语报早读

4月21日星期一&#xff0c;农历三月廿四&#xff0c;早报#微语早读。 1、女子伸腿阻止列车关门等待同行人员&#xff0c;被深圳铁路警方行政拘留&#xff1b; 2、北理工再通报&#xff1a;开除宫某党籍&#xff0c;免去行政职务&#xff0c;解除聘用关系&#xff1b; 3、澳门…

Kubeflow 快速入门实战(二) - Pipelines / Katib / KServer

承接前文博客 Kubeflow 快速入门实战(一) Kubeflow 快速入门实战(一) - 简介 / Notebooks-CSDN博客文章浏览阅读441次&#xff0c;点赞19次&#xff0c;收藏6次。本文主要介绍了 Kubeflow 的主要功能和能力&#xff0c;适用场景&#xff0c;基本用法。以及Notebook&#xff0c…

【JavaEE初阶】多线程重点知识以及常考的面试题-多线程进阶(一)

本篇博客给大家带来的是多线程中常见的所策略和CAS知识点. &#x1f40e;文章专栏: JavaEE初阶 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅&#x1f680; 要开心要快…

SAP系统生产跟踪报表入库数异常

生产跟踪报表入库数异常 交库21820,入库43588是不可能的 原因排查: 报表的入库数取值,是取移动类型321 (即系检验合格后过账到非限制使用)的数. 查凭证,101过账2次21807,321过账了2次21794,然后用102退1次21794.就是说这批物料重复交库了. 解决&#xff1a; 方案一:开发增强设…

Kubernetes控制平面组件:调度器Scheduler(一)

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…

08-DevOps-向Harbor上传自定义镜像

harbor创建完成&#xff0c;往harbor镜像仓库中上传自定义的镜像&#xff0c;包括新建项目、docker配置镜像地址、镜像重命名、登录harbor、推送镜像这几个步骤&#xff0c;具体操作如下&#xff1a; harbor中新建项目 访问级别公开&#xff0c;代表任何人都可以拉取仓库中的镜…

极验4滑块笔记:整理思路--填坑各种问题

最近在研究某验4逆向分析&#xff0c;以前没弄过这种&#xff0c;所以爬了很多坑&#xff0c;就是把分享给大家~ 1.这个gcaptcha4.js需要逆向&#xff0c;我的方法很笨就是将_ᕶᕴᕹᕶ()这个蝌蚪文打印处来&#xff0c;全局替换一下&#xff0c;然后Unicode这种代码&#xff0…

LX3-初识是单片机

初识单片机 一 什么是单片机 单片机:单片微型计算机单片机的组成:CPU,RAM(内存),flash(硬盘),总线,时钟,外设…… 二 Coretex-M系列介绍 了解ARM公司与ST公司ARM内核系列: A 高性能应用,如手机,电脑…R 实时性强,如汽车电子,军工…M 超低功耗,如消费电子,家电,医疗器械 三…

2025年渗透测试面试题总结-拷打题库10(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 2025年渗透测试面试题总结-拷打题库10 1. CSRF成因及防御措施 | 非Token防御 2. XSS Worm原理 3. Co…

Linux系统下docker 安装 MySQL

踩坑解决&#xff1a; 1、docker安装mysql&#xff0c;不需要执行search 2、pull时&#xff0c;需要指定版本号 3、连接Navicat需要看阿里云端口号是否开启 在拉取镜像的时候&#xff0c;如果不使用代理服务器&#xff0c;docker search mysql不需要执行 本人在未使用代理服…

Web开发:ABP框架10——使用数据库存储文件,完成文件的下载和上传

一、简要介绍 字节数组&#xff1a;字节数组是存储数据的字节序列&#xff0c;常用于二进制数据&#xff08;如图片、音视频、文档等&#xff09;的表示。 文件和字节的关系&#xff1a;文件是由字节构成&#xff0c;字节是文件内容的基本单位。 文件以字节形式存储在服务器数…

NestJS-Knife4j

文章目录 前言✅ 一、什么是 Knife4j&#xff1f;✅ 二、Knife4j 与 Swagger 对比✅ 三、NestJS-Knife4j 集成1. 安装依赖2. 配置 Swagger 与 Knife4j3. 启动应用并访问接口文档 ✅ 四、功能增强1. **接口分组**2. **请求/响应示例**3. **接口文档的美化** ✅ 五、总结 前言 N…

【项目管理】成本类计算 笔记

项目管理-相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 &#xff08;一&#xff09;知识总览 项目管理知识域 知识点&#xff1a; &#xff08;项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域&#xff09; 对应&…

基于MuJoCo物理引擎的机器人学习仿真框架robosuite

Robosuite 基于 MuJoCo 物理引擎&#xff0c;能支持多种机器人模型&#xff0c;提供丰富多样的任务场景&#xff0c;像基础的抓取、推物&#xff0c;精细的开门、拧瓶盖等操作。它可灵活配置多种传感器&#xff0c;提供本体、视觉、力 / 触觉等感知数据。因其对强化学习友好&am…

13.编码器的结构

从入门AI到手写Transformer-13.编码器的结构 13.编码器的结构代码 整理自视频 老袁不说话 。 13.编码器的结构 T r a n s f o r m e r E n c o d e r : 输入 [ b , n ] TransformerEncoder:输入[b,n] TransformerEncoder:输入[b,n] E m b e d d i n g : − > [ b , n , d ]…

[原理分析]安卓15系统大升级:Doze打盹模式提速50%,续航大幅增强,省电提升率5%

技术原理:借鉴中国友商思路缩短进入Doze的时序 开发者米沙尔・拉赫曼(Mishaal Rahman)在其博文中透露&#xff0c;谷歌对安卓15系统进行了显著优化&#xff0c;使得设备进入“打盹模式”(Doze Mode)的速度提升了50%&#xff0c;并且部分机型的待机时间因此得以延长三小时。设备…

cdp-(Chrome DevTools Protocol) browserscan检测原理逆向分析

https://www.browserscan.net/zh/bot-detection 首先,打开devtools后访问网址,检测结果网页显示红色Robot,标签插入位置,确定断点位置可以hook该方法,也可以使用插件等方式找到这个位置,本篇不讨论. Robot标签是通过insertBefore插入的. 再往上追栈可以发现一个32长度数组,里面…