C++中类的运算符重载教程(一),内附完整代码与解析

2023-05-16

目录:

一:加号运算符重载

对+重载函数的理解:(个人理解,仅供参考)

二:左移运算符的重载

对<<重载函数的理解(个人理解,仅供参考)

三:自增运算符重载

一:加号运算符重载

在对类进行操作时,如果我们想直接对类的两个实例化对象进行相加(数学计算,加减乘除之类的),那么编译器会报错,告诉我们没有与这些操作数匹配的类型。那么这里就可以用到我们的运算符重载函数了。

 基本格式:

返回类型 operator 需要重载运算符(函数参数)//  例如这里我们对+运算符进行重载。

这里我使用的是全局函数实现的+运算符重载,为了可以访问person类的私有属性,需要将该函数声明为person类的友元函数,当然也可以通过成员函数实现。

  如果对友元函数有什么不清楚的可以点击下方链接了解简单易懂的C++类的友元教程(friend)。全局函数做类友元,一个类做另一个类的友元,一个类中某个成员函数做友元。过程中顺序很重要哦。最后附有完整实现代码_来年秋风起^的博客-CSDN博客https://blog.csdn.net/qq_51004011/article/details/125413810?spm=1001.2014.3001.5501

函数体的实现:

//全局函数实现+运算符重载
person operator+(person& p1, person& p2)
{
	person tmp;
	tmp.data = p1.data + p2.data;
	return tmp;
}

//成员函数做+运算符重载
person person::operator+(person& p1)
{
	person tmp;
	tmp.data = this->data + p1.data;
}

在+运算符重载函数被定义好后,就已经可以直接实现此类的两个对象进行相加的操作了。

当然还有减号,乘除这些都可以这样进行重载。这里就不一一举例了。

对+重载函数的理解:(个人理解,仅供参考)

我们在实现完成类的两对象+重载函数后,再直接进行两个对象相加时,+运算符会自动匹配operator+函数,然后p1与p2分别与该函数的第一个,第二个参数类型相匹配,最后成功调用该函数。

 

二:左移运算符的重载

同样,如果我们想直接cout(输出)该类中的数据也不行

 也是因为没有与这些操作数匹配的<<(左移)运算符,这里对<<重载一下就行了。

函数实现:(注意这个重载函数最好写成全局函数的形式!!!

//全局函数实现左移运算符重载。<<
ostream& operator<<(ostream& cout, person& p)
{
	cout << p.data;
	return cout;
}

函数返回类型详解:

 这里的返回类型一定要是ostream&类型的,cout一些数据时,会默认在最后拼接一个endl(换行),所以这里需要将原来的cout返回,才能在最后拼接endl。

这里对>>(右移运算符重载也是可以的,只需要将返回类型与第一个参数类型该为istream即可)

对<<重载函数的理解(个人理解,仅供参考)

我们在实现完成类的<<重载函数后,再直接对这个类的对象进行输出,<<运算符会自动匹配operator<<函数,然后cout与p1分别与该函数的第一个,第二个参数类型相匹配,最后成功调用该函数。

 调用完该函数后,函数返回了一个cout的引用,所以在后面可以拼接endl或者其他数据类型。

三:自增运算符重载

同样的,我们直接对对象进行++,或者--也不能实现(没有与这些操作数匹配的++运算符

 所以我们也需要++,进行重载即可,这个函数可以定义为全局函数,或者成员函数都可以。

(1)前置++重载实现

前置++,先对变量进行++,然后使用该变量本身。所以这里的返回类型为person&,该对象本身。函数声明为:person& person::operator++();

//++,前置++运算符重载
person& person::operator++()
{
	this->data++;
	return *this;
}

 可以看到,结果确实如我们预期,可以直接对person类的对象进行++操作。

(2)后置++重载实现

后置++,先使用变量中的数据,然后对变量中数据进行++操作。

所以我们创建一个临时变量来存储原来的值然后对变量中数据进行++操作,这里的返回类型为person,创建出的临时变量函数声明为:person person::operator++(int);加了一个int作为占位参数来区分。

//++后置重载,int占位参数与前置++重载函数区分
person person::operator++(int)
{
	person tmp(*this);
	this->data++;
	return tmp;
}

对于自减运算符的重载也和上面的实现方式类似,只需要将++该成--即可,这里我就不去实现了。

最后附上总的实现代码:

#pragma once
#include<iostream>
#include<string>
using namespace std;
class person;

//全局函数实现+运算符重载
person operator+(person &p1,person &p2);

//全局函数实现左移运算符重载。<<
ostream& operator<<(ostream& cout, person& p);

class person
{
	friend ostream& operator<<(ostream& cout, person& p);
	friend person operator+(person& p1, person& p2);
public:
	person();
	person(int a);
	person(const person& p);
	//person operator+(person& p1);
	//成员函数实现前置,后置++重载
	person& operator++();//前置++重载
	person operator++(int);//后置++重载

private:
	int data;
};


person::person()
{
	;
}
person::person(int a)
{
	this->data = a;
}
person::person(const person& p)
{
	this->data = p.data;
}

//全局函数实现+运算符重载
person operator+(person& p1, person& p2)
{
	person tmp;
	tmp.data = p1.data + p2.data;
	return tmp;
}

//成员函数做+运算符重载
//person person::operator+(person& p1)
//{
//	person tmp;
//	tmp.data = this->data + p1.data;
//}

//全局函数实现左移运算符重载。<<
ostream& operator<<(ostream& cout, person& p)
{
	cout << p.data;
	return cout;
}

//++,前置++运算符重载
person& person::operator++()
{
	this->data++;
	return *this;
}

//++后置重载,int占位参数与前置++重载函数区分
person person::operator++(int)
{
	person tmp(*this);
	this->data++;
	return tmp;
}

void test1()
{
	person p1(1);
	cout << p1 << endl;
	//++p1;
	p1++;
	cout << p1 << endl;
}

int main()
{
	test1();
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++中类的运算符重载教程(一),内附完整代码与解析 的相关文章

  • gitee多人合作,上传push到别人的远程仓库

    首先要确保在别人的远程仓库中 第二步 xff1a 新建一个文件夹 xff0c 在里面点击右键 xff0c 选择 Git Bash Here进入操作界面 第三步 xff1a 先git init创建一个git文件 第四步 xff1a git r
  • 汽车CAN总线详解

    概述 CAN xff08 Controller Area Network xff09 总线协议是由 BOSCH 发明的一种基于消息广播模式的串行通信总线 xff0c 它起初用于实现汽车内ECU之间可靠的通信 xff0c 后因其简单实用可靠等
  • docker快速清理已停止的容器

    修剪所有不在运行的容器 xff0c 强制删除使用 f 或者 force docker container prune 使用 filter限制范围 xff0c 例如删除24小时前创建的已停止的容器 docker container prune
  • FreeRTOS学习笔记8(中断管理)

    1 中断管理的介绍 这里的中断管理主要是一些前面使用到的队列 信号量 互斥量等的在中断中使用的函数的封装 xff0c 为什么要从新封装这些函数 xff0c 这些函数有哪些优缺点 xff0c 这些函数是如何使用的 xff1f 这些问题后面会一
  • UCOSIII从官网(2021)下载

    官网地址 xff1a https www silabs com developers micrium 注意 xff1a 在进入下载前 可能 要注册一个账号 xff0c 如果可以直接下载的话不用注册也可以 xff0c 如果有小伙伴需要注册账号
  • dataX连接oracle报实例名错误

    oracleCDB数据库 xff1a 实例名CS 34 jdbcUrl 34 34 jdbc oracle thin 64 10 10 10 242 1521 xff1a CS 34 oraclePDB数据库 xff1a 实例名CS 34
  • 华清-周总结(2)(数据结构)

    数据结构类型 数据结构 xff1a 线性结构 xff0c 树形结构 xff0c 图形结构 线性结构 xff1a 在存储关系上 xff0c 每个元素最多有一个前驱 xff0c 一个后继 树形结构 xff1a 在存储关系上 xff0c 每个元素
  • 树莓派+新型混合无人机

    树莓派 43 新型混合无人机 产品设计缘由产品设计工作过程 xff1a 功能及成本预算 总结与鸣谢 产品设计缘由 我去设计这个树莓派 43 的一个产品 xff0c 是因为10月7日学校的创客训练营的招新选拔 xff0c 而选拔的题目是 xf
  • 树莓派frp内网穿透

    树莓派 43 frp内网穿透 一 frp二 frp作用三 安装与配置1 服务器端2 客户端 xff08 树莓派 xff09 一 frp frp 是一个高性能的反向代理应用 xff0c 支持 tcp udp http https 协议 二 f
  • FreeRTOS任务创建

    任务创建 操作 一 硬件初始化 span class token keyword static span span class token keyword void span span class token function Hardwa
  • vue2的点击事件简单搜索案例

    前端小白新人一枚 有不对请指正哦 写这篇文章的原因 xff1a 1 我使用了 computed 和 watch分别实现对列表的过滤筛选 xff0c 发现这两个方法均是用户输入自动过滤 xff0c 于是我想使用 点击事件过滤 xff0c 以下
  • QML嵌入视频遇到的一些问题汇总

    首先放上demo import QtQuick 2 6 import QtQuick Window 2 2 import QtMultimedia 5 8 Window visible true width 640 height 480 t
  • Downie 4 4.6.16 MAC上最新最好用的一款视频下载工具

    Downie for Mac 简介 Downie是Mac下一个简单的下载管理器 xff0c 可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们 Downie 4 下载 Downie 4 for Ma
  • AIGPT中文版(无需魔法,直接使用)不愧是生活工作的好帮手。

    AIGPT AIGPT是一款非常强大的人工智能技术的语言处理工具软件 xff0c 它具有 AI绘画 功能 AI写作 写论文 写代码 哲学探讨 创作等功能 xff0c 可以说是生活和工作中的好帮手 我们都知道使用ChatGPT是需要账号以及使
  • Tomcat10版本避坑

    Tomcat版本选择 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器 xff0c 属于轻量级应用服务器 xff0c 在中小型系统和 并发访问用户不是很多的场合下被普遍使用 xff0c 是开发和调试JSP 程序的首选 并且To
  • 阿里云ECS服务器ubuntu18图形界面安装

    文章目录 前言一 配置阿里镜像源二 安装图形界面三 VNC远程连接总结 前言 文章中的图形界面基于阿里云ECS服务器远程连接中的VNC连接 xff0c 使用时会体验到明显的延迟 xff0c 介意可以使用Xshell 43 Xmanger 4
  • 实验二 HDFS实验操作

    一 实验目的 理解HDFS在Hadoop体系结构中的角色熟练使用HDFS操作常用的Shell命令熟悉HDFS操作常用的Java API 二 实验平台 操作系统 xff1a ubuntu18Hadoop版本 xff1a 3 2 2JDK版本
  • Java程序部署到Linux环境上运行

    文章目录 前言一 Java环境安装二 Eclipse编译java程序并导出jar包三 Linux环境上运行jar包 前言 想要在Linux上运行java程序 xff0c 可以将java程序编译成功后导出成jar包 xff0c 然后在Linu
  • python疫情大数据可视化

    一 实验目的 通过本次实验掌握数据获取 数据清洗与存储和数据可视化工具的基本使用方法 二 实验平台 操作系统 xff1a window10 python版本 xff1a 3 8 IDE xff1a pycharm 可视化工具 xff1a e
  • MybatisPlus-乐观锁&悲观锁

    乐观锁 xff1a 每次不加锁而是假设没有冲突而去完成某项操作 xff0c 如果失败就重试 xff0c 直到成功为止 悲观锁 xff1a synchronized是独占锁即悲观锁 xff0c 会导致其他所有需要锁的线程挂起 xff0c 等待

随机推荐

  • ConcurrentHashMap -1.8 源码解析

    ConcurrentHashMap 1 8 源码解析 加锁机制 在JDK1 7之前 xff0c ConcurrentHashMap是通过分段锁机制来实现的 xff0c 所以其最大并发度受Segment的个数限制 因此 xff0c 在JDK1
  • Redis五种基本数据类型

    五种基本数据类型 redis无论什么数据类型 xff0c 在数据库中都是以key value形式保存 xff0c 并且所有的key 键 都是字符串 xff0c 所以讨论基础数据结构都是讨论的value值的数据类型 主要包括常见的5种数据类型
  • 直线的斜率

    斜率 xff0c 亦称 34 角系数 34 xff0c 表示一条直线相对于横轴的倾斜程度 一条直线与某平面直角坐标系横轴正半轴方向的夹角的正切值即该直线相对于该坐标系的斜率 如果直线与x轴垂直 xff0c 直角的正切值无穷大 xff0c 故
  • ElasticSearch--整合SpringBoot

    引入依赖 span class token tag span class token tag span class token punctuation lt span dependency span span class token pun
  • ElasticSearch--聚合查询

    聚合查询 简介 聚合 xff1a 英文为Aggregation xff0c 是es除搜索功能外提供的针对es数据做统计分析的功能 聚合有助于根据搜索查询提供聚合数据 聚合查询是数据库中重要的功能特性 xff0c ES作为搜索引擎兼数据库 x
  • CopyOnWriteArrayList简介

    1 简介 CopyOnWriteArrayList 是 ArrayList 的线程安全版本 就是在进行写操作的时候会 copy 原数组 xff0c 然后写完将指针指向新的数组 xff0c 是一种读写分离的思想 xff0c 可以并发的读 xf
  • PX4平台(V3)+T8S遥控器校准

    1 PX4与接收机的连接 首先 xff0c 将遥控器接收机的信号线与PX4的RC IN信号相连 xff08 注意正负极 xff09 xff0c 在主控上电之后 xff0c 观察接收机信号指示灯的颜色 xff1a 1 PWM 信号工作模式 接
  • PX4编写CAN应用程序控制底盘运动

    目录 一 在PX4平台中添加自己的应用程序 1 建立应用程序 Hello can c文件 xff1a Kconfig文件 xff1a CMakeLists txt文件 xff1a 2 编译应用程序及固件 3 测试应用 xff08 硬件 xf
  • PyCharm2021安装教程

    Windows安装PyCharm2021教程 一 下载安装PyCharm二 安装Python三 配置PyCharm环境四 使用PyCharm五 PyCharm简介 一 下载安装PyCharm 1 进入官网PyCharm的下载地址 xff1a
  • ROS学习(二)创建功能包

    在上一讲中我们已经创建好工作空间catkin ws xff0c 我们要在其src文件中创建功能包 文章目录 一 创建功能包二 编译功能包三 查看功能包的依赖3 1一阶依赖3 2间接依赖 四 定制功能包自定义package xml文件4 1
  • 双冒号(::)和单冒号(:)在 C++ 中的含义和作用

    目录 一 双冒号 xff08 xff09 在C 43 43 中的含义和作用 二 单冒号 xff08 xff09 在C 43 43 中的含义和作用 双冒号 xff08 xff09 和单冒号 xff08 xff09 在 C 43 43 中都是特
  • 【OpenCV教程】OpenCV中的数据类型

    文章目录 1 CV 8U2 CV 8S3 CV 16U4 CV 16S5 CV 16F6 CV 32S7 CV 32F8 CV 64F9 一图流 1 CV 8U CV 8U 占8位的unsigned CV 8UC n 占8位的unsigne
  • 【ROS教程】安装ROS全流程及可能遇到的问题

    文章目录 1 配置Softerware amp Updates2 添加软件源3 设置key4 更新并安装4 1 更新4 2 安装 ros noetic desktop full 4 2 1 安装aptitude4 2 2 安装ROS软件包
  • 【unix】unix环境高级编程

    文章目录 1 UNIX基础知识1 基本知识2 文件和目录3 输入和输出4 程序和进程5 出错处理6 用户标识7 信号8 时间9 系统调用和库函数 标准化和实现1 标准化 ISO C POSIX Single UNIX Specificati
  • 在 Ubuntu 中安装 VSCode

    在 Ubuntu 中安装 VSCode 如果想要通过 ubuntu 安装 vscode 有三种方式 xff0c 可以通过应用中心下载 xff0c 也可以通过安装包下载 xff0c 以及指令安装 方式一 xff1a 首先在 ubuntu 桌面
  • 常用命名规范分类:匈牙利命名法、下划线命名法、驼峰命名法、帕斯卡命名法

    目录 1 匈牙利命名法 xff08 Hungarian xff09 变量属性 2 下划线命名法 xff08 UnderScoreCase xff09 3 驼峰命名法 xff08 小驼峰命名法 xff09 xff08 Camel xff09
  • keil5无法跳转自己要查询的函数

    之前用keil5的时候想要查询函数的意思 xff0c 去跳转结果给我报错 xff0c 出现这个报错信息 原因是编译的时候没有勾选这个按钮 xff1a 勾选上之后重新编译就不会报错了
  • Linux 安装 Node.js | NPM

    超级简单 yum y install nodejs 验证安装 安装node js 会自动一起安装npm 注意 python V 是大写字母V 错写为小写会进入python的编辑模式 执行exit 退出 执行node 启动node终端 两次C
  • 树莓派连接不上WIFi,VNC失效,SSH失效

    笔记 xff1a 树莓派连接不上wifi的解决方法 xff1a 1 xff0c usb连接手机 xff0c 手机设置中搜索 xff0c usb共享网络 xff0c 然后代开usb连接网络 2 xff0c 右键树莓派wifi标志符 xff0c
  • C++中类的运算符重载教程(一),内附完整代码与解析

    目录 xff1a 一 xff1a 加号运算符重载 对 43 重载函数的理解 xff1a xff08 个人理解 xff0c 仅供参考 xff09 二 xff1a 左移运算符的重载 对 lt lt 重载函数的理解 xff08 个人理解 xff0