【C++】类和对象-C++运算符重载

news2024/11/17 4:50:29

运算符重载

在这里插入图片描述

1.加号运算符重载

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码:

#include <iostream>
using namespace std;
/******************************************/
//加号运算符重载

class Person
{
public:

	int m_A;
	int m_B;

	//1、成员函数重载+号(不能与下面方式2同时存在,否则代码报错)
	//Person operator+(Person& p) {
	//	Person temp;
	//	temp.m_A = this->m_A + p.m_A;
	//	temp.m_B = this->m_B + p.m_B;
	//	return temp;
	//}
	Person operator+(int num) {
		Person temp;
		temp.m_A = this->m_A + num;
		temp.m_B = this->m_B + num;
		return temp;
	}
};

//2、全局函数重载+号(不能与上面方式1同时存在,否则代码报错)
Person operator+(Person& p1, Person& p2) {
	Person temp;
	temp.m_A = p1.m_A + p2.m_A;
	temp.m_B = p1.m_B + p2.m_B;
	return temp;
}
//Person operator+(Person& p1, int num) {
//	Person temp;
//	temp.m_A = p1.m_A + num;
//	temp.m_B = p1.m_B + num;
//	return temp;
//}

void test01() {
	Person p1;
	p1.m_A = 10;
	p1.m_B = 10;
	Person p2;
	p2.m_A = 10;
	p2.m_B = 10;

	//成员函数重载本质调用
	//Person p3 = p1.operator+(p2);

	//全局函数重载本质调用
	//Person p3 = operator+(p1, p2);

	Person p3 = p1 + p2;

	//运算符重载 ,函数也可以发生重载
	Person p4 = p1 + 100;//Person + int

	cout << "p3.m_A = " << p3.m_A << endl;
	cout << "p3.m_B = " << p3.m_B << endl;

	cout << "p4.m_A = " << p4.m_A << endl;
	cout << "p4.m_B = " << p4.m_B << endl;
}


/******************************************/
int main()
{
	/******************************************/
	test01();

	/******************************************/
	system("pause");

	return 0;
}

结果
在这里插入图片描述

2.左移运算符重载

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
代码:

#include <iostream>
using namespace std;
/******************************************/
//左移运算符重载
class Person {

	friend ostream& operator<<(ostream& cout, Person& p);
public:
	Person(int a, int b) {
		m_A = a;
		m_B = b;
	}

	//利用成员函数重载 左移运算符 p.operator<<(cout) 简化版本 p << cout
	//不会利用成员函数重载<<运算符, 因为无法实现cout在左侧
	//void operator<<( cout ) {

	//}
private:
	int m_A;
	int m_B;
};

//只能利用全局函数重载左移运算符
//ostream对象只能有一个!!!
ostream& operator<<(ostream& cout, Person& p) {  //本质 operator<< (cout, p) 简化 cout << p
	cout << "m_A = " << p.m_A << " m_B = " << p.m_B;
	return cout; //ostream& 加上了& 就是进行了cout引用
}

void test01() {
	Person p(10, 10);
	//p.m_A = 10;
	//p.m_B = 10;

	cout << p << "hello" << endl;//链式编程
}

/******************************************/
int main()
{
	/******************************************/
	test01();

	/******************************************/
	system("pause");

	return 0;
}

3.递增运算符重载

在这里插入图片描述
在这里插入图片描述
递增++代码:

#include <iostream>
using namespace std;
/******************************************/
//递增运算符重载

//自定义整型
class MyInteger {
	friend ostream& operator<<(ostream& cout, MyInteger& myint);//前置++运算符
	//friend ostream& operator<<(ostream& cout, MyInteger  myint);//后置++运算符

public:
	MyInteger() {
		m_Num = 0;
	}

	//重载前置++运算符 返回引用为了一直对一个数据进行递增操作
	MyInteger& operator++() {
		//先进行++运算
		m_Num++;
		//再将自身做返回
		return *this;
	}

	//重载后置++运算符
	//MyInteger operator++(int) int代表占位参数,可以用于区分前置和后置递增
	MyInteger operator++(int) {
		MyInteger temp = *this;
		//先返回自身结果
		m_Num++;
		//再进行++运算
		return temp;
	}


private:
	int m_Num;
};

//重载<<运算符 , 前置++运算符
ostream& operator<<(ostream& cout, MyInteger& myint) {
	cout << "myint输出: " << myint.m_Num;
	return cout;
}

重载<<运算符 , 后置++运算符
//ostream& operator<<(ostream& cout, MyInteger myint) {
//	cout << "myint输出: " << myint.m_Num;
//	return cout;
//}

//void test01() {
//	MyInteger myint;
//	cout << myint++ << endl;
//	cout << myint << endl;
//}

void test02() {
	MyInteger myint;
	cout << ++myint << endl;
	cout << myint << endl;
}
/******************************************/
int main()
{
	/******************************************/
	//test01();
	test02();

	/******************************************/
	system("pause");

	return 0;
}

递减–代码:

#include <iostream>
using namespace std;
/******************************************/
//递增运算符重载

//自定义整型
class MyInteger {
	//friend ostream& operator<<(ostream& cout, MyInteger& myint);
	friend ostream& operator<<(ostream& cout, MyInteger myint);

public:
	MyInteger() {
		m_Num = 2;
	}

	MyInteger& operator--() {
		m_Num--;
		return *this;
	}

	MyInteger operator--(int) {
		MyInteger temp = *this;
		m_Num--;
		return temp;
	}

private:
	int m_Num;
};

//ostream& operator<<(ostream& cout, MyInteger& myint) {
//	cout << myint.m_Num;
//	return cout;
//}

ostream& operator<<(ostream& cout, MyInteger myint) {
	cout << myint.m_Num;
	return cout;
}

//void test01() {
//	MyInteger myint;
//	cout << --myint << endl;
//	cout <<   myint << endl;
//}

void test02() {
	MyInteger myint;
	cout << myint-- << endl;
	cout << myint   << endl;
}
/******************************************/
int main()
{
	/******************************************/
	//test01();
	test02();

	/******************************************/
	system("pause");

	return 0;
}

4.赋值运算符重载

在这里插入图片描述
在这里插入图片描述
代码:

#include <iostream>
using namespace std;
/******************************************/
//赋值运算符重载
class Person {
public:
	Person(int age) {
		//将年龄数据开辟到堆区
		m_Age = new int(age);
	}

	//重载赋值运算符
	Person& operator=(Person& p) {
		if (m_Age != NULL) {
			delete m_Age;
			m_Age = NULL;
		}
		//编译器提供的代码是浅拷贝
		//m_Age = p.m_Age;

		//提供深拷贝 解决浅拷贝的问题
		m_Age = new int(*p.m_Age);

		//返回本身
		return *this;
	}

	~Person() {
		if (m_Age != NULL) {
			delete m_Age;
			m_Age = NULL;
		}
	}

	//年龄的指针
	int* m_Age;
};

void test01() {
	Person p1(18);

	Person p2(20);

	Person p3(30);

	p3 = p2 = p1; //赋值操作

	cout << "p1的年龄为: " << *p1.m_Age << endl;

	cout << "p2的年龄为: " << *p2.m_Age << endl;

	cout << "p3的年龄为: " << *p3.m_Age << endl;
}
/******************************************/
int main()
{
	/******************************************/
	test01();
	//test02();

	/******************************************/
	system("pause");

	return 0;
}

结果:
在这里插入图片描述

5.关系运算符重载

在这里插入图片描述
在这里插入图片描述

#include <iostream>
using namespace std;
/******************************************/
//关系运算符重载
class Person {
public:
	Person(string name, int age) {
		this->m_Name = name;
		this->m_Age = age;
	}

	bool operator==(Person& p) {
		if (m_Name == p.m_Name && m_Age == p.m_Age) {
			return true;
		}
		else {
			return false;
		}
	}

	bool operator!=(Person& p) {
		if (m_Name == p.m_Name && m_Age == p.m_Age) {
			return false;
		}
		else {
			return true;
		}
	}

private:
	string m_Name;
	int m_Age;
};

void test01() {
	Person p1("tom", 18);
	Person p2("tom", 18);

	if (p1 == p2) {
		cout << "p1和p2相等  " << endl;
	}
	else {
		cout << "p1和p2不相等" << endl;
	}

	if (p1 != p2) {
		cout << "p1和p2不相等  " << endl;
	}
	else {
		cout << "p1和p2相等" << endl;
	}
}

void test02();

/******************************************/
int main()
{
	/******************************************/
	test01();
	test02();

	/******************************************/
	system("pause");

	return 0;
}

void test02() {
	Person p1("jack", 18);
	Person p2("tom", 18);

	if (p1 == p2) {
		cout << "p1和p2相等  " << endl;
	}
	else {
		cout << "p1和p2不相等" << endl;
	}

	if (p1 != p2) {
		cout << "p1和p2不相等  " << endl;
	}
	else {
		cout << "p1和p2相等" << endl;
	}
}

6.函数调用运算符重载

在这里插入图片描述
代码

#include <iostream>
using namespace std;
/******************************************/
//函数调用运算符重载
class MyPrint {
public:
	void operator()(string test) {
		cout << "print:" << test << endl;
	}
};

void test01() {
	//重载()操作符 也称为仿函数
	MyPrint myPrint;
	myPrint("hello");

	//匿名对象调用
	MyPrint()("匿名对象调用");
}

class Add {
public:
	int operator()(int num1, int num2) {
		return num1 + num2;
	}
};

void test02() {
	Add add;
	cout << add(10, 20) << endl;

	//匿名对象调用
	cout << Add()(10, 20) << endl;
}

/******************************************/
int main()
{
	/******************************************/
	test01();
	test02();

	/******************************************/
	system("pause");

	return 0;
}

结果
在这里插入图片描述

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

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

相关文章

在docker中没有vi如何修改docker中的文件

今天在做学成在线的项目&#xff0c;遇到了一个问题&#xff0c;就是死活登不上xxl-job&#xff0c;按照之前遇到的nacos的问题&#xff0c;我怀疑很大概率是和当时的ip设置有关&#xff0c;不知道nacos的ip怎么修改的同学&#xff0c;可以看看这篇文章&#xff1a;关于docker中…

电子词典

项目要求&#xff1a; 1.登录注册功能&#xff0c;不能重复登录&#xff0c;重复注册。用户信息也存储在数据库中。 2.单词查询功能 3.历史记录功能&#xff0c;存储单词&#xff0c;意思&#xff0c;以及查询时间&#xff0c;存储在数据库 4.基于TCP&#xff0c;支持多客户…

【AI网站分享】

AI网站分享 1 AI应用2 AI 写作3 AI 编程4 AI设计5 AI作图6 AI训练模型7 AI影音编辑8 AI效率助手 网站链接&#xff1a; https://tools.haiyong.site/ai/ 网站中的内容大致可以分为八类&#xff1a;AI应用、AI写作、 AI 编程、 AI设计、 AI作图、AI训练模型、 AI影音编辑、 AI效…

线程属性——线程分离应用

文章目录 相关函数初始化释放线程属性的资源获取线程分离的状态属性设置线程分离的状态属性获取线程的栈的大小线程分离应用 相关函数 可以通过man pthread_attr_然后按两次table键查询和属性相关的函数 初始化 释放线程属性的资源 获取线程分离的状态属性 设置线程分离的状…

C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离

【我的目的】&#xff1a;SQL和代码分别存放在不同的地方&#xff0c;便于随时修改SQL的内容&#xff0c;也便于修改SQL的书写格式 方案1&#xff1a;把SQL存放在DataSet.xsd中实现SQL和代码分离 方案2&#xff1a;用存储过程实现SQL和代码分离 我最倾向方案1&#xff0c;利用…

链路 聚合

静态链路聚合&#xff1a;多数内网使用 。非物理直连建议与BFD联动 动态链路聚合LACP&#xff1a;是公有协议、内网、二层专线接口都能使用&#xff0c;现网多数使用此方式链路 聚合 PAGP&#xff1a;思科私有协议&#xff0c;只支持思科设备使&#xff0c;现网多数不用

Windows驱动开发

开发Windows驱动程序时&#xff0c;debug比较困难&#xff0c;并且程序容易导致系统崩溃&#xff0c;这时可以使用Virtual Box进行程序调试&#xff0c;用WinDbg在主机上进行调试。 需要使用的工具&#xff1a; Virtual Box&#xff1a;用于安装虚拟机系统&#xff0c;用于运…

谨防虚假发货!了解如何辨别真假发货单号

随着电子商务的发展&#xff0c;快递行业成为了一个不可忽视的重要环节。然而&#xff0c;虚假发货单号的出现给快递行业带来了一定的困扰。为了解决这个问题&#xff0c;一些快递批量查询高手软件开始应用于虚假发货单号的分析。本文将介绍这些软件如何分析出虚假发货单号&…

应用开发者的疑问:大模型是银弹吗?

被当成银弹的大模型 ChatGPT 火了之后&#xff0c;大模型似乎被当成了真正的银弹&#xff0c;所有的体验问题都想通过大模型解决&#xff1a; 能不能和大模型对话订机票&#xff1f;自然语言生成 SQL&#xff0c;简化报表分析工作&#xff1f;大模型帮老年人操作软件&#xff…

nosql之redis集群

文章目录 一.redis集群1.单节点redis服务器带来的问题2.集群redis3.集群的优势4.redis集群的实现方法5.redis群集的三种模式5.1 主从复制5.2 哨兵5.3 集群 二.Redis 主从复制1.主从复制概念2.主从复制的作用3.主从复制流程4.搭建Redis 主从复制4.1 安装 Redis4.2 修改 Redis 配…

RBF神经网络原理和matlab实现

1.案例背景 1.1 RBF神经网络概述 径向基函数(Radical Basis Function,RBF)是多维空间插值的传统技术,由Powell于1985年提出。1988年, Broomhead和 Lowe根据生物神经元具有局部响应这一特点,将 RBF引入神经网络设计中,产生了RBF神经网络。1989 年&#xff0c;Jackson论证了…

开源项目-erp企业资源管理系统(毕设)

哈喽,大家好,今天给大家带来一个开源项目-erp企业资源管理系统,项目通过ssh+oracle技术实现。 系统主要有基础数据,人事管理,采购管理,销售管理,库存管理,权限管理模块 登录 主页 基础数据 基础数据有商品类型,商品,供应商,客户,仓库管理功能

Python零基础入门(十)——模块与包

系列文章目录 个人简介&#xff1a;机电专业在读研究生&#xff0c;CSDN内容合伙人&#xff0c;博主个人首页 Python入门专栏&#xff1a;《Python入门》欢迎阅读&#xff0c;一起进步&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; 码字不易&#xff0c;如果觉得文章不…

【C语言-扫雷游戏全功能详解】

目录 理解扫雷原理 梳理扫雷过程 9*9 棋盘 初始化棋盘 显示棋盘 ​编辑 布置雷 排查雷 统计x,y坐标周围有几个雷 使用递归函数来实现周围没地雷时展开多个 判断成功排除后剩下的方格数是否等于地雷数 排查函数 梳理编写代码思路 头文件game.h 库函数所需要头文件 …

STM32 cubemx配置USART DMA传输

文章目录 前言一、DMA概念二、STM32 DMA数据手册分析3.DMA模式介绍4.cubemx配置总结 前言 本篇文章来讲解DMA的概念&#xff0c;并使用DMA来进行串口的数据收发。 一、DMA概念 DMA&#xff08;Direct Memory Access&#xff0c;直接内存访问&#xff09;是一种计算机系统的技…

vue 设置数组

手写获取数据 <el-form-item label"缴纳方"><el-select v-model"form.invoiceCategoryName" placeholder"请选择缴纳方"><el-optionv-for"item in kplmList":key"item.value":label"item.label":v…

求解方程x^2=a的根,不使用库函数直接求解(不动点迭代法)

首先可以将方程两边同时加上x&#xff0c;&#xff0c;这时候两边同时再除以1x&#xff0c;就得到了&#xff0c;变形为。&#xff08;变性后的迭代式不唯一&#xff0c;这里随便选取一个&#xff09; 当x是准确值的时候&#xff0c;两边应该是相等的&#xff0c;如果x是近似值…

数据库连接池的使用

十、数据库连接池的使用 1、c3p0数据库连接池 硬编码&#xff1a; c3p0的帮助文档 c3p0配置文件&#xff1a; 2、dbcp数据库连接池 配置文件&#xff1a; 3、druid 将上面三个做成工具类&#xff1a;

单网卡实现 双IP 双网段(内外网)同时运行

前提是内外网是同一网线连接&#xff08;双网线双网卡的具体可以自己搜索下。理论上都设置静态IP后把外网跃点设置小&#xff0c;内网跃点设置大&#xff0c;关闭自动跃点设置同一个接口跃点数&#xff0c;在通过命令提示符添加内网网址走内网网关就可以了&#xff09;。 需要使…

Mac 定时重启 TouchBar 脚本(缓解闪烁问题)

背景 Mac 笔记本 TouchBar 是真的脆啊&#xff0c;合盖使用一段时间就废了&#xff0c;右侧一直闪烁简直亮瞎眼 &#x1f602; 经过观察&#xff0c;总结出闪烁规律如下&#xff1a; 工作状态&#xff1a;不断操作电脑时&#xff0c;触控栏处于工作状态&#xff0c;几乎不闪…