C++运算符重载

C++运算符重载

运算符重载概念:即给原有运算符赋予新功能。

比如,c++中的以下操作便是用到了重载运算符:

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

int main(void)
{
	string str1("hello");
	string str2("world");
	string str3;
	str3 = str1 + ' ' + str2;//这里的“+”和“=”就被重载了,只不过封装起来了我们看不到而已(我们的+号只有1+1=2这种数值计算的功能)
	cout << str3 << endl;//这里的第一个“<<”便被重载了

	system("pause");
	return 0;
}

运算符重载的本质:函数重载。
运算符重载目的:

  • 用操作整数的各种运算方法,让运算符重载让类也具有整数的各种简单运算
  • 我们对类产生的对象进行非常方便的运算操作,让代码、简洁明了,操作方便

关键字:operator

注意:在学习运算符重载之前,建议先补充this指针的相关知识点

一元运算符重载

一元运算符即只有一个操作数参与运算。例如:-(负号,不是减号)、++(自增运算符)等等。
以下展示两个较为典型的例子。

这里以“-”负号为例:

“-”的重载,有友元函数重载(友元函数作为全局函数对其进行重载)和成员函数重载(定义一个类的成员函数)两种。
成员函数重载:

#include<iostream>
using namespace std;
class Coordinate
{
public:
	Coordinate(int x, int y);//构造函数
	Coordinate& operator-();    //对-进行重载
	void printInfo();//打印函数
private:
	int m_iX;
	int m_iY;
};

Coordinate::Coordinate(int x, int y)
{
	m_iX = x;
	m_iY = y;
}

Coordinate& Coordinate::operator-()//重载函数的实现
{
	m_iX = -m_iX;
	m_iY = -m_iY;
	return *this;//普通的成员函数有隐性的this指针作为参数 ,这里的this指针就是“-”的操作数
}

void Coordinate::printInfo()
{
	cout << "(" << m_iX << "," << m_iY << ")";
}

int main(void)
{
	Coordinate coor(2, 3);
	-coor;  //等价于调用了coor.operator-()
	coor.printInfo();
	system("pause");
	return 0;
}

友元函数的重载:

#include<iostream>
using namespace std;

class Coordinate
{
	friend Coordinate& operator-(Coordinate &coor);
public:
	Coordinate(int x, int y);
	void printInfo();
private:
	int m_iX;
	int m_iY;
};

Coordinate::Coordinate(int x, int y)
{
	m_iX = x;
	m_iY = y;
}

void Coordinate::printInfo()
{
	cout << "(" << m_iX << "," << m_iY << ")";
}

Coordinate& operator-(Coordinate &coor)//对-进行重载
{
	coor.m_iX = -coor.m_iX;
	coor.m_iY = -coor.m_iY;
	return coor;
}

int main(void)
{
	Coordinate coor(2, 3);
	-coor;//等价于operator-(coor)
	coor.printInfo();
	
	system("pause");
	return 0;
}

这里以“++”为例:

前置++运算符的重载:

前置++重载和“-”负号重载类似,这里只贴出关键部分代码:
Coordinate& Coordinate::operator++()//前置++的重载
{
	m_iX++;
	m_iY++;
	return *this;
}

后置++运算符的重载:

#include<iostream>
using namespace std;

class Coordinate
{
public:
	Coordinate(int x, int y);
	Coordinate operator++(int);//这里的int是一个标志性参数,用来告诉编译器这里是一个后置++的重载
	void printInfo();          // 注意:没有&
private:
	int m_iX;
	int m_iY;
};

Coordinate::Coordinate(int x, int y)
{
	m_iX = x;
	m_iY = y;
}

Coordinate Coordinate::operator++(int)//后置++的重载
{
	Coordinate old(*this);//由于类中数据成员不涉及指针,这里的拷贝用的是默认的拷贝构造函数(即浅拷贝)
	m_iX++;
	m_iY++;
	return old;//返回后置++之前的对象的值
}

void Coordinate::printInfo()
{
	cout << "(" << m_iX << "," << m_iY << ")";
}

int main(void)
{
	Coordinate coor(2, 3);
	(coor++).printInfo();//后置++操作时,仍返回原值
	coor.printInfo();//进行后置++操作之后,coor的值就改变了
	
	system("pause");
	return 0;
}

二元运算符的重载:https://blog.csdn.net/weixin_43217963/article/details/88711077

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值