C++类的运算符重载

news2024/12/13 10:25:58

目标

让自定义的类直接使用运算符运算

代码

头文件及类定义

#include <iostream>

using namespace std;
class Complex
{
    int rel;
    int vir;
public:
    void show()
    {
        cout <<"("<<this->rel<<","<<this->vir<<"i"<<")"<<endl;
    }
    Complex(int rel,int vir):rel(rel),vir(vir){}
    Complex(){}
    Complex operator+(const Complex other);
    Complex operator-(const Complex other);
    Complex operator/(const Complex other);
    Complex operator*(const Complex other);
    Complex operator%(const Complex other);
    bool operator==(const Complex other);
    bool operator>(const Complex other);
    bool operator<(const Complex other);
    bool operator&&(const Complex other);
    bool operator||(const Complex other);
    bool operator!();
    Complex operator++();
    Complex operator--();
    friend Complex operator++(Complex &c1,int);
    friend Complex operator--(Complex &c1,int);

};

自增自减运算符

//后自增
Complex operator++(Complex &c1,int)
{
    Complex temp;
    temp.rel=(c1.rel)++;
    temp.vir=(c1.vir)++;
    cout <<"("<<temp.rel<<","<<temp.vir<<"i"<<")"<<endl;
    return temp;
}
//后自减
Complex operator--(Complex &c1,int)
{
    Complex temp;
    temp.rel=c1.rel--;
    temp.vir=(c1.vir)--;
    cout <<"("<<temp.rel<<","<<temp.vir<<"i"<<")"<<endl;
    return temp;
}
//前自增
Complex Complex::operator++()
{
    Complex temp;
    temp.rel=++(this->rel);
    temp.vir=++(this->vir);
    cout <<"("<<temp.rel<<","<<temp.vir<<"i"<<")"<<endl;
    return temp;
}
//前自减
Complex Complex::operator--()
{
    Complex temp;
    temp.rel=--(this->rel);
    temp.vir=--(this->vir);
    cout <<"("<<temp.rel<<","<<temp.vir<<"i"<<")"<<endl;
    return temp;
}

逻辑判断运算符

//等于判断
bool Complex::operator==(const Complex other)
{

    cout<<"("<<this->rel<<","<<this->vir<<"i"<<")"<<"=="<<"("<<other.rel<<","<<other.vir<<"i"<<")";
    cout<<boolalpha<<((this->rel==other.rel)&&(this->vir==other.vir))<<endl;
    return (this->rel==other.rel)&&(this->vir==other.vir);
}
//大于判断
bool Complex::operator>(const Complex other)
{
    cout<<"("<<this->rel<<","<<this->vir<<"i"<<")"<<">"<<"("<<other.rel<<","<<other.vir<<"i"<<")";
    cout<<boolalpha<<((this->rel>other.rel)&&(this->vir>other.vir))<<endl;
    return (this->rel>other.rel)&&(this->vir>other.vir);
}

//小于判断
bool Complex::operator<(const Complex other)
{
    cout<<"("<<this->rel<<","<<this->vir<<"i"<<")"<<"<"<<"("<<other.rel<<","<<other.vir<<"i"<<")";
    cout<<boolalpha<<((this->rel<other.rel)&&(this->vir<other.vir))<<endl;
    return (this->rel<other.rel)&&(this->vir<other.vir);
}

逻辑与或非

//逻辑与
bool Complex::operator&&(const Complex other)
{
    cout<<"("<<this->rel<<","<<this->vir<<"i"<<")"<<"&&"<<"("<<other.rel<<","<<other.vir<<"i"<<")";
    cout<<boolalpha<<((this->rel||this->vir)&&(other.rel||other.vir))<<endl;
    return (this->rel||this->vir)&&(other.rel||other.vir);
}
//逻辑或
bool Complex::operator||(const Complex other)
{
    cout<<"("<<this->rel<<","<<this->vir<<"i"<<")"<<"||"<<"("<<other.rel<<","<<other.vir<<"i"<<")";
    cout<<boolalpha<<((this->rel||this->vir)||(other.rel||other.vir))<<endl;
    return (this->rel||this->vir)||(other.rel||other.vir);
}
//逻辑非
bool Complex::operator!()
{
    cout <<"!"<<"("<<this->rel<<","<<this->vir<<"i"<<")"<<":";
    cout<<noboolalpha<<(!(this->rel||this->vir))<<endl;
    return !(this->rel||this->vir);
}

算术运算符

//成员函数版本的加法运算符重载
Complex Complex::operator+(const Complex other)
{
    Complex temp;
    temp.rel =  this->rel+other.rel;
    temp.vir = this->vir+other.vir;
    cout<<"("<<this->rel<<","<<this->vir<<"i"<<")"<<"+"<<"("<<other.rel<<","<<other.vir<<"i"<<")";
    cout <<"="<<"("<<temp.rel<<","<<temp.vir<<"i"<<")"<<endl;
    return temp;
}
//成员函数版本的减法运算符重载
Complex Complex::operator-(const Complex other)
{
    Complex temp;
    temp.rel = this->rel-other.rel;
    temp.vir = this->vir-other.vir;
    cout<<"("<<this->rel<<","<<this->vir<<"i"<<")"<<"-"<<"("<<other.rel<<","<<other.vir<<"i"<<")";
    cout <<"="<<"("<<temp.rel<<","<<temp.vir<<"i"<<")"<<endl;
    return temp;
}
//成员函数版本的除法运算符重载
Complex Complex::operator/(const Complex other)
{
    Complex temp;
    temp.rel = this->rel/other.rel;
    temp.vir = this->vir/other.vir;
    cout<<"("<<this->rel<<","<<this->vir<<"i"<<")"<<"/"<<"("<<other.rel<<","<<other.vir<<"i"<<")";
    cout <<"="<<"("<<temp.rel<<","<<temp.vir<<"i"<<")"<<endl;
    return temp;
}
//成员函数版本的乘法运算符重载
Complex Complex::operator*(const Complex other)
{
    Complex temp;
    temp.rel = this->rel*other.rel;
    temp.vir = this->vir*other.vir;
    cout<<"("<<this->rel<<","<<this->vir<<"i"<<")"<<"*"<<"("<<other.rel<<","<<other.vir<<"i"<<")";
    cout <<"="<<"("<<temp.rel<<","<<temp.vir<<"i"<<")"<<endl;
    return temp;
}
//成员函数版本的除余运算符重载
Complex Complex::operator%(const Complex other)
{
    Complex temp;
    temp.rel = this->rel%other.rel;
    temp.vir = this->vir%other.vir;
    cout<<"("<<this->rel<<","<<this->vir<<"i"<<")"<<"%"<<"("<<other.rel<<","<<other.vir<<"i"<<")";
    cout <<"="<<"("<<temp.rel<<","<<temp.vir<<"i"<<")"<<endl;
    return temp;
}

主函数

int main()
{
    Complex c1(9,25);
    Complex c2(3,5);
    c1.operator+(c2);
    c1.operator-(c2);
    c1.operator*(c2);
    c1.operator/(c2);
    c1.operator%(c2);
    c1.operator==(c2);
    c1.operator<(c2);
    c1.operator>(c2);
    c1.operator&&(c2);
    c1.operator||(c2);
    !(c1);
    ++(c1);
    --(c1);
    (c1)++;
    (c1)--;
    c1.show();
    return 0;
}

实现效果

知识点思维导图

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

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

相关文章

SQL注入--Sqlmap使用

一.GET型注入 介绍&#xff1a;注入点在URL里的称之为GET型注入。 单目标 sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id1" sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id1&page10" -p page sqlmap.py -u "http://127.0.0.1/sqli/Less-…

前端编辑器JSON HTML等,vue2-ace-editor,vue3-ace-editor

与框架无关 vue2-ace-editor有问题&#xff0c;ace拿不到&#xff08;brace&#xff09; 一些组件都是基于ace-builds或者brace包装的 不如直接用下面的&#xff0c;不如直接使用下面的 <template><div ref"editor" class"json-editor"><…

知行之桥EDI系统V2024 12月9111版本更新

知行之桥EDI系统V2024于12月推出版本更新&#xff08;版本号&#xff1a;9111&#xff09;&#xff0c;在原有产品的基础上进行了一系列的新增、更改和修复&#xff0c;以确保 EDI 和 MFT 集成尽可能的简单化。 主要特性 新增 新增EDI 交易伙伴管理控制台 交易伙伴管理控制台…

nmap详解

Nmap&#xff08;Network Mapper&#xff09;是一个开放源代码的网络探测和安全审核的工具。由于它的功能强大&#xff0c;被广泛应用于网络安全领域。以下是Nmap的一些主要功能及其在实战中的应用举例。 Nmap的主要功能&#xff1a; 端口扫描&#xff1a;检测目标主机上开放…

HarmonyOS 5.0应用开发——属性动画

【高心星出品】 文章目录 属性动画animateTo属性动画animation属性动画 属性动画 属性接口&#xff08;以下简称属性&#xff09;包含尺寸属性、布局属性、位置属性等多种类型&#xff0c;用于控制组件的行为。针对当前界面上的组件&#xff0c;其部分属性&#xff08;如位置属…

求解自洽场方程

Let’s break down the problem and the solving process step-by-step. Problem Overview The problem appears to be related to linear algebra and possibly quantum mechanics (given the mention of “eigenvalues” and “Hamiltonian” in the Chinese text). We hav…

yarn 安装问题

Couldn’t find package “regenerator-runtime” on the “npm” registry. Error: Couldn’t find package “watch-size” on the “npm” regist 标题Error: Couldn’t find package “babel-helper-vue-jsx-merge-props” on the “npm” registry. Error: Couldn’t f…

Edge SCDN的独特优势有哪些?

强大的边缘计算能力 Edge SCDN&#xff08;边缘安全加速&#xff09;是酷盾安全推出的边缘集分布式 DDoS 防护、CC 防护、WAF 防护、BOT 行为分析为一体的安全加速解决方案。通过边缘缓存技术&#xff0c;智能调度使用户就近获取所需内容&#xff0c;为用户提供稳定快速的访问…

360极速浏览器不支持看PDF

360安全浏览器采用的是基于IE内核和Chrome内核的双核浏览器。360极速浏览器是源自Chromium开源项目的浏览器&#xff0c;不但完美融合了IE内核引擎&#xff0c;而且实现了双核引擎的无缝切换。因此在速度上&#xff0c;360极速浏览器的极速体验感更佳。 展示自己的时候要在有优…

神经网络权重矩阵初始化:策略与影响

文章目录 一、权重矩阵初始化&#xff1a;神经网络训练的关键起点&#xff08;一&#xff09;初始化的重要性及随机特性&#xff08;二&#xff09;不同初始化方法的探索历程零初始化&#xff1a;简单却致命的选择&#xff08;仅适用于单层网络&#xff09;标准初始化&#xff…

【算法day13】二叉树:递归与回溯

题目引用 找树左下角的值路径总和从中序与后序遍历构造二叉树 今天就简简单单三道题吧~ 1. 找到树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1 我们…

OpenCV实验:图片加水印

第二篇&#xff1a;图片添加水印&#xff08;加 logo&#xff09; 1. 实验原理 水印原理&#xff1a; 图片添加水印是图像叠加的一种应用&#xff0c;分为透明水印和不透明水印。水印的实现通常依赖于像素值操作&#xff0c;将水印图片融合到目标图片中&#xff0c;常用的方法…

路由器、二层交换机与三层交换机的区别与应用

路由器、二层交换机和三层交换机是常见的网络设备&#xff0c;常常协同工作。它们都可以转发数据&#xff0c;但在功能、工作层级以及应用场景上存在差异。 1. 工作层级 三者在OSI模型中的工作层级不同&#xff1a; 路由器&#xff1a; 工作在 网络层&#xff08;第三层&#…

Motionface RTASR 离线实时语音识别直播字幕使用教程

软件使用场景&#xff1a; 直播、视频会议、课堂教学等需要实时字幕的场景。 1&#xff1a;系统要求 软件运行支持32位/64位windows 10/11系统&#xff0c;其他硬件要求无&#xff0c;无显卡也能实时识别字幕。 2&#xff1a;下载安装 链接:百度网盘 请输入提取码 提取码&#…

从零开始认识主板

主板&#xff08;Motherboard&#xff09;是计算机中最重要的硬件之一&#xff0c;它连接并协调了计算机中所有的其他硬件组件。以下是主板的基本组成部分及其功能&#xff0c;从零开始帮助你了解主板&#xff1a; 1. 主板的定义与作用 主板是计算机的核心电路板&#xff0c;用…

Cesium 限制相机倾斜角(pitch)滑动范围

1.效果 2.思路 在项目开发的时候&#xff0c;有一个需求是限制相机倾斜角&#xff0c;也就是鼠标中键调整视图俯角时&#xff0c;不能过大&#xff0c;一般 pitch 角度范围在 0 至 -90之间&#xff0c;-90刚好为正俯视。 在网上查阅了很多资料&#xff0c;发现并没有一个合适的…

【HarmonyOS之旅】HarmonyOS概述(一)

目录 1 -> HarmonyOS简介 2 -> HarmonyOS发展历程 3 -> HarmonyOS技术特性 3.1 -> 硬件互助&#xff0c;资源共享 3.1.1 -> 分布式软总线 3.1.2 -> 分布式设备虚拟化 3.1.3 -> 分布式数据管理 3.1.4 -> 分布式任务调度 3.1.5 -> 分布式连接…

FireFox火狐浏览器企业策略禁止更新

一直在用火狐浏览器&#xff0c;但是经常提示更新&#xff0c;进入浏览器右上角就弹出提示&#xff0c;比较烦。多方寻找&#xff0c;一直没有找到合适的方案&#xff0c;毕竟官方没有给出禁用检查更新的选项&#xff0c;甚至about:config里都没有。 最终找到了通过企业策略控…

鲲鹏麒麟安装Kafka-v1.1.1

因项目需要在鲲鹏麒麟服务器上安装Kafka v1.1.1&#xff0c;因此这里将安装配置过程记录下来。 环境说明 # 查看系统相关详细信息 [roottest kafka_2.12-1.1.1]# uname -a Linux test.novalocal 4.19.148 #1 SMP Mon Oct 5 22:04:46 EDT 2020 aarch64 aarch64 aarch64 GNU/Li…

EFAK kafka可视化管理工具部署使用

简介&#xff1a;EFAK是开源的可视化和管理软件。它允许您查询、可视化、提醒和探索您的指标&#xff0c;无论它们存储在何处。简单来说&#xff0c;它为您提供了将 Kafka 集群数据转换为漂亮的图形和可视化效果的工具。 环境&#xff1a;①操作系统&#xff1a;CentOS7.6&…