C++运算符重载【加号、左移、递增、指针、赋值、中括号、关系、函数调用】,统统载了

news2024/11/28 10:51:13

学习目标

在c++对象的学习中,我们会使用到运算符重载,接下来大家一起学习一下吧!
在这里插入图片描述


学习内容

运算符重载:
operator overloading运算符重载是一种形式的C++多态
即对已有运算符进行重新定义,赋予新的功能,使其适配不同的类型。
形式:operator op(对象参数)

💖总结(建议仔细阅读!!!):

1、一元运算符:++ – a-- ++a-- 二元运算符:a+b
2、成员运算符函数: 一元是没有参数
二元只有一个参数:operator+(Time& t)
3、全局运算符函数: 一元有一个参数
二元有两个参数:operator+(Time& t1,Time& t2)
4、运算符重载的符号必须符合C++要求,不能自己虚构一个运算符,比如@
5、不能违反原来的运算规则
6、不能重载的运算符:

(1)sizeof
(2). 成员运算符 p.age
(3)* 成员指针运算符
(4):: 作用域运算符
(5)?: 条件运算符

7、只能在成员函数内重载的运算符

(1)= () [] -> 四个
(2)<< >> 只能通过全局函数和友元配合使用
(3)不要重载&&和||两个,因为无法实现短路的规则, flag&&(flag1||flag2)


学习代码

接下里代码演示一下如何去实现各个运算符的重载:

1、加号运算符重载:

#include<iostream>
using  namespace std;

class Time {
public:
	int m_hour;
	int m_min;
	Time() {
		m_hour = 0;
		m_min = 0;
	}
	Time(int hour, int min) {
		m_hour = hour;
		m_min = min;
	}
	void addtime(int hour, int min) {
		m_hour += hour+(min+m_min)/ 60;
		m_min = (min+m_min)% 60;
	}
	//调用成员方法
	Time count2(Time& t) {
		Time time;
		time.m_hour = this->m_hour + t.m_hour + (this->m_min + t.m_min) / 60;
		time.m_min= (this->m_min + t.m_min) % 60;
		return time;
	}
	//运算符重载
	/*Time operator+(Time& t) {
		Time time;
		time.m_hour = this->m_hour + t.m_hour + (this->m_min + t.m_min) / 60;
		time.m_min = (this->m_min + t.m_min) % 60;
		return time;
	}*/

	void showtime() {
		cout << "小时:" << m_hour << "分钟:" << m_min << endl;

	}


};
//全局函数运算符重载,只能与成员方法的运算符存在一个
Time operator+(Time& t1,Time& t2){

	Time time;
	time.m_hour = t1.m_hour + t2.m_hour + (t1.m_min + t2.m_min) / 60;
	time.m_min = (t1.m_min + t2.m_min) % 60;
	return time;
}


int main() {
	/*Time t1(1, 20);
	t1.showtime();
	t1.addtime(2, 50);
	t1.showtime();*/

	Time t1(1, 40);
	Time t2(2, 30);
	//调用成员方法相加
	Time t3 =t1.count2(t2);
	t3.showtime();
	//加号运算符重载
	Time t4 = t1 + t2;
	t4.showtime();


	return 0;
}

2、左移运算符重载:

#include <iostream>
using namespace std;

class Person {
	friend ostream& operator<<(ostream& out, Person& p);
private:
	int age;
	int height;
public:
	Person(int age, int height) {
		this->age = age;
		this->height = height;
	}
	void show() {
		cout << "年龄:" << age << " 身高:" << height << endl;
	}


};
//左移运算符重载:
//void operator<<(ostream& out, Person& p) {
//	cout << "年龄:" <<p.age << " 身高:" << p.height << endl;
//}
ostream& operator<<(ostream& out, Person& p) {
	cout << "年龄:" << p.age << " 身高:" << p.height << endl;
	return out;
}


int main() {
	Person p1(21, 183);
	p1.show();
	cout << p1;
	cout << p1 << endl;//operator(cout,p1) ..operator(void,cout),因此修改返回值即可


	return 0;
}

3、递增运算符重载

#include <iostream>
using namespace std;

class Num {
//	friend ostream& operator<<(ostream& out, Num& n);
	friend ostream& operator<<(ostream& out, Num n);
private:
	int num;
public:
	Num() {
		num = 0;
	}
	Num(int num) {
		this->num = num;
	}
	//前置++
	Num& operator++() {
		num++;
		return *this;
	}
	//后指++
	Num operator++(int) {//占位参数
		Num temp = *this;
		num++;
		return temp;
	}


};

//ostream& operator<<(ostream& out, Num& n) {
//	out << "数字num为:" << n.num ;
//	return out;
//}

ostream& operator<<(ostream& out, Num n) {
	out << "数字num为:" << n.num;
	return out;
}

int main() {
	Num n1(1);
	cout << n1 << endl;
	cout << ++n1 << endl;
	cout << n1++ << endl;
	cout << n1 << endl;

	return 0;
}

4、指针运算符重载

#include <iostream>
using namespace std;

class Person {
private:
	int age;
public:

	Person(int age) {
		this->age = age;
	}
	void show() {
		cout << "年龄为:" << this->age << endl;
	}
	~Person() {
		cout << "Person的析构函数。。。" << endl;
	}
};

//智能指针类
class smartpointer {
public:
	Person* operator->() {//指针重载
		return this->person;
	}
	Person& operator*() {//指针重载
		return *person;
	}
	
	smartpointer(Person *p) {
		person = p;
	}
	Person* person;
	~smartpointer() {
		cout << "smartpointer的析构函数。。。" << endl;
		if (person != nullptr) {
			delete person;
			person = nullptr;
		}
	}

};


int main() {
	Person* p1 = new Person(21);
	p1->show();
	(*p1).show();

	//delete p1;
	smartpointer s1(p1);
	s1->show();
	(*s1).show();

	return 0;
}

5、赋值运算符重载

#include <iostream>
#pragma warning(disable:4996)
using namespace std;

class Person {
public:
	char* name;

	Person& operator=(const Person& p) {//赋值运算符重载
		if (this->name!= nullptr) {
			delete[] this->name;
			this->name = nullptr;
		}
		this->name = new char[strlen(p.name) + 1];
		strcpy(this->name, p.name);
		return *this;
	}


	Person() {
		cout << "默认构造函数" << endl;
	}
	Person(const char* n) {
		name = new char[strlen(n) + 1];
		strcpy(name, n);
	}
	Person(Person& p) {
		name = new char[strlen(p.name) + 1];
		strcpy(name, p.name);
	}



	~Person() {
		cout << "Person的析构函数" << endl;
		if (name != nullptr) {
			delete[]name;
			name = nullptr;
		}
	}

};


int main() {

	Person p1("Tom");
	Person p2;
	p2 = p1;

	cout << "p1的名字:" << p1.name << endl;
	cout << "p2的名字:" << p2.name << endl;

	Person p3(p1);
	cout << "P3的名字:" << p3.name << endl;

	return 0;
}

6、中括号运算符重载

#include<iostream>
using namespace std;

class Array {
public:
	int m_num;
	int* arr;
	Array(int size) {
		m_num = 10;
		arr = new int[size];
		for (int i = 0; i < size; i++) {
			arr[i] = i;
		}
	}
	int getnum(int poisition) {
		return arr[poisition];
	}

	int& operator[](int position) {//中括号运算符重载
		return arr[position];
	}

};


int main() {
	Array arr1(5);
	for (int i = 0; i < 5; i++) {
		cout << arr1.arr[i] << endl;
	}
	cout << "==============" << endl;
	cout << arr1.getnum(1) << endl;
	cout << "==============" << endl;
	cout << arr1[2] << endl;

	return 0;
}

7、关系运算符重载

#include<iostream>
#include<string>

using  namespace std;

class Person {
public:
	string m_name;
	int m_age;
	Person(string  name, int age) {
		this->m_age = age;
		this->m_name = name;
	}
	bool operator==(const Person& p) {//==关系运算符重载
		return (this->m_name == p.m_name && this->m_age == p.m_age);
	}
	bool operator!=(const Person& p) {//!=关系运算符重载
		return !(this->m_name == p.m_name && this->m_age == p.m_age);
	}

};

int main() {
	Person p1("Tom", 18);
	Person p2("Lilua", 20);
	cout << p1.m_name << endl;
	cout << p2.m_name << endl;

	if (p1 == p2) {
		cout << "p1==p2" << endl;
	}
	else {
		cout << "p1!=p2" << endl;
	}

	if (p1 != p2) {
		cout << "p1!=p2" << endl;
	}
	else {
		cout << "p1==p2" << endl;
	}


	return 0;
}

8、函数调用重载

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

class Print {
public:
	void operator()(string str) {//函数调用运算符重载
		cout << str << endl;
	}
	int operator()(int a, int b) {//函数调用运算符重载
		return a + b;
	}
};


int main() {

	Print p;
	p("nihao,my world");
	int sum = p(1, 2);//仿函数
	cout << sum << endl;

	return 0;
}

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

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

相关文章

我的创作纪念日

机缘 成为创作者的初心&#xff1a; 让大家目光向我看齐&#xff0c;来我这CV&#xff08;狗头&#xff09; 收获 在创作的过程中都有哪些收获 获得了28粉的关注获得了252赞、83评论、233474阅读量、548收藏 &#xff08;还好我自己点了几个赞&#xff0c;不然250赞显得我好…

安洵杯-复现

reee 主要就是这个函数 void __noreturn sub_401640() {char Buffer[52]; // [esp0h] [ebp-60h] BYREFchar ArgList[16]; // [esp34h] [ebp-2Ch] BYREFint v2; // [esp44h] [ebp-1Ch]CHAR Text[13]; // [esp48h] [ebp-18h] BYREFint v4; // [esp55h] [ebp-Bh]__int16 v5; // [e…

《Redis实战篇》一、短信登录

1.1、导入黑马点评项目 1.1.1 、导入SQL 1.1.2、有关当前模型 手机或者app端发起请求&#xff0c;请求我们的nginx服务器&#xff0c;nginx基于七层模型走的事HTTP协议&#xff0c;可以实现基于Lua直接绕开tomcat访问redis&#xff0c;也可以作为静态资源服务器&#xff0c;轻…

Java并发常见面试题(二)

为什么要使用多线程&#xff1f; 从整体上来看 从计算机底层来说&#xff1a; 线程可以看作是轻量级的进程&#xff0c;是最小的程序执行单位&#xff0c;线程间的切换和调度的成本远远小于进程。另外&#xff0c;多核CPU时代&#xff0c;多个线程可以同时运行&#xff0c;这…

PCB布线及后仿真验证过程(干货满满,建议收藏)

一 布线的基本要求 1. 布线次序考虑 1) 规则驱动布线遵循的基本步骤 定义禁布区&#xff0c;或控制区&#xff1b; 若有规则约束&#xff0c;要求设置规则&#xff1b; 试布线&#xff0c;评估单板是否可以布通&#xff0c;若不能布通&#xff0c;需要采用策略&#x…

Linux测试常用命令

Linux测试常用命令1.Linux安装2.linux常用命令1.一些Linux环境下的基本操作2. 目录管理3.文件管理1.Linux安装 在VMWare虚拟机上安装linux操作系统&#xff0c;得到一个ip&#xff0c;然后通过MobaXterm远程连接linux并进行命令操作。 公司测试的时候是直接拿到服务器ip&…

食品经营许可证办理要什么材料

食品经营许可证办理要什么材料 1.食品经营许可申请书&#xff1b; 2.营业执照或者其他主体资格证明文件复印件&#xff1b; 3.法定代表人&#xff08;负责人&#xff09;和食品安全管理人员的名册、身份证明复印件。申请人委托他人办理食品经营许可申请的&#xff0c;代理人…

代码审计-2 SQL注入

代码审计之SQL注入审计流程ThinkPHP框架ThinkPHP的路由PbootCMSPbootCMS留言处存在SQL注入代码分析ThinkPHP框架 ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架 MVC模式的php开发框架 MVC&#xff1a;一种软件架构模式&#xff0c;把系统分为三个部分&#xff1a…

基于OpenDaylight和OVSDB搭建VxLAN网络

1 简介 本文主要介绍基于OpenDaylight子项目OVSDB中的southbound组件来搭建VxLAN网络&#xff0c;包括初始环境搭建和southbound RestConf API调用等。OpenDaylight中的northbound组件也可以用来创建VxLAN网络&#xff0c;但northbound不是基于yang的且OVSDB封装的不好&#x…

overflow属性详解

overflow属性详解_桃花扇J的博客-CSDN博客_overflow属性 原链接 overflow是对溢出内容的处理&#xff0c;有四个属性值visible&#xff0c;hidden&#xff0c;scroll&#xff0c;auto&#xff0c;且可以分别设置overflow-x&#xff0c;overflow-y&#xff0c;需要注意的是&am…

从夜间照明到随动转向速锐得解码比亚迪唐车灯升级改装技术方案

汽车大灯犹如人的眼睛一样&#xff0c;在汽车的正脸&#xff0c;灵魂与窗口一样的存在&#xff0c;我们通过技术手段将汽车大灯升级为更高亮度、更智能化&#xff0c;是从根本解决行车安全问题。行车灯发展了几十年&#xff0c;已经不仅限于满足“夜间照明”的功能&#xff0c;…

lt基站学习总结

目录 1.nanocell基站的介 2.lte的网络结构 2.1 网络实体 2.2 功能划分 2.3功能描述 2.4业务类型 2.5语音回落原理 3 S1接口上用户注册消息的简介 3.1 S1接口的位置 3.2 S1接口的协议栈关系 3.3 S1接口建立实例 4 3g用户附着流程 5. Lte用户开机附着过程 1.nanocell基站…

扫描点读笔搭载北京君正X2000多核异构跨界处理器的案例

外研通云畅VT-S30扫描点读笔搭载北京君正X2000多核异构跨界处理器&#xff0c;X2000多核异构跨界处理器主要面向于智能音频、图像识别、智能家电、智能家居、智能办公等五大领域。CPU采取三核结构&#xff0c;搭载双XBurst2&#xff0c;主频1.2GHz&#xff0c;跨界第三核XBurst…

Vue3.0五问五答

1、Vue 3.0 性能提升主要是通过哪几方面体现的&#xff1f; 响应式系统升级 首先来看一下响应式系统升级。我们都知道Vue2的时候&#xff0c;数据响应式的原理使用的是defineProperty&#xff0c;在初始化的时候会遍历data中的所有成员。通过defineProperty&#xff0c;把对象的…

Clion代码提示功能消失无法标出错误代码

Clion就不用多说了吧&#xff0c;jetbrains永远的神&#xff01; 初次遇到这个问题也不知道是怎么回事&#xff0c;突然代码写着写着感到十分顺利。要是按照往常&#xff0c;依据jetbrains的强迫症&#xff0c;非要对你写的代码催毛求疵找出有误的地方&#xff0c;或者警告&…

spark安装与入门

下载 https://archive.apache.org/dist/spark/spark-3.0.0/spark-3.0.0-bin-hadoop3.2.tgz Local 模式 将 spark-3.0.0-bin-hadoop3.2.tgz 文件上传到 Linux&#xff0c;解压 tar -zxvf spark-3.0.0-bin-hadoop3.2.tgz -C /opt/module 重命名 cd /opt/module mv spark-3.0.…

Vue3项目搭建教程

找到一个你想要创建Vue项目的目录&#xff08;本文以C:\Users\XTT\Desktop\新建文件夹\project为例&#xff09;。在此目录打开命令行&#xff0c;输入以下命令&#xff1a; 回车&#xff0c;如果是第一次用这种方式创建Vue3项目&#xff0c;命令行会提示安装 create-vue 包&…

sharedPtr

shared_ptr 1.以何种方式传递 通过下列方式将 shared_ptr 传递给其他函数&#xff1a; 按值传递 shared_ptr。 这将调用复制构造函数&#xff0c;增加引用计数&#xff0c;并使被调用方成为所有者。 此操作的开销很小&#xff0c;但此操作的开销可能很大&#xff0c;具体取决…

python小游戏编程arcade----坦克动画图片合成

python小游戏编程arcade----坦克动画图片合成前言坦克动画图片合成1、PIL image1.1 读取文件并转换1.2 裁切&#xff0c;粘贴1.3 效果图1.4 代码实现2、处理图片的透明度问题2.1 past 函数的三个参数2.2 注意点12.3 注意点22.4 效果![在这里插入图片描述](https://img-blog.csd…

Android中简单使用aspectj

Android中简单使用aspectj 前言&#xff1a; 面向切面编程&#xff08;AOP是Aspect Oriented Program的首字母缩写&#xff09;,这种在运行时&#xff0c;动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程. 1.简介&#xff1a; 在Android中使用注解…