运算符重载(个人学习笔记黑马学习)

news2024/11/24 20:36:02

1、加号运算符重载

#include <iostream>
using namespace std;
#include <string>

//加号运算符重载
class Person {
public:

	//1、成员函数重载+号
	//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;
	//}

	int m_A;
	int m_B;
};


//2、全局函数重载+号 
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 p4 = p1 + 100;// Person + int
	cout << "p4.m_A = " << p4.m_A << endl;
	cout << "p4.m_B = " << p4.m_B << endl;

	Person p3 = p1 + p2;

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





int main() {

	test01();

	system("pause");
	return 0;
}


2、左移运算符重载

#include <iostream>
using namespace std;
#include <string>

//左移运算符

class Person {
	friend ostream& operator<<(ostream& cout, Person& p);
//public:

public:
	Person(int a, int b) {
		m_A = a;
		m_B = b;
	}
private:
	//利用成员函数重载 左移运算符 p,operator<<(cout) 简化版本p<<cout
	//不会利用成员函数重载<<运算符 因为无法实现 cout在左侧
	/*void operator<<(cout) {

	}*/

	int m_A;
	int m_B;

};
//只能利用全局函数重载左移运算符
ostream& operator<<(ostream& cout, Person& p) {//本质:operator<<(cout,p)  简化cout<<p
	cout << "m_A = " << p.m_A << " m_B = " << p.m_B ;
	return cout;

}

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

	Person p(10,10);

	cout << p << endl;;
}

int main() {

	test01();

	system("pause");
	return 0;
}

3、递增运算符重载

#include <iostream>
using namespace std;
#include <string>

//递增运算符重载

//自定义整型
class MyInteger {

	friend ostream& operator<<(ostream& cout, MyInteger myint);

public:
	MyInteger() {
		m_Num = 0;
	}

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

	//重载后置++运算符
	//void 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.m_Num;
	return cout;
}

void test01() {
	MyInteger myint;
	//cout << ++myint << endl;
	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;
#include <string>

//赋值运算符重载
class Person {
public:

	Person(int age) {
		m_Age=new int(age);
	}

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

	//重载 赋值运算符
	Person& operator=(Person& p) {
		//编译器提供浅拷贝
		//m_Age = p.m_Age;
		
		//应该先判断是否有属性在堆区,如果有先释放干净,融合再深拷贝
		if (m_Age != NULL) {
			delete m_Age;
			m_Age = NULL;
		}

		//深拷贝
		m_Age = new int(*p.m_Age);

		return *this;
	}

	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();

	system("pause");
	return 0;
}


5、关系运算符重载

#include <iostream>
using namespace std;
#include <string>

//重载关系运算符

class Person {
public:
	Person(string name, int age) {
		m_Name = name;
		m_Age = age;
	}

	//重载关系运算符==
	bool operator== (Person& p) {
		if (this->m_Name == p.m_Name && this->m_Age == p.m_Age) {
			return true;
		}
		return false;
	}

	//重载关系运算符!=
	bool operator!= (Person& p) {
		if (this->m_Name == p.m_Name && this->m_Age == p.m_Age) {
			return false;
		}
		return true;
	}

	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;

	}

}


int main() {

	test01();

	system("pause");
	return 0;
}


6、函数调用运算符重载

#include <iostream>
using namespace std;
#include <string>

//函数调用运算符重载

//打印输出类
class MyPrint {
public:

	//重载函数调用运算符
	void operator()(string test){
		cout << test << endl;
	}
};

void test01() {
	MyPrint myPrint;

	myPrint("hello world");//由于使用起来非常类似于函数调用 因此称为仿函数

}

//仿函数非常灵活,没有固定的写法
//加法类

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

void test02() {
	MyAdd myadd;
	int ret=myadd(100, 100);
	cout << "ret = " << ret << endl;

	//匿名函数对象
	cout << MyAdd()(100, 100) << endl;
}

int main() {

	//test01();
	test02();


	system("pause");
	return 0;
}

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

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

相关文章

算法:移除数组中的val的所有元素---双指针[2]

1、题目&#xff1a; 给你一个数组 nums和一个值 val&#xff0c;你需要原地移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并原地修改输入数组。 元素的顺序可以改变。你不需要考虑数组…

外包干了2个月,技术退步明显了...

先说一下自己的情况&#xff0c;大专生&#xff0c;19年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年8月份&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

AFG EDI 解决方案

AFG一直是汽车行业出境物流的专家&#xff0c;不仅运输汽车&#xff0c;同时也提供模块化IT解决方案&#xff0c;用于接收、控制、互联以及整个车辆调度过程的可视化和监控。 对于物流行业而言&#xff0c;如果已经确定了供应链整合的目标&#xff0c;但却没有明确的计划及足够…

渗透测试:Linux提权精讲(四)之sudo方法第四期

目录 写在开头 sudo screen sudo script sudo sed sudo service sudo socat sudo ssh sudo ssh-keygen sudo strace sudo systemctl sudo tcpdump sudo tee sudo timedatectl sudo tmux sudo vi sudo wall sudo watch sudo wget sudo xxd sudo zip 总结…

软件测试/测试开发丨Web自动化测试 cookie复用

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27165 一、cookie简介 cookie是一些数据&#xff0c;存储于用户电脑的文本文件中 当web服务器想浏览器发送web页面时&#xff0c;在链接关闭后&#xff0c…

RK3588平台产测之ArmSoM-W3 DDR压力测试

1. 简介 RK3588从入门到精通 ArmSoM团队在产品量产之前都会对产品做几次专业化的功能测试以及性能压力测试&#xff0c;以此来保证产品的质量以及稳定性 优秀的产品都要进行多次全方位的功能测试以及性能压力测试才能够经得起市场的检验 2. 环境介绍 硬件环境&#xff1a; …

java八股文面试[多线程]——FutureTask

FutureTask介绍 FutureTask是一个可以取消异步任务的类。FutureTask对Future做的一个基本实现。可以调用方法去开始和取消一个任务。 一般是配合Callable去使用。 异步任务启动之后&#xff0c;可以获取一个绑定当前异步任务的FutureTask。 可以基于FutureTask的方法去取消…

APP运营的核心是什么?

APP的运营的核心就是用户运营&#xff0c;主要分为四个指标&#xff1a;用户拉新、留存、促活、转化&#xff08;营收&#xff09;下面进行一一分析。 一、APP用户拉新&#xff1a;提高用户精准度 用户拉新&#xff0c;无非是把APP推广出去进行品牌曝光&#xff0c;提高下载量…

将 ordinals 与 比特币智能合约集成 : 第 1 部分

将序数与比特币智能合约集成&#xff1a;第 1 部分 最近&#xff0c;比特币序数在区块链领域引起了广泛关注。 据称&#xff0c;与以太坊 ERC-721 等其他代币标准相比&#xff0c;Ordinals 的一个主要缺点是缺乏对智能合约的支持。 我们展示了如何向 Ordinals 添加智能合约功…

CPU与GPU渲染的差异有哪些?最佳3D渲染 GPU推荐

什么是 GPU 渲染&#xff1f; GPU 渲染使您可以使用显卡而不是 CPU 进行渲染。从广义上讲&#xff0c;GPU渲染允许许多并行操作同时运行。这提高了执行速度&#xff0c;因为现代 GPU 旨在计算大量数据。快速渲染使 GPU 能够实时处理图形。但是&#xff0c;在这种情况下&#x…

前后端中的异步和事件机制 | 前后端开发

前言 在前后端程序设计开发工作中&#xff0c;小伙伴们一定都接触过事件、异步这些概念。出现这些概念的原因之一是&#xff0c;我们的代码在执行过程中所涉及的逻辑在不同的场合下执行时间的期望是各不相同的。为了尽量做到充分利用CPU等资源做尽可能多的事&#xff0c;免不了…

JWT解决跨域问题详解

介绍 在前后端不分离时&#xff0c;我们利用前面讲过的Spring Security的各种知识点&#xff0c;就可以实现对项目的权限管控。但是在前后端分离时&#xff0c;尤其是在引入了Spring Security后的前后端分离时&#xff0c;我们从前端发来的请求&#xff0c;就会存在一些问题。…

IBM Spectrum LSF Process Manager —— 设计、记录和运行复杂的计算工作流

亮点 ● 快速创建复杂的分布式工作流 ● 开发可重复的最佳实践 ● 自信地运行关键工作流程 ● 提高流程可靠性 IBM Spectrum LSF Process Manager 使您能够设计和自动化计算或分析流程&#xff0c; 捕获和保护可重复的最佳实践。 使用直观的图形界面…

时序预测 | MATLAB实现PSO-LSSVM粒子群算法优化最小二乘支持向量机时间序列预测未来

时序预测 | MATLAB实现PSO-LSSVM粒子群算法优化最小二乘支持向量机时间序列预测未来 目录 时序预测 | MATLAB实现PSO-LSSVM粒子群算法优化最小二乘支持向量机时间序列预测未来预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.Matlab实现PSO-LSSVM时间序列预测未…

Springboot 实践(13)spring boot 整合RabbitMq

前文讲解了RabbitMQ的下载和安装&#xff0c;此文讲解springboot整合RabbitMq实现消息的发送和消费。 1、创建web project项目&#xff0c;名称为“SpringbootAction-RabbitMQ” 2、修改pom.xml文件&#xff0c;添加amqp使用jar包 <!-- RabbitMQ --> <dependency&g…

如何确认this的值

<script>/*如何确认this的值1.全局执行环境严格模式&#xff0c;非严格模式&#xff1a;全局对象window2.函数内部环境2.1直接调用严格模式下&#xff1a;undefined非严格模式&#xff1a;全局对象&#xff08;window&#xff09;2.2对象方法调用严格模式&#xff0c;非严…

OCR扫描仪选购技巧,轻松将纸质文件转为电子文本

OCR&#xff08;光学字符识别&#xff09;扫描仪是一种特殊扫描仪&#xff0c;能够将纸质文件上的文字转换为可编辑的电子文本。在选购OCR扫描仪时&#xff0c;有一些技巧可以帮助我们选择到适合自己需求的产品。以下介绍几个简单实用的OCR扫描仪选购技巧。 首先&#xff0c;需…

使用pip下载第三方软件包报错超时处理方法

报错如下&#xff1a; WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by ‘ReadTimeoutEr ror(“HTTPSConnectionPool(host‘files.pythonhosted.org’, port443): Read timed out. (read timeout15)”)’: /p…

【AGC】云数据库API9开发问题汇总

【问题描述】 云数据库HarmonyOS API9 SDK已经推出了一段时间了&#xff0c;下面为大家汇总一些在集成使用中遇到的问题和解决方案。 【问题分析】 1. 报错信息&#xff1a;数据库初始化失败&#xff1a;{“message”&#xff1a;“The object type list and permission …

开启Clash和系统代理后Chrome无法打开网页但Edge正常

今天早上打开电脑准备摸鱼&#xff0c;发现Chrome打不开网页了。检查Clash正常&#xff0c;切换了节点&#xff0c;依然不行。关闭系统的代理可以解决。不然只提示ERR_TIMED_OUT。 各种研究配置&#xff0c;然后发现Edge却又不受影响。 通过火绒发现Chrome是有连接到7890端口的…