运算符重载

embedded/2024/9/24 13:15:15/

运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时做出不同的行为。

例如:学生类包括姓名,年龄,班级,成绩等,定义了两个学生变量,想比较它们的大 小,如何比较大小呢?

为“学生”类重载“>”符号,然后在这个方法里实现比较的意义:按年龄、按成绩或按姓名首字母比较等。

运算符重载的语法格式

重载的运算符是具有特殊名字的函数:它们的名字由关键字operator,后跟要重载的运算符。

简单例子

“+”运算符的重载

#include <iostream>
using namespace std;class A
{
private:int x, y;
public:A(int x1 = 0, int y1 = 0){x = x1;y = y1;}A operator+(const A& a)const//重载-运算符的实现{return A(x + a.x, y + a.y);//调用A类构造函数创建一个临时匿名对象作为函数返								回}void show(){cout << "x=" << x << "," << "y=" << y << endl;}
};
int main()
{A a1(1, 2);A a2(3, 4);A a;a = a1 + a2;a.show();
}

输出结果

const一般用在代码前面表示常量,只可读不可改,这里用在函数中表示常成员函数: 只读函数,只可读不可改数据成员的值。也就是时候const定义的函数里面的数据成员 的值不可改变

代码分析

在A类中重载了运算符+,该重载只对A类对象有效。

执行a=a1+a2;语句时,编译器检测到+号左边是一个A类对象(+号具有左结合性,所以 先检测左边),就会调用成员函数operator+(),也就是转换为下面的形式:

a=a1.operator+(a2);    //a1是要调用函数的对象,a2是函数的实参

可见:

重载运算符并没有改变其原来的功能,只是增加了对自定义数据类型的运算功能。

运算符重载的两种方式

1,重载为类的成员函数

a.双目运算符

如果是双目运算符重载为类的成员函数,则它有两个操作数:左操作数是对象本身 的数据,由this指针指出,右操作数则通过运算符重载函数的参数表来传递。

调用格式为:

左操作数.运算符重载函数(右操作数)

#include <iostream>
using namespace std;class A
{
private:int x, y;
public:A(int x1 = 0, int y1 = 0){x = x1;y = y1;}A operator+(const A& a)const{A t;t.x = this->x + a.x;t.y = this->y + a.y;return t;}void show(){cout << "x=" << x << "," << "y=" << y << endl;}
};
int main()
{A a1(1, 2);A a2(3, 4);A a;a = a1 + a2;a.show();
}
b.单目运算符

如果是单目运算符重载为类的成员函数,则要分为前置(++i)和后置(i++)运算符。

如果是前置运算符,则它的操作数是函数调用者,函数没有参数。

调用格式为:

操作数.运算符重载函数()

#include <iostream>
using namespace std;class A
{
private:int x, y;
public:A(int x1 = 0, int y1 = 0){x = x1;y = y1;}A operator++()//++i 前置++实现{++x;	//先自增++y;return *this;	//后引用}A operator++(int)	//i++ 后置++实现{//int参数没有任何意义,只是为了区分是前置还是后置形式A a = *this;	//保存对象引用++(*this);	//自增,调用前面实现的前置++return a;	//返回先前保存的对象}void show(){cout << "x=" << x << "," << "y=" << y << endl;}
};
int main()
{A a1(1, 2), a2(3, 4);(a1++).show();(++a2).show();return 0;
}

输出结果

实现前置“++”时,数据成员进行自增运算,然后返回当前对象(即this指针所指向的对象)。实现后置“++”时,创建了一个临时对象来保存当前对象的值,然后再将当前对象自增,最后返回的是保存了初始值的临时对象。

注意:前置单目运算符和后置单目运算符的最主要区别是函数的形参,后置单目运 算符带一个int型形参,但它只起区分作用。

2,重载为类的友元函数

运算符重载为类的友元函数,只是在函数前加一个friend关键字。


http://www.ppmy.cn/embedded/43068.html

相关文章

解决vue版本不一致导致不能正常编译

解决vue版本不一致导致不能正常编译 异常现象分析原因解决方案 异常现象 项目原本运行无异常&#xff0c;但安装了一个el-table-infinite-scroll的插件后&#xff0c;编译报错&#xff0c;截图如下 分析原因 vue版本与compile版本不一致&#xff0c;应该统一起来&#xff0…

海思3516部署yolov8检测算法精度问题排查

这是一篇纯技术文章 海思芯片介绍如何生成带RPN层的yolov8模型海思模型量化的精度问题8bit量化精度问题排查结语 海思芯片介绍 这边文章是写给需要在海思平台上部署目标检测模型的算法研究人员&#xff0c;前提条件是按照海思的官方文档跑通了目标检测的demo&#xff0c;才能看…

C#【进阶】反射

反射 文章目录 1、什么是程序集2、元数据3、反射的概念4、反射的作用5、语法相关1、Type1、获取Type2、获取类中的所有公共成员 MemberInfo3、获取类中的公共构造函数并调用 constructorinfo4、获取类中的公共成员变量 FieldInfo5、获取类中的公共成员方法 MethodInfo 2、Assem…

apache BeanUtils

一、populate 1、介绍 BeanUtils.populate(Object bean, Map properties) 方法实在org.apache.commons.beanutils.BeanUtils包下的一个一个方法。 该方法的方法头 此方法中&#xff0c;有两个参数&#xff0c;Object bean 为一个实体类&#xff0c;Map properties为一个map集…

Ollama + (Anythingllm / Open WebUI / MaxKB)搭建本地大模型

个人体验MaxKB做知识库效果最好 一、Ollama 1、下载Ollama 地址&#xff1a;Download Ollama on macOS curl -fsSL https://ollama.com/install.sh | sh 2、下载指定的模型 地址&#xff1a;library # Llama3 ollama run llama3:8b # 这个模型可以将文本内容转换成向量数…

如何在Mac上恢复未保存的Excel文件

您是否不小心关闭了 Excel&#xff0c;而没有将工作保存在 Mac 上&#xff1f;不要惊慌&#xff01;本指南概述了帮助您在 Mac 上恢复未保存的 Excel 文件的简单方法。 由于断电、系统崩溃或关闭它而不保存而意外丢失您的 Excel 文件可能会造成挫败感&#xff0c;因为您可能在…

spring-boot 3.2 + spring-boot-starter-quartz + HikariCP配置

第一步&#xff0c;添加 spring-boot-starter-quartz 的 maven 依赖。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> 第二步&#xff0c;在 ap…

Java开发实习面试复盘(亚信科技)

简单介绍一下自己 除了Java还学过其他语言吗&#xff0c;你最熟悉的是什么 简单介绍一下你做过的项目 说一下Spring、SpringMVC、Spring Boot之间有什么区别 Spring是一个开源容器框架&#xff0c;可以接管web层&#xff0c;业务层&#xff0c;dao层&#xff0c;持久层的组件…