C++编程(六)运算符重载

文章目录

  • 一、概念
      • 1. 左值和右值
      • 2. 运算符重载
      • 3. 可以实现重载的运算符和不可以实现重载的运算符
  • 二、双目运算符
    • (一)说明
    • (二)实现
      • 1. 注意点
      • 2. 算术运算符
        • 成员函数版本
        • 全局函数版本
      • 3. 关系运算符
        • 成员函数版本
        • 全局函数版本
  • 三、赋值类
  • 四、单目类
  • 五、递增和自减类
    • (一)前自增自减运算符的重载
    • (二)后自增自减运算符的重载
  • 六、插入(>>)和提取(<<)运算符重载

一、概念

1. 左值和右值

左值:既可以在等号的左边也可以在等号的右边;
右值:只能放在等号的右边。

2. 运算符重载

给运算符赋予新的含义,让原本只能处理基本数据类型运算的运算符可以处理类对象之间的关系

运算符重载的本质就是函数重载
运算符重载的时候操作数的个数需要通过运算符来决定的

运算符版本分为全局函数版本和成员函数版本

3. 可以实现重载的运算符和不可以实现重载的运算符

在这里插入图片描述

二、双目运算符

(一)说明

L # R

L:左操作数
#:运算符
R:右操作数

对于左右操作数既可以是左值,也可以是右值
对于表达式结果必须是右值

(二)实现

1. 注意点

L # R
1. 成员函数版本
const 类名 operator#(const 类名& R)const{}第一个const修饰返回值,返回值是一个右值;第二个const修饰的是右操作数;第三个const修饰的是左操作数。
2. 全局函数版本
const 类名 operator#(const 类名 &L,const 类名 &R){};需要在类中声明为友元函数

2. 算术运算符

+-*/%取余

  • 注: 返回值被const修饰,是为了避免返回值被修改的情况
成员函数版本
#include <iostream>
using namespace std;
class Complex{
public://构造函数Complex(){} //在实现运算符重载的函数中需要用到无参构造函数Complex(int a,int b):m_a(a),m_b(b){}//运算符重载函数声明const Complex operator +(const Complex &R)const;void print(){cout<<m_a<<'+'<<m_b<<'i'<<endl;}
private:int m_a; //实部int m_b; //虚部
};
//运算符重载函数定义
const Complex Complex::operator+(const Complex &R) const{Complex temp;temp.m_a=this->m_a+R.m_a;temp.m_b=this->m_b+R.m_b;return temp;
}int main()
{Complex m(3,4);Complex n(1,2);Complex r=m+n;r.print();return 0;
}
全局函数版本
#include <iostream>
using namespace std;
class Complex{
public://构造函数Complex(){} //在实现运算符重载的函数中需要用到无参构造函数Complex(int a,int b):m_a(a),m_b(b){}//运算符重载函数声明friend const Complex operator + (const Complex &L,const Complex &R);void print(){cout<<m_a<<'+'<<m_b<<'i'<<endl;}
private:int m_a; //实部int m_b; //虚部
};
//运算符重载函数定义
const Complex operator + (const Complex &L,const Complex &R){Complex temp;temp.m_a=L.m_a+R.m_a;temp.m_b=L.m_b+R.m_b;return temp;
}int main()
{Complex m(3,4);Complex n(1,2);Complex r=m+n;r.print();return 0;
}

3. 关系运算符

>大于 <小于 ==等于 !=不等于 >=大于等于 <=小于等于

成员函数版本
#include <iostream>
using namespace std;
class Complex{
public://构造函数Complex(){} //在实现运算符重载的函数中需要用到无参构造函数Complex(int a,int b):m_a(a),m_b(b){}//运算符重载函数声明bool operator >(const Complex &R)const;void print(){cout<<m_a<<'+'<<m_b<<'i'<<endl;}
private:int m_a; //实部int m_b; //虚部
};
//运算符重载函数定义
bool Complex::operator>(const Complex &R) const{if(this->m_a>R.m_a && this->m_b>R.m_a)return true;return false;
}int main()
{Complex m(3,4);Complex n(1,2);if(m>n)cout<<"m>n"<<endl;elsecout<<"m<=n"<<endl;return 0;
}
全局函数版本
#include <iostream>
using namespace std;
class Complex{
public://构造函数Complex(){} //在实现运算符重载的函数中需要用到无参构造函数Complex(int a,int b):m_a(a),m_b(b){}//运算符重载函数声明friend bool operator >(const Complex &L,const Complex &R);void print(){cout<<m_a<<'+'<<m_b<<'i'<<endl;}
private:int m_a; //实部int m_b; //虚部
};
//运算符重载函数定义
bool operator >(const Complex &L,const Complex &R){if(L.m_a>R.m_a && L.m_b>R.m_a)return true;return false;
}int main()
{Complex m(3,4);Complex n(1,2);if(m>n)cout<<"m>n"<<endl;elsecout<<"m<=n"<<endl;return 0;
}

三、赋值类

+= -= /= %= &= ^= ‘<<=’ >>=
L # R
左操作数只能是一个左值
右操作数既可以是一个左值,也可以是一个右值
返回值是左操作数本身

成员函数版:
类名 &operator#(const 类名 &R){}

全局函数版:
类名 &operator#(类名 &L, const 类名 &R){}

  • 注:赋值运算符’='只能使用成员函数版本,因为编译器提供的特殊的成员函数,拷贝复制函数就是=运算符重载;
    且两个版本的重载函数不能同时出现,否则会造成歧义。

四、单目类

-(负) ~(取反) !(非)

表达式:
#O
操作数既可以是一个左值,也可以是一个右值
表达式的结果是一个右值

成员函数版:
const 类名 operator#(void)const;
第一个const是用来修饰返回值的
第二个const是用来修饰操作数

全局函数版:
const 类名 operator#(const 类名 &O)

五、递增和自减类

++a a++ a-- --a

(一)前自增自减运算符的重载

表达式:
#O
操作数是一个左值
返回值是一个左值

成员函数版本:
类名& operator#(void);

全局函数版本:
类名 operator#(类名& O)

前自增自减是先自增自减然后返回对象本身

Complex &Complex::operator++(void)
{++this->m_a;++this->m_b;return *this;
}
  • 注:此处返回值是一个左值,可以修改,因此不能用const修饰

(二)后自增自减运算符的重载

表达式:
#O
操作数是一个左值
返回值是一个右值

成员函数版本:
const 类名& operator#(哑元);

全局函数版本:
const 类名 operator#(类名& O,哑元)

后自增自减需要先返回值然后再做自增或自减,因此需要一个临时变量保存对象当前的值,然后对象再进行自增或者自减,运算符重载函数返回的是临时变量,当函数执行完毕后,临时变量的空间就被释放了,因此返回值是一个右值

const Complex Complex::operator ++(int){Complex temp;temp.m_a=this->m_a++;temp.m_b=this->m_b++;return temp;
}
  • 注:此处返回值是一个右值,不可以修改,因此使用const修饰

六、插入(>>)和提取(<<)运算符重载

#include <iostream>
istream:输入流类 cin
ostream:输出流类 cout

在对插入运算符和提取运算符做操作时要使用全局函数版本

istream& operator >> (istream &in,类名 &R);
左操作数是cin;
右操作数既可以是左值,也可以是右值;
返回值是一个左值,返回值类型是istream&

ostream& operator <<(ostream &out,类名 &R);
左操作数是cout;
右操作数既可以是左值,也可以是右值
返回值是一个左值,返回值类型是ostream&

#include <iostream>
using namespace std;
class Complex{
public://构造函数Complex(){} //在实现运算符重载的函数中需要用到无参构造函数Complex(int a,int b):m_a(a),m_b(b){}//运算符重载函数声明friend ostream &operator<<(ostream &out,Complex &O);friend istream &operator>>(istream &in,Complex &O);void print(){cout<<m_a<<'+'<<m_b<<'i'<<endl;}
private:int m_a; //实部int m_b; //虚部
};
//运算符重载函数定义
ostream &operator<<(ostream &out,Complex &O){char op;if(O.m_b<0)op='-';elseop='+';out<<O.m_a<<op<<O.m_b<<'i';return out;
}
istream &operator>>(istream &in,Complex &O){in>>O.m_a>>O.m_b;return in;
}int main()
{Complex m(3,4);cout<<m<<endl;Complex mm(0,0);cin>>mm;cout<<mm<<endl;return 0;
}

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

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

相关文章

技术反诈指南丨央视报了!基于“AI换脸”的新型电信网络诈骗猖獗

目录 利用“AI换脸”技术的诈骗 技术上防范新型电信网络诈骗 内蒙古鄂尔多斯市居民李女士近日遭遇了一起新型电信网络诈骗案。诈骗团伙利用“AI换脸”技术&#xff0c;合成了与李女士老同学相似的视频通话&#xff0c;以此作为诈骗的关键手段&#xff0c;成功骗取李女士信任。 …

【linux】使用vnc连接远程桌面,需要安装tigervnc,并在服务端期待,然后在客户端使用tigervnc-viewer进行连接即可

vnc 远程设置方法 需要服务端安装软件&#xff1a; sudo apt install -y tigervnc-standalone-server# 先配置密码使用&#xff1a; tightvncpasswd启动服务&#xff0c;禁用本机 vncserver -localhost no -geometry 1924x1080 :1客户端安装软件&#xff1a; sudo apt insta…

1974. 使用特殊打字机键入单词的最少时间

关键点&#xff1a; 无论数组的开头第一位是什么&#xff0c;总是从a开始的&#xff0c;从第一个字母向后走的时候有顺时针和逆时针&#xff0c;取最小值当从第一个字母开始走的时候&#xff0c;用当前位置替换a的作用 class Solution:def minTimeToType(self, word: str) -&g…

实现资产优化管理:智慧校园资产分类功能解析

在构建智慧校园的过程中&#xff0c;细致入微的资产管理是确保教育资源高效运作的关键一环&#xff0c;而资产分类功能则扮演着举足轻重的角色。系统通过精心设计的分类体系&#xff0c;将校园内的各类资产&#xff0c;从昂贵的教学设备到日常使用的办公物资&#xff0c;乃至无…

嵌入式linux系统中动态链接库实现详解

大家好,linux系统中动态库是如何实现相互链接的?今天简单聊聊动态链接库的实现原理。 假设有这样两段代码,第一段代码定义了一个全量变量a以及函数foo,函数foo中引用了下一段代码中定义的全局变量b。 第二段代码定义了全局变量b以及main函数,同时在main函数中调用了第一个…

​Chrome插件:React Developer Tools为React开发调试而生

React Developer Tools 是什么? 它是允许在Chrome和Firefox开发者工具中检查React组件层次结构的扩展插件。 插件源码下载 源码下载地址:GitHub - facebook/react-devtools at v3 下载完成以后执行红框中的代码,下载react-devtools 源码,源码如下图所示: 插件打包 当前n…

表单外链,支持查看方式设置

06/19 主要更新模块概览 外链设置 跳转缩放 打印调整 数据校验 01 表单管理 1.1 【表单外链】-填写外链新增查看方式设置 说明&#xff1a; 原表单填写外链&#xff0c;填写字段权限和查看权限统一字段设置&#xff0c;用户在填写时看到数据与查看数据一致…

Qt 使用代码布局,而不使用UI布局

一、工程的建立&#xff1a; 1、打开Qt Creator&#xff0c;文件&#xff0c;新建文件或项目 2、选择Application&#xff0c;Qt Widgets Application 3、写入名称&#xff0c;选择qmake 4、选择基类Base class&#xff0c;去除Generate form 务必选择QWidget&#xff0c;若…

交友系统定制版源码| 相亲交友小程序源码全开源可二开_打造独特的社交交友系统

交友系统源码的实现涉及到多个方面&#xff0c;包括前端页面设计、后端逻辑处理、数据库设计以及用户交互等。以下是一个简单的交友系统源码实现的基本框架和关键步骤: 1.数据库设计:用户表:存储用户基本信息&#xff0c;如用户ID、用户名、密码、头像、性别、年龄、地理位置等…

『手撕Vue-CLI』 添加自定义指令

添加 create 指令 在 vue-cli 中&#xff0c;create 指令是用来创建一个新的项目的&#xff0c;我实现的 nue --help 的帮助信息中只有 --version&#xff0c;--help 这两个指令&#xff0c;所以当用户使用我的 nue-cli 时&#xff0c;并不知道有 create 这个指令&#xff0c;所…

【MySQL】事务实现原理

事务 事务是将一组SQL语句打包成一个整体&#xff0c;在这组SQL的执行过程中&#xff0c;要么全部成功&#xff0c;要么全部失败。这组SQL语句可以是一条也可以是多条。 如果转账成功&#xff0c;应该满足以下要求&#xff1a; 张三的账户余额减少100&#xff0c;变成900&…

Vatee万腾平台:引领行业变革,创新未来

在当今这个快速变化的时代&#xff0c;科技的力量正在以前所未有的速度推动着行业的变革。Vatee万腾平台&#xff0c;以其独特的视角和前瞻性的布局&#xff0c;正引领着行业变革的浪潮&#xff0c;创新着未来的发展方向。 Vatee万腾平台是一家专注于科技研发和创新应用的领军企…

安装PyTorch详细过程(个人过程仅供参考)

1.安装anaconda 2.创建一个虚拟环境 以上步骤默认已经完毕&#xff0c;毕竟只是记录pytorch的安装过程 3.查看个人电脑CUDA版本 winr 输入cmd 回车 输入指令 nvidia-smi 右上角为该电脑所支持的最高CUDA版本 输入命令 nvcc -V 图中即为该电脑所安装的CUDA版本 记住该版…

动捕系统如何解决“超出捕捉范围”的挑战

惯性运动捕捉系统改变了我们捕捉运动的方式&#xff0c;使艺术家、创作者和独立工作室能够摆脱动捕实验室和复杂设置的限制。通过身体上的传感器和无线连接&#xff0c;动捕演员可以自由移动和并作出各种高难度动作。然而具有高自由度的惯性动捕系统&#xff0c;经常面临着超出…

筛斗数据全面解析数据提取与清洗的重要性

筛斗数据全面解析数据提取与清洗的重要性 在数字化时代&#xff0c;数据是企业决策的重要依据。然而&#xff0c;数据并非总是以我们期望的形式出现&#xff0c;它们可能分散、冗余、错误甚至不完整。因此&#xff0c;数据提取与清洗成为数据处理流程中不可或缺的两个环节。筛…

数学建模 —— 矩阵的运算(上)

目录 调用函数运算 sum : 求和函数 prod : 求乘积函数(product) cumsum : 计算累积和(cumulative sum) diff : 计算差分(difference) mean : 计算平均值 (average) median : 计算中位数 mode : 计算众数 var : 计算方差 (variance) std : 计 算 标 准 差 (standard d…

UE5(c++)开发日志(2):向日志和屏幕输出信息/将C++类变为蓝图类

通过UE_LOG()向日志输出&#xff0c;向其传入三个参数(①输出日志类型,一般LogTemp ②具体种类&#xff0c;普通/警告/错误&#xff0c;这里是Warning ③输出的文本内容&#xff0c;使用TEXT(" ")&#xff0c;这里是TEXT("Run AActor BeginPlay")) 代码写…

找茬找不同看图猜谜语小游戏

找茬找不同看图猜谜语小游戏&#xff1a;挑战你的观察力与智慧 &#x1f50d; 挑战你的观察力&#xff1a;找茬找不同 你是否曾对两张看似相同的图片感到好奇&#xff0c;想要找出它们之间的微妙差异&#xff1f;找茬找不同小游戏正是为了满足你的这种好奇心而设计的。在这些游…

前端基础:CSS(篇一)

目录 css概述 CSS与HTML的关系 基本语法 行内样式表 代码 运行 内嵌样式表 代码 运行 外部样式表 代码 运行 选择器 标签选择器 代码 运行 id选择器 代码 运行 类选择器 代码 运行 选择器优先问题 通配选择器 选中所有的标签 代码 运行 选择器组…

记一次 .NET某网络边缘计算系统 卡死分析

一&#xff1a;背景 1. 讲故事 早就听说过有什么 网络边缘计算&#xff0c;这次还真给遇到了&#xff0c;有点意思&#xff0c;问了下 chatgpt 这是干嘛的 ? 网络边缘计算是一种计算模型&#xff0c;它将计算能力和数据存储位置从传统的集中式数据中心向网络边缘的用户设备、…