C++——运算符重载

news2024/11/28 6:38:19

1、运算符重载的概念

  1. 运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。
  2. 运算符重载的目的是让语法更加简洁
  3. 运算符重载不能改变本来寓意,不能改变基础类型寓意
  4. 运算符重载的本质是另一种函数调用(是编译器去调用)
  5. 这个函数统一的名字叫operator
  6. 重载函数可以写成全局或成员函数
  7. 重载函数如果写成全局的,那么双目运算符左边的是第一个参数,右边是第二个参数
  8. 重载函数如果写成成员函数,那么双目运算符的左边是this,右边是第一个参数
  9. 不能改变运算符优先级,不能改变运算符的参数个数。

2、加号运算符重载

1、同类型的对象相加

#include <iostream>
using namespace std;

class Maker
{
public:
	Maker(int id, int age)
	{
		this->id = id;
		this->age = age;
	}
	//写成成员函数,那么只需要一个参数,这个参数是加号的右边
	Maker operator+(Maker& m2)
	{
		Maker temp(this->id + m2.id, this->age + m2.age);
		return temp;
	}
public:
	int id;
	int age;
};
//重载加号运算符  全局函数方式
//Maker operator+(Maker &p1,Maker &p2)
//{
//	Maker temp(p1.id + p2.id, p1.age + p2.age);
//	return temp;
//}
void test()
{
	Maker m1(1, 10);
	Maker m2(2, 20);

	Maker m3 = m1 + m2;
	cout << m3.id << endl;
	cout << m3.age << endl;
}
int main()
{
	test();
	return 0;
}

2、不同对象类型相加

#include <iostream>
using namespace std;

class Maker
{
public:
	Maker(int id, int age)
	{
		this->id = id;
		this->age = age;
	}
	//写成成员函数,那么只需要一个参数,这个参数是加号的右边
	Maker operator+(Maker& m2)
	{
		Maker temp(this->id + m2.id, this->age + m2.age);
		return temp;
	}
public:
	int id;
	int age;
};

class Student
{
public:
	Student() {
		mid = 0;
	}
	Student(int id) {
		mid = id;
	}
public:
	int mid;
};

Maker operator+(Maker& m1, Student& s1)
{
	Maker temp(m1.id + s1.mid, 20);
	return temp;
}
Student operator+(Student& s1, Maker& m1)
{
	Student temp(s1.mid + m1.id);
	return temp;
}
void test()
{
	Maker m1(1, 10);
	Student s1(2);
	Maker m3 = m1 + s1;
	cout << m3.id << endl;
	
	Student s2 = s1 + m1;
	cout << s2.mid<<endl;
}
int main()
{
	test();
	return 0;
}

3、减号运算符重载

#include <iostream>
using namespace std;

class Maker
{
public:
	Maker(int id, int age)
	{
		this->id = id;
		this->age = age;
	}
	//写成成员函数,那么只需要一个参数,这个参数是加号的右边
	Maker operator-(Maker& m2)
	{
		Maker temp(this->id - m2.id, this->age - m2.age);
		return temp;
	}
public:
	int id;
	int age;
};
void test()
{
	Maker m1(10, 18);
	Maker m2(5, 15);

	Maker m3 = m1 - m2;
	cout << m3.id << endl;
	cout << m3.age << endl;
}
int main()
{
	test();
	return 0;
}

4、左移运算符重载

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

class Maker
{
public:
	Maker(int id, string name)
	{
		this->id = id;
		this->name = name;
	}
public:
	int id;
	string name;
};
//1、形参和实参是一个对象
//2、不能改变库类中的代码
//3、ostream中把拷贝构造函数私有化了
//4、如果要和endl一起使用,那么必须返回ostream的对象
ostream& operator<<(ostream& out, Maker& m1)
{
	cout << m1.id << " " << m1.name << endl;
	return out;
}
void test()
{
	Maker m1(10, "薯片");
	cout << m1 << endl;
}
int main()
{
	test();
	return 0;
}

5、右移运算符

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

class Maker
{
public:
	Maker(int id, string name)
	{
		this->id = id;
		this->name = name;
	}
	int getAge() {
		return this->id;
	}
public:
	int id;
	string name;
};

istream &operator>>(istream& in, Maker& m1)
{
	cin >> m1.id;
	cin >> m1.name;
	return in;
}
void test()
{
	Maker m(10, "薯片");
	cin >> m;
	cout << m.getAge() << endl;
}
int main()
{
	test();
	return 0;
}

6、关系运算符重载

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

class Maker
{
public:
	Maker() {};
	Maker(int id)
	{
		this->id = id;
	}
	bool operator==(Maker &m) {
		if (this->id == m.id) {
			return true;
		}
		return false;
	}
	bool operator!=(Maker& m) {
		if (this->id != m.id) {
			return true;
		}
		return false;
	}
public:
	int id;
};

void test()
{
	Maker m1(10);
	Maker m;
	if (m1 == m) {
		cout << "真" << endl;
	}
	else {
		cout << "假" << endl;
	}

	if (m1 != m) {
		cout << "真" << endl;
	}
	else {
		cout << "假" << endl;
	}
	
}
int main()
{
	test();
	return 0;
}

7、前置加加和后置加加

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

class Maker
{
	friend ostream& operator<<(ostream& os, Maker& m);
public:
	Maker(int id)
	{
		this->id = id;
	}
	//重置前置加加
	Maker& operator++()
	{
		++this->id;
		return *this;
	}
	//重置后置加加
	Maker operator++(int)//占位参数,必须是int
	{
		Maker tmp(*this);//tmp是局部变量,局部变量不能以引用返回
		++this->id;
		return tmp;
	}
private:
	int id;
};

ostream& operator<<(ostream& out, Maker& m) {
	cout << m.id << endl;
	return out;
}

void test()
{
	Maker m1(10);
	cout << ++m1;
	cout << m1++;
	
	
}
int main()
{
	test();
	return 0;
}

8、智能指针类

8.1、智能指针类是管理另一个类的对象的释放

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

class Maker
{
public:
	Maker() {
		cout << "Maker的无参构造" << endl;
	}
	~Maker() {
		cout << "Maker的析构函数" << endl;
	}

};

//智能指针类
class SmartPoint
{
public:
	SmartPoint(Maker* p)
	{
		this->pMaker = p;
	}
	~SmartPoint()
	{
		cout << "SmartPoint的析构函数" << endl;
		if (this->pMaker != NULL)
		{
			delete this->pMaker;
			this->pMaker == NULL;
		}

	}
private:
	Maker* pMaker;
};
void test()
{
	Maker* p = new Maker;//在堆区开辟的数据,需要手动delete掉

	SmartPoint sm(p);//栈区  会调用析构函数
	//当test()函数结束时,会调用smartPoint的析构函数。
	//在这析构函数中delete了Marker的对象,会调用Maker的析构函数
}
int main()
{
	test();
	return 0;
}

在这里插入图片描述

8.2、指针运算符重载

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

class Maker
{
public:
	Maker() {
		cout << "Maker的无参构造" << endl;
	}
	void printMaker()
	{
		cout << "Hello Maker" << endl;
	}
	~Maker() {
		cout << "Maker的析构函数" << endl;
	}

};

//智能指针类
class SmartPoint
{
public:
	SmartPoint(Maker* p)
	{
		this->pMaker = p;
	}
	//重载指针运算符
	Maker* operator->()
	{
		return this->pMaker;
	}
	~SmartPoint()
	{
		cout << "SmartPoint的析构函数" << endl;
		if (this->pMaker != NULL)
		{
			delete this->pMaker;
			this->pMaker == NULL;
		}

	}
private:
	Maker* pMaker;
};
void test()
{
	Maker* p = new Maker;

	SmartPoint sm(p);
	
	sm->printMaker();
}
int main()
{
	test();
	return 0;
}

在这里插入图片描述

8.3、重载星号

	//重载星号
	Maker& operator*()
	{
		return *pMaker;
	}

void test()
{
	Maker* p = new Maker;

	SmartPoint sm(p);
	(*sm).printMaker();
}

9、重载函数调用符号

9.1、类里有重载函数调用符号的类实例化的对象也叫仿函数

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

//一个类如果重载了函数调用符号,那么这个类实例化出的对象也叫仿函数
//仿函数的作用:1、方便代码维护
class Maker
{
public:
	Maker(string name) 
	{
		this->m_Name = name;
	};
	void printMaker()
	{
		cout << "hello " <<this->m_Name<< endl;
	}
	//重载()
	void operator()()
	{
		cout << "hello" << endl;
	}
public:
	string m_Name;
};


void test()
{
	Maker func("薯片");
	func();//看着像函数,但func是对象

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

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

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

相关文章

【半监督医学图像分割 2021 TMI】SimCVD 论文翻译

文章目录【半监督医学图像分割 2021 TMI】SimCVD 论文翻译摘要1. 介绍2. 相关工作3. 方法3.1 总览3.2 任务制定3.3 基础体系结构3.4 边缘对比蒸馏4. 实验4.1 数据集和预处理4.2 实现细节5. 结论5.1 实验&#xff1a;LA5.2 实验&#xff1a;Pancreas6. 消融研究6.1 边界感知对比…

嵌入式ARM工业边缘计算机BL302的CAN总线接口如何设置?

CAN 接口如图所示&#xff0c;输入如下命令&#xff1a; ifconfig -a //查看所有网卡 如果 FlexCAN 驱动工作正常的话就会看到 CAN 对应的网卡接口&#xff0c;如图。从图中可 以看出&#xff0c;有一个名为“can0”的网卡&#xff0c;这个就是 BL302 板上的 CAN1 接口对应的 c…

借助亚马逊云科技,Early Data完成数据云上安家、实现降本增效

数字经济时代&#xff0c;伴随着大数据应用的不断深入&#xff0c;企业对用户及市场发展动向的判断正变得愈加精准。数据资产不再是虚无缥缈的东西&#xff0c;而是可以帮助企业切切实实找到业务增长点&#xff0c;洞悉潜在商机&#xff0c;拥有巨大潜力的“宝藏”。IDC数据显示…

【 mybatis的工作流程】

目录一.mybatis执行流程二.使用工具类简化项目&#xff08;反射的体现&#xff09;2.1 Sqlsession工厂对像2.2 工具类&#xff08;可直接放在工具类使用&#xff09;一.mybatis执行流程 1.1 读取主配置文件mybatis-config.xml&#xff0c;获得运行环境和数据库连接。 1.2 加载映…

对象之间的关系

目录1. 依赖2. 关联3. 聚合4. 组合Java的对象/类之间有四种关系&#xff1a;依赖、关联、组合、聚合。 1. 依赖 依赖&#xff08;Dependency&#xff09;&#xff1a; 一个对象的功能依赖于另一个对象。 类比&#xff1a;人类生存依赖食物和空气 体现&#xff1a;被依赖者体…

Ethercat系列(5)TWcat3激活过程的协议分析(续1)

顺序写系统时间偏移从-》主顺序写时间延迟主-》从从-》主顺序写分布式时钟启动主-》从从-》主读多重写系统时间主-》从从-》主顺序写应用层控制主-》从从-》主顺序读错误计数器主-》从从-》主顺序读应用层状态主-》从从-》主顺序读应用层&#xff0c;广播写错误计数器主-》从从…

2023 年首轮土地销售活动来了 与 The Sandbox 一起体验「体素狂热」!

2 月 14 日晚上 11 点&#xff0c;开始你的体素冒险。 The Sandbox 很高兴推出 2023 年的第一次土地销售活动。欢迎来到「体素狂热 (Voxel Madness)」&#xff01; 简要概括 土地销售抽奖活动将于北京时间 2 月 14 日星期二晚上 11 点开始 「体素狂热」 土地销售活动将于 2 月…

企业公众号菜单添加视频的完整教程(组图)

公众号实用教程&#xff0c;公众号运营教程。 有公众号的朋友&#xff0c;看过来&#xff0c;今天来教教大家&#xff0c;在企业微信公众号中如何调用视频列表。先上一个效果吧&#xff1a; 最终效果的截图 -关注酷播公众号&#xff0c;查看实际的应用效果&#xff08;在本公众…

【shell 编程大全】脚本交互 以及表达式

脚本交互 以及表达式 1. 概述 嗨&#xff0c;我又来继续分享了。今天分享的内容是脚本交互&#xff0c;再开始接下来的分享开始之前&#xff0c;让我们来回顾下上一次(【shell 编程大全】内容格式化以及多样化输出)的内容&#xff1a; 内容格式化 重定向管道符后台执行信息符号…

C语言学习_DAY_3_基本数据类型_运算符与表达式【C语言学习笔记】

目录 I. 基本数据类型 II. 复杂的输出和输入语句编写 III. 运算符与表达式 III.I 算术运算符 III.II 关系运算符 III.III 逻辑运算符 III.IV 位运算符 III.V 三目运算符 III.VI 逗号运算符 高质量博主&#xff0c;点个关注不迷路&#x1f338;&#x1f338;&#x1f3…

电脑怎么备份文件?含泪分享3种免费的方法

电脑里面保存着我们很多文件数据&#xff0c;比如工作文档、珍贵的照片、喜欢的音乐或者视频等。你很可能会遇到下面的原因而丢失数据&#xff1a;清空回收站&#xff0c;或者使用永久删除文件的方法&#xff1b;电脑出现故障&#xff0c;比如硬盘故障、系统崩溃&#xff1b;病…

Python实现基于openCV+百度智能云平台实现《1:N人脸考勤机》文章最后附带源码!

目录 一、 项目介绍 1.1 项目名称 1.2 项目简介 1.3 项目物料 1.4 技术栈 二、 项目架构 三、项目细节 3.1 环境搭建 3.2 利用opencv实现摄像头调取及相关图像的采集 3.3 利用aips上传图像和结果返回 3.4 结果优化和处理 3.5 可扩展性 3.6 遗留问题和…

中睿天下获评2022年度中关村网信联盟工业互联网标准工作特别贡献奖

近日&#xff0c;中关村网络安全与信息化产业联盟&#xff08;简称“CCAIA”&#xff09;于线上召开联盟第二届第五次会员大会&#xff0c;来自全国的联盟成员代表、行业专家等100余人出席会议&#xff0c;共同听取了联盟2022年工作总结与2023年工作计划&#xff0c;大会设置了…

春招Leetcode刷题日记-D2-贪心算法-训练专题

D2-贪心算法-训练专题贪心算法使用总结力扣605. 种花问题思路代码力扣763. 划分字母区间思路代码另一种思路贪心算法使用总结 当我们意识到&#xff0c;满足贪心算法三要素时候&#xff0c;解决贪心算法问题的时候&#xff0c;一定要遵循的步骤&#xff1a; 1、读懂题目限制条…

数据结构与算法:7种必须会的排序以及3种非基于比较排序

1.什么是排序 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序…

大数据专业职业前景如何

大数据专业毕业生未来的岗位选择空间比较大&#xff0c;有三大类岗位可选择分别是大数据开发岗位、大数据分析岗位和大数据运维岗位&#xff0c;在不同的行业和技术体系结构下这些岗位也包含很多细分的岗位。 大数据开发岗位分为平台研发岗位和行业场景开发岗位两大类&#xf…

usbmon---Linux下USB数据传输监控

文章目录Usb包的总类&#xff08;1&#xff09;令牌包&#xff08;2&#xff09;数据包&#xff08;3&#xff09;握手包&#xff08;4&#xff09;特殊包Usb包的事务usb四种传输类型批量传输等时传输中断传输控制传输usbmon的使用&#xff08;1&#xff09;首先检测内核是否支…

算法刷题打卡第90天:表现良好的最长时间段

表现良好的最长时间段 难度&#xff1a;中等 给你一份工作时间表 hours&#xff0c;上面记录着某一位员工每天的工作小时数。 我们认为当员工一天中的工作小时数大于 8 小时的时候&#xff0c;那么这一天就是「劳累的一天」。 所谓「表现良好的时间段」&#xff0c;意味在这…

常量const、引用、指针的大杂烩

文章目录1 普通引用1.1 对普通值的普通引用1.2 对常量值的普通引用1.3 对普通指针的普通引用1.4 对常量指针的普通引用1.5 对指针常量的普通引用1.6 对指向常量的指针常量的普通引用2 常量引用2.1 对普通值的常量引用2.2 对常量值的常量引用2.3 对普通指针的常量引用2.4 对常量…

2023年留学基金委(CSC)西部/地方合作项目选派办法及解读

2023年2月13日国家留学基金委&#xff08;CSC&#xff09;官方网站发布了2023年西部地区人才培养特别项目、地方合作项目通知。知识人网小编现将其选派工作流程及选派办法原文转载并加以解读、提出建议。知识人网建议1. 邀请函是公派申请的必备条件。对于外语语言证明未达标者&…