首页 > 编程语言 >C++学习笔记----重载运算符

C++学习笔记----重载运算符

时间:2024-06-22 17:09:42浏览次数:21  
标签:---- mA mB int C++ 运算符 重载 opO

运算符重载

运算符重载可以在通过成员函数或者全局函数进行重载,编译器提供了内置的运算符;
我们可以通过定义对应的函数和参数进行重载,也可以使用编译器提供的名称`operator运算符()`进行重载;
运算符重载本质是对内置的运算符函数进行重载:函数相同,参数不同;
返回引用和地址需要思考是否导致悬垂引用和悬垂指针,返回值需要思考返回的是值的拷贝带来的影响;
在进行拷贝的时候,需要思考浅拷贝和深拷贝带来的影响,以及深拷贝后内存的管理

class opO{
public:
	//构造函数
	opO(){	}
	opO(int a, int b, int age) : mA(a),mB(b),mAge(new int(age)){	}
	opO(int a, int b) : mA(a),mB(b){ }
	opO(int age) : mAge(new int(age)){	}
	/*注意:本质调用: o.operator+(o1); =>简化调用:o+o1
	opO operator+(opO &o)
	{
		opO temp;
		temp.mA = this->mA + o.mA;
		temp.mB = this->mB + o.mB;
		return temp;
	}
	*/
	//o.operator<<(cout); => o<<cout;
	//成员函数 重载<< 无法实现 cout在左侧,只能使用全局函数
	void operator<<(ostream& cout){	}
	//前置递增必须返回引用,返回值的话是值拷贝;
	opO& operator++()
	{
		mA++;
		return *this;
	}
	// 后置递增必须返回值,返回引用会导致悬垂引用;
	//int占位参数,用于区分前置和后置递增
	opO operator++(int)
	{
		//后置递增
		opO temp = *this;
		mA++;
		return temp;
		
	}
	opO& operator--()
	{
		mB--;
		return *this;
	}
	opO operator--(int)
	{
		opO temp = *this;
		mB--;
		return temp;
	}
	//析构函数,在使用无参构造器未初始化指针,然后析构会发生未定行为
	~opO()
	{
		if(NULL != mAge)
		{
			delete mAge;
			mAge = NULL;
		}
	}
	// 编译器提供的四个默认函数,无参构造、拷贝构造、析构、赋值运算符重载
	//拷贝构造、赋值运算符重载是浅拷贝,对于堆区开辟数据需要自己实现深拷贝
	opO& operator=(opO& o)
	{
		mA = o.mA;
		mB = o.mB;
		if(mAge != NULL)
		{
			delete mAge;
			mAge = NULL;
		}
		mAge = new int(*o.mAge);
		//局部对象返回只能是值传递拷贝方式,
		//局部对象的引用和指针不能返回,会导致悬垂引用		
		return *this;
	}
	bool operator==(opO& o)
	{
		if(this->mA == o.mA && this->mB == o.mB && *this->mAge == *o.mAge)
		{
			return true;
		}else 
			return false;
	}
	bool operator!=(opO& o)
	{
		if(this->mA != o.mA || this->mB != o.mB || *this->mAge != *o.mAge)
		{
			return true;
		}else
			return false;
	}
  //仿函数
	void operator()(const string& s)
	{
		cout<<"s: "<<s<<endl;
	}
	int operator()(int num1, int num2)
	{
		int sum = num1 + num2;
		return sum ;
	}
	
	
	int* mAge;
private:
	int mA;
	int mB;
	//如果私有变量不想写get和set获取,可以使用友元
	friend opO operator+(opO& o1, opO& o2);
	friend ostream& operator<<(ostream& out, const opO& o);
}; 
opO operator+(opO& o1, opO& o2)
{
	opO temp;
	temp.mA = o1.mA + o2.mA;
	temp.mB = o1.mB + o2.mB;
	return temp;
}
//链式编程思想,需要返回对应可以调用该方法的对象引用
ostream& operator<<(ostream& out, const opO& o)
{
	cout<<"mA: "<<o.mA<<" mB: "<<o.mB;
	return out;
}
void test01()
{
opO o1;

cout<<++(++o1)<<endl
	<<o1<<endl;
cout<<--(--o1)<<endl
	<<o1<<endl;
cout<<o1++<<endl
	<<o1<<endl
	<<o1--<<endl
	<<o1<<endl;
}
void test02()
{
	opO o1(18,19,20);
	opO o2(20,19,20);
	opO o3(18,19,20);
	bool a = o1 == o2 ? 1 : 0;
	bool b = o1 == o3 ? 1 : 0;
	bool c = o3 == o2 ? 1 : 0;
	cout<<"oo.a: "<<a<<endl;
	cout<<"oo.b: "<<b<<endl;
	cout<<"oo.c: "<<c<<endl;
}
void test03()
{
	opO o1;
	o1("string hhh");
	int res = o1(1, 2);
	cout<<"res: "<<res<<endl;
	cout<<(opO()(1,2))<<endl;
}

int main()

{
	test03();
	system("pause");
	return 0;
}

标签:----,mA,mB,int,C++,运算符,重载,opO
From: https://www.cnblogs.com/wansuns/p/18262510

相关文章

  • BorderPane边框布局
    JavaFX的BorderPane是一种布局方式,它将容器分为五个区域:顶部(top)、底部(bottom)、左侧(left)、右侧(right)和中心(center)。每个区域可以放置一个节点,中心区域可以放置任意类型的节点,而其他四个区域通常放置较小的控件或组件。以下是BorderPane的一些基本用法:区域设置:使用setTop......
  • qoj8542 Add One 2 题解
    题目链接点击打开链接题目解法我们先考虑什么样的序列\(x_1,...,x_n\)是可以被得到的对于\(x_i>x_{i+1}\)的位置,我们需要至少对前缀\([1,i]\)做\(x_i-x_{i+1}\)次操作;对于\(x_{i-1}<x_{i}\)的位置,我们需要至少对后缀\([i,n]\)做\(x_i-x_{i-1}\)次操作我们需要......
  • excel 转json 工具、json检测工具(来自个人学习,编写,自己使用工具)
    推荐一款自己编写的一款软件,excel转json工具(绿色、纯净、免费、共享);因为游戏需要将excel或其它表格转成json工具,以供cocoscreator使用,其它一些工具的比较:1.cocoscreator插件,也有免费的,但主要是效率低,如果excels文件多的时候,转换时间特别的长,无法接受。就是入口方便自......
  • 我的日常AI使用
    从去年年初开始,AI技术真正走入了我们的日常生活。从OpenAI到如今字节跳动的coze,我们通过AI大模型可以做很多事情,工具和平台众多,如何选择和使用有必要总结一下。编程和debug方面尽管gpt-4和gpt-4o确实很强,但对于持续代码改进和代码调试方面,依然不够好,并且它对于非Plus会员......
  • 深入探索B树:基本操作与应用解析
    在计算机科学中,B树是一种自平衡的树形数据结构,广泛用于数据库和文件系统的索引结构。它能够提供高效率的数据检索、插入和删除操作,特别适合于磁盘I/O密集型的应用场景。本文将详细探讨B树的基本操作,包括B树的定义、特性、插入、删除、分裂和合并等,以及它们在实际应用中的重......
  • redis持久化操作【随记】
    持久化Redis它是将数据保存到内存当中,内存里的数据最大特点:断电易失.保存在内存的数据就没有了.如果如果这些数据还有用,业务使用啥的,不能就让它这么没有了.redis当中提供持久化机制,说白了,将内存的数据—->写入到磁盘.–>持久化.1rdb方式redisdatabase,持......
  • Memcached分布式特性解析:高效缓存策略的关键
    在现代的互联网应用中,缓存是提高性能和扩展性的关键技术之一。Memcached作为一个高性能的分布式内存缓存系统,广泛用于减轻数据库负载、加快数据访问速度。本文将深入探讨Memcached的分布式特性,包括其工作原理、集群管理、数据一致性、故障恢复以及与其他分布式系统的集成等......
  • 高考志愿到底怎么填?
    高考志愿填报是一个需要综合考虑多方面因素的过程。针对您的问题,我给出以下建议:1、志愿先后顺序:通常建议将您最希望被录取的院校和专业放在前面,即志愿顺序尽量按照您的喜好和录取可能性从高到低排列。注意拉开梯度,不要将所有志愿都填在同一个水平线上,这样容易导致所有志愿都......
  • MyBatis-Plus入门教程(一)
    MyBatis-Plus是一个MyBatis的增强工具,在MyBatis的基础上为其提供了许多便捷功能,使开发者能够更快速、高效地进行数据库操作。MyBatis-Plus简介1.什么是MyBatis-Plus?MyBatis-Plus(简称MP)是一个MyBatis的增强工具,它旨在简化开发过程,减少重复代码,提高开发效率。MP通......
  • Mybatis-plus入门教程(二)
    第一步:环境准备1.添加依赖确保在项目的构建文件中添加MyBatis-Plus依赖。Maven:<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3.4</version></dependency>Gradle:im......