C++ 中的运算符重载(三)

重载加法运算符+和减法运算符-,用于实现对象的加法和减法。加法运算符+和减法运算符-是两种常用的运算符,它们可以对两个操作数进行加法和减法运算,返回一个运算结果。但是,如果我们想要对自定义类型的数据进行加法和减法运算,例如类的对象,那么我们就需要重载加法运算符+和减法运算符-,以便实现对象的加法和减法,即将两个对象的对应成员变量进行加法或减法运算,返回一个新的对象。这样,我们就可以实现对象的组合和分解,提高代码的灵活性和可扩展性。例如,我们可以定义一个Vector 类来表示二维平面上的向量,然后重载加法运算符+和减法运算符-,用于实现向量的加法和减法。代码如下:

// 定义Vector 类
class Vector {
public:// 构造函数,用于初始化向量对象Vector(double x = 0, double y = 0) {this->x = x;this->y = y;}// 重载加法运算符,用于实现向量的加法Vector operator+(const Vector& v) {// 返回一个新的向量对象,其横坐标和纵坐标分别为两个向量的横坐标和纵坐标之和return Vector(this->x + v.x, this->y + v.y);}// 重载减法运算符,用于实现向量的减法Vector operator-(const Vector& v) {// 返回一个新的向量对象,其横坐标和纵坐标分别为两个向量的横坐标和纵坐标之差return Vector(this->x - v.x, this->y - v.y);}// 声明友元函数,用于输出向量对象friend std::ostream& operator<<(std::ostream& out, const Vector& v);
private:// 私有成员变量,用于存储向量的横坐标和纵坐标double x;double y;
};// 定义友元函数,用于输出向量对象
std::ostream& operator<<(std::ostream& out, const Vector& v) {// 输出向量的横坐标和纵坐标,用尖括号和逗号分隔out << "<" << v.x << ", " << v.y << ">";// 返回输出流对象,以便进行连续输出return out;
}// 主函数,用于测试
int main() {// 创建两个向量对象Vector v1(1.0, 2.0);Vector v2(3.0, 4.0);// 使用加法运算符对两个向量进行加法运算,并输出结果std::cout << v1 + v2 << std::endl; // 输出结果为:<4, 6>// 使用减法运算符对两个向量进行减法运算,并输出结果std::cout << v1 - v2 << std::endl; // 输出结果为:<-2, -2>return 0;
}

从上面的代码可以看出,重载加法运算符+和减法运算符-可以让我们对向量对象进行加法和减法运算,就像对内置类型的数据进行加法和减法运算一样。这样,我们就可以实现向量对象的组合和分解,提高代码的灵活性和可扩展性。

载乘法运算符*和除法运算符/,用于实现对象的乘法和除法。乘法运算符*和除法运算符/是两种常用的运算符,它们可以对两个操作数进行乘法和除法运算,返回一个运算结果。但是,如果我们想要对自定义类型的数据进行乘法和除法运算,例如类的对象,那么我们就需要重载乘法运算符*和除法运算符/,以便实现对象的乘法和除法,即将两个对象的对应成员变量进行乘法或除法运算,返回一个新的对象。这样,我们就可以实现对象的放大和缩小,提高代码的灵活性和可扩展性。例如,我们可以定义一个Fraction 类来表示分数,然后重载乘法运算符*和除法运算符/,用于实现分数的乘法和除法。代码如下:

// 定义Fraction 类
class Fraction {
public:// 构造函数,用于初始化分数对象Fraction(int numerator = 0, int denominator = 1) {// 如果分母为零,就抛出一个异常,否则就初始化分子和分母if (denominator == 0) {throw std::invalid_argument("Denominator cannot be zero");} else {this->numerator = numerator;this->denominator = denominator;}}// 重载乘法运算符,用于实现分数的乘法Fraction operator*(const Fraction& f) {// 返回一个新的分数对象,其分子和分母分别为两个分数的分子和分母的乘积return Fraction(this->numerator * f.numerator, this->denominator * f.denominator);}// 重载除法运算符,用于实现分数的除法Fraction operator/(const Fraction& f) {// 如果右操作数的分子为零,就抛出一个异常,否则就返回一个新的分数对象,其分子和分母分别为左操作数的分子乘以右操作数的分母,和左操作数的分母乘以右操作数的分子if (f.numerator == 0) {throw std::invalid_argument("Cannot divide by zero");} else {return Fraction(this->numerator * f.denominator, this->denominator * f.numerator);}}// 声明友元函数,用于输出分数对象friend std::ostream& operator<<(std::ostream& out, const Fraction& f);
private:// 私有成员变量,用于存储分数的分子和分母int numerator;int denominator;
};// 定义友元函数,用于输出分数对象
std::ostream& operator<<(std::ostream& out, const Fraction& f) {// 输出分数的分子和分母,用斜杠分隔out << f.numerator << "/" << f.denominator;// 返回输出流对象,以便进行连续输出return out;
}// 主函数,用于测试
int main() {// 创建两个分数对象Fraction f1(1, 2);Fraction f2(3, 4);// 使用乘法运算符对两个分数进行乘法运算,并输出结果std::cout << f1 * f2 << std::endl; // 输出结果为:3/8// 使用除法运算符对两个分数进行除法运算,并输出结果std::cout << f1 / f2 << std::endl; // 输出结果为:4/6return 0;
}

从上面的代码可以看出,重载乘法运算符*和除法运算符/可以让我们对分数对象进行乘法和除法运算,就像对内置类型的数据进行乘法和除法运算一样。这样,我们就可以实现分数对象的放大和缩小,提高代码的灵活性和可扩展性。

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

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

相关文章

Threejs项目实战之一:汽车外观换肤效果三维展示

目录 最终效果1 创建项目2 安装插件3 编写代码3.1 准备工作3.2 代码编写3.2.1 在template标签中构建html页面3.2.2 在style标签中构建页面样式文件3.2.3 在script标签中编写js代码 最终效果 先看下最终实现的效果 接下来&#xff0c;我们就从创建项目开始&#xff0c;一步一步…

RDMA编程实例rdma_cm API

RDMA编程基础 存储大师班 | RDMA简介与编程基础 -https://zhuanlan.zhihu.com/p/387549948 1. RDMA的学习环境搭建 RDMA需要专门的RDMA网卡或者InfiniBand卡才能使用&#xff0c;学习RDMA而又没有这些硬件设备&#xff0c;可以使用一个软件RDMA模拟环境&#xff0c;softiwarp …

【软考】局部性原理

目录 一、说明二、类型2.1 时间局部性2.2 空间局限性2.3顺序局部性 一、说明 1.局部性原理是指CPU访问存储器时&#xff0c;无论是存取指令还是存取数据&#xff0c;所访问的存储单元都趋于聚集在一个较小的连续区域中。 二、类型 2.1 时间局部性 1.Temporal Locality 2.如果…

自主并不等于智能

自主不等于智能&#xff0c;也不是自动化的简单升级。自主性和智能性是两个不同的概念。自主性指物体或系统具有独立决策和行动的能力&#xff0c;不需要人为干预。而智能性指物体或系统具有类似人类的智慧、学习和适应能力。 虽然自主性通常与智能性相关&#xff0c;但并非所有…

李宏毅bert记录

一、自监督学习&#xff08;Self-supervised Learning&#xff09; 在监督学习中&#xff0c;模型的输入为x&#xff0c;若期望输出是y&#xff0c;则在训练的时候需要给模型的期望输出y以判断其误差——有输入和输出标签才能训练监督学习的模型。 自监督学习在没有标注的训练…

【后端】JVM 远程调试

前言 再好的代码,也还是有瑕疵的,不是代码不给力,是线上问题太牛逼太玄幻。这不刚部署就出现了问题,幸好还是测试的时候,早点发现早点解决,不给任何人带来不必要的损失,是我做人的原则,只要钱到位,任何问题都不是问题。 JVM 远程调试 不得不说 IDEA 和 宝塔配合是真…

工厂方法设计模式项目实践

前言 以采集数据处理逻辑为例&#xff0c;数据采集分为不同种类如&#xff1a;MQTT、MODBUS、HTTP等&#xff0c;不同的采集数据有不同的解析处理逻辑。但总体解析处理步骤是固定的。可以使用工厂方法设计模式简化代码&#xff0c;让代码变得更加优雅。 代码实战 抽象类 总体…

gpt3、gpt2与gpt1区别

参考&#xff1a;深度学习&#xff1a;GPT1、GPT2、GPT-3_HanZee的博客-CSDN博客 Zero-shot Learning / One-shot Learning-CSDN博客 Zero-shot&#xff08;零次学习&#xff09;简介-CSDN博客 GPT-2 模型由多层单向transformer的解码器部分构成&#xff0c;本质上是自回归模型…

10_企业架构NOSQL数据库之MongoDB

企业架构NOSQL数据库之MongoDB 学习目标和内容 1、能够简单描述MongoDB的使用特点 2、能够安装配置启动MongoDB 3、能够使用命令行客户端简单操作MongoDB 4、能够实现基本的数据操作 5、能够实现MongoDB基本安全设置 6、能够操作安装php的MongoDB扩展 一、背景描述及其方案设计…

Vue实战(十):对数组数据的拆分和分组合并

Vue实战&#xff08;十&#xff09;&#xff1a;对数组数据的拆分和分组合并 数据初始化 //第一种情况 tableData: [{ id: 1, name: ["A", "B"] },{ id: 2, name: ["A", "C"] },{ id: 3, name: ["B", "C"] },{ …

配置阿里云CLI-aliyun命令与安装ossutil

1.aliyun命令官网文档 可以参考文档配置不同账户凭证 https://help.aliyun.com/document_detail/121259.html?spma2c4g.121193.0.i1 使用阿里云 CLI可以参考 https://help.aliyun.com/document_detail/110289.html?spma2c4g.121259.0.0.5ad27f08HvO1dw1&#xff09;账号添加…

springcloud alibaba-Sentinel

文章目录 一.前置知识1.雪崩问题2.服务保护技术对比 二.Sentinel三.微服务整合Sentinel1.限流规则1.流控模式2.流控效果热点参数限流(更细粒度的限流方式) 2.隔离和降级Feign整合Sentinel1.线程隔离2.熔断降级 3.授权规则4.规则持久化 一.前置知识 1.雪崩问题 设想一下以下场…

【C语言】用户空间使用非缓存内存

在用户空间使用非缓存内存通常不是标准做法&#xff0c;因为非缓存内存的操作与硬件平台紧密相关&#xff0c;并且通常被保留给内核模块或设备驱动程序使用。 一、方法 用户空间程序一般不直接处理非缓存内存问题&#xff0c;因为它们依赖于操作系统来管理内存缓存一致性。尽…

AIGC: 关于ChatGPT中基于Whisper模型实现音频转文本

概述 到目前&#xff0c;GPT只能去接收文本的输入&#xff0c;但是在现实的生活当中&#xff0c;会有语音的需求GPT也有相关的能力接入&#xff0c;我们就需要一个能够将语音内容转换成文本的能力 当然其他第三方的软件或者接口也是支持这个功能在 Open AI 有一个语音转文本的…

【五分钟】熟悉np.all()和np.any()的常见用法(干货!!!)

常见使用场景举例 判断numpy数组中是否【全是】非0元素 # 判断数组中是否全是非0元素 a np.array([1, 2, 3, 4]) b np.array([0, 1, 2, 3]) c np.array([np.nan, 1, 2, 3]) # nan --> Not a Number ---> 算非0元素 d np.array([np.inf, 1, 2, 3]) # np.inf -->…

C++使用策略模式,减少使用switch...case...

目录 原理函数类模板函数使用switch...case...不使用switch...case... 知识点decltypestd::remove_reference 原理 函数 #include <iostream> #include <functional> #include <map>void fun1(int a, int b) {std::cout << "fun1 : a "<…

鸿蒙Harmony ArkUI十大开源项目

一 OH哔哩 https://gitee.com/ohos_port/ohbili 项目简介 【OH哔哩】是一款基于OpenHarmony系统ArkUI框架开发的哔哩哔哩动画第三方客户端 用到的三方库 bilibili-API-collect 哔哩哔哩-API收集整理ohos_ijkplayer 基于FFmpeg的视频播放器PullToRefresh 下拉刷新、上拉加载组件…

html css样式选择器介绍

目录 一、单标签选择器二、多标签选择器三、类选择器四、标签结合类选择器五、多个标签结合类选择器六、子标签选择器七、所有子标签选择器八、相邻选择器九、多种选择器混合使用十、超链接样式选择器 一、单标签选择器 下面的 css 会将所有 h1 标签里的文字设置为红色 <!…

【FPGA图像处理实战】- 图像处理前景如何?就业前景如何?

图像处理是FPGA应用的主要领域之一&#xff0c;图像处理数据量特别大且对实时性处理要求高的场景&#xff0c;这恰好能发挥FPGA流水线可实时处理的优势。 那么FPGA图像处理的前景如何&#xff1f; 一、FPGA开发&#xff08;图像处理&#xff09;招聘就业情况 看FPGA图像处理…

c++ memset

memset 函数是 C/C 中的一个函数&#xff0c;用于将一块内存的内容设置为指定的值。在 C 中&#xff0c;你可以使用 #include 头文件来包含 memset 函数的声明。 以下是 memset 函数的基本语法&#xff1a; cpp #include void *memset(void *ptr, int value, size_t num); …