📜  C++运算符重载(1)

📅  最后修改于: 2023-12-03 14:40:00.313000             🧑  作者: Mango

C++运算符重载

在C++中,运算符重载是一种特殊的函数重载,通过它我们可以重新定义运算符的行为。这种功能强大的特性可以使我们的代码更简洁、更直观。

应用场景
  • 表示复数
  • 自定义类型的加减乘除、比较等运算
  • 可以使使用自定义类型的代码更具可读性
限制
  • 不改变运算符的优先级、结合性等固有的属性
  • 不增加运算符的参数个数
  • 不改变运算符操作数的类型
运算符重载的语法
返回类型 operator 运算符 (参数列表) 
{
	//重载运算符的实现代码
}

例如下面是一个重载加号运算符的例子,用来加两个自定义类型的对象。

class Complex 
{
public:
	Complex operator+(const Complex &c) 
	{
		return Complex(real + c.real, imag + c.imag);
	}
private:
	float real; //实部
	float imag; //虚部
};
运算符重载的返回值

运算符重载函数的返回值与被重载的运算符的返回值类型相同。

重载运算符需要注意的问题
参数类型
  • 如果运算符是一元运算符(例如一元负号),则只需要对一个参数进行定义。这个参数可以是任意类型,但通常定义为类对象的引用或指针。
  • 如果运算符是二元运算符(例如加法、减法等),则定义一个参数不够,需要定义两个参数。其中一个可以是对象本身,另一个必须是其他类型的对象,但通常定义为类对象的引用或指针。
参数个数

运算符的参数个数固定,无法通过重载来改变。例如,加法运算符必须有两个参数,一元运算符只能有一个参数。

优先级

运算符优先级不能改变,因为一个运算符的优先级是由语法规则定义的,而不是由函数重载定义的。

结合性

运算符的结合性也不能改变。例如,赋值运算符是右结合的,就算我们对它进行了重载,它的结合性依然是右结合的。

可调用性

使用运算符时,必须保证运算符重载函数可调用。运算符可以是成员函数或全局函数,但必须保证运算符的参数个数和类型与被重载的运算符完全匹配。

运算符重载的例子
"+"运算符重载
class Complex 
{
public:
	Complex operator+(const Complex &c) 
	{
		return Complex(real + c.real, imag + c.imag);
	}
private:
	float real; //实部
	float imag; //虚部
};
"++"运算符重载
class Counter 
{
public:
	Counter& operator++() 
	{
		count++;
		return *this;
	}
private:
	int count;
};
"<<"运算符重载
class Point 
{
friend ostream& operator<<(ostream &out, const Point &p);

private:
	int x;
	int y;
};

ostream& operator<<(ostream &out, const Point &p) 
{
	out << "Point(" << p.x << ", " << p.y << ")";
	return out;
}
总结

运算符重载在C++中是非常强大的特性。我们可以使用它来定义自己的运算符,可以使代码更简洁、更直观,增加代码的可读性。但是在使用时也需要注意一些细节,确保运算符可调用并且满足语言的规范。