C++运算符重载

C++ 运算符重载

C++中预定义的运算符的操作对象只能是基本数据类型。

但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。

因此可以重定义或重载大部分 C++ 内置的运算符。这样,您就能使用自定义类型的运算符。

运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作。运算符函数的定义与其他函数的定义类似,唯一的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。

重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。

1. +运算符重载

重载+运算符,我们可以给+重新定义其含义。

例如:

	// 使用内置的+运算符操作进行int类型的运算
	int a = 10;
	int b = 20;
	int c = a + b; // 结果为30

如果我们使用+运算符来运算我们的自定义数据类型时,需要重载+运算符才可以。

举个例子:有个我们自定义的数据类型Person,有height和weight两个属性

class Person
{
public:

	int height;	// 身高
	int weight;	// 体重

	Person(int height, int weight) 
	{
		this->height = height;
		this->weight = weight;
	}
};

我们定义两个对象p1和p2;

	Person p1(10,10);	// 将p1的两个属性设置为10,10
	Person p2(20,20);	// 将p2的两个属性设置为20,20

如果我们想对p1和p2进行height和weight的分别相加的运算通过,我们需要:

	int heigt = p1.height + p2.height;
	int weight = p1.weight + p2.weight;

当然我们也可以通过重载+运算符进行运算:

有两种方式:

  • 成员函数重载
	// 成员函数重载+
	Person operator+(Person &p)
	{
		Person temp;	// 创建一个Person对象temp,用来临时存储 两个对象相加的值
		temp.height = this->height + p.height;
		temp.weight = this->weight + p.weight;
		return temp;	// 返回 temp,为Person类型的对象
	}

成员函数重载的本质

cout << p1.operator+(p2).height << endl;

可以简写为:cout << (p1 + p2).height << endl;

  • 全局函数重载1
// 全局函数重载+
Person operator+(Person& q, Person& p)
{
	Person temp;
	temp.height = q.height + p.height;
	temp.weight = q.weight + p.weight;
	return temp;
}

这种只能两个两个进行操作,在VS2019以后,重载的+运算符的结果是一个纯右值,不能作为左值进行计算,所以多个类的实例连续相加会报错。只能两两相加。

  • 全局函数重载2
//在全局区开辟一段内存,不在全局函数中开辟,防止函数执行完成后系统回收
Person temp;
// 全局函数重载+
Person& operator+(Person& q, Person& p)
{
	temp.height = q.height + p.height;
	temp.weight = q.weight + p.weight;
	return temp;
}

返回引用,同时注意不要在栈中开辟空间。

这种可以实现链式操作。

全局函数重载的本质

cout << operator+(p1, p2).height << endl;

可以简写为:cout << (p1 + p2).height << endl;

// 输出验证一下
	cout << (p1 + p2).height << endl;
	cout << (p1 + p2).weight << endl;

如果有两个以上的对象进行操作:链式操作

Person p1(10, 10);	// 将p1的两个属性设置为10,10
Person p2(20, 20);	// 将p2的两个属性设置为20,20
Person p3(30, 30);	// 将p3的两个属性设置为30,30
Person p4(40, 40);	// 将p3的两个属性设置为40,40
Person p5(50, 50);	// 将p3的两个属性设置为50,50
// 输出验证一下
cout << (p1 + p2 + p3 + p4 + p5).height << endl;	//输出 150(10+20+30+40+50)
cout << (p1 + p2 + p3 + p4 + p5).weight << endl;	//输出 150(10+20+30+40+50)

由此可见,适当的使用运算符重载可以使程序更加简洁,方便编程。

-运算符的重载与+类似,可以根据自己的需要进行编程。

2. >>运算符重载

上一篇:JS 实战: 一文了解 5 种文件上传场景(React + Koa 实现)


下一篇:Python实现链表