【运算符重载】——重载实现复数、string类


引言:在模板中,我们定义了如下的sum函数

template<typename T>
T sum(T a,T b)
{
   
	return a+b;
}

如果是正常的数据类型还可以运算,但是遇到对象相加了怎么办呢?
那么就引出我们今天所要讨论的内容——运算符重载

1、实现一个简单的运算符重载

1、运算符重载的作用
就像我们引言中所描述的一样,运算符重载的作用就是使得自定义类型和内置类型相同的逻辑

2、运行机制

主要是通过函数实现的。
【举个栗子】

int main()
{
	int arr[] = { 1,22,32,45,67,46,69 };
	int len = sizeof(arr) / sizeof(arr[0]);
	for (CInt i = 0; i < len; i++)
	{
		std::cout << arr[i] << " ";
	}
	std::cout << std::endl;
	return 0;
}

在上面的这个程序逻辑里面,CIn是一个对象,需要我们实现比较运算符的重载、++运算符的重载、中括号运算符重载等。

1、比较运算符的重载
因为运算符重载是通过函数实现的,所以在设计的时候我们就需要考虑函数的函数名、参数、返回值、函数体这四个元素。

  • 函数名:operator关键字加上要重载的运算符
  • 参数:this指针接收的是左操作数,右操作数通过实参到形参传递的方式来获取
  • 返回值:如果是比较的话就是一个bool表达式
  • 函数体:就实现具体的逻辑过程
bool operator <(int rhs)
{
   
	return value < rhs;
}

2、++运算符的重载
分析
因为++运算符的重载还分为前置加加和后置加加。所以为了区分,我们使用一个标志,将参数是int的设置成为后置加加,没有参数的表示前置加加。
然后再来分析常量中后置加加的逻辑,他是一个先赋值后加加的过程。所以对应到对象里面,我们就应该首先拿到临时量的备份,再加加。
实现如下:

const CInt operator++(int)
	{
   
		CInt tmp(*this);
		value++;
		return tmp;
	}

前置加加就是先加加再赋值的过程,所以返回的是自加变量的本身,实现如下:

const CInt operator++()
{
   
	value++;
	return *this;
}

3、中括号运算符
分析
这是是一个双目运算符, arr[i]和i[arr]表示的含义都是一样的,左操作数接收的是一个对象,右操作数接收形参int型的指针为第一个元素的地址。返回的是内存单元的本身,就是int&
实现如下

	int& operator[](int* parr)
	{
   
		return parr[value];
	}

2、总结
函数的实现分为两种方式

  1. 在类中this指针接收左操作数
  2. 在类外左右操作数通过形参接收(并且一定要记住在类外实现的函数一定要在类中设置
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值