目录
一、运算符重载的定义
二、为什么需要运算符重载
三、规则与限制
四、类型与语法
五、注意事项
一、运算符重载的定义
- 官方定义:运算符重载的实质是函数重载。这意味着你可以为同一个运算符定义多个版本,只要它们的参数列表不同。
- 自己的理解:想象一下,你有一个遥控车,你可以用一个按钮让它前进。这个按钮就像一个运算符,它告诉遥控车要做什么。现在,如果你有一个特殊的遥控车,你可以自定义这个按钮的功能,让它不只是前进,还可以播放音乐或者打开车灯。这就是“运算符重载”的意思——你可以改变一个运算符的默认行为,让它做你想让它做的事情。本质上是运算符的复用。
二、为什么需要运算符重载
有时候,我们创建了自己的数据类型(比如一个表示复数的类),但我们希望这些数据类型能像内置类型(比如整数或浮点数)一样使用。
三、规则与限制
- 并非所有的C++运算符都可以被重载。例如,
.
(成员选择符)、.*
(成员指针选择符)、::
(域解析运算符)和? :
(条件运算符)等就不能被重载。此外,还有6个运算符不能用于友元函数的重载,包括赋值运算符=
、函数调用运算符()
、数组下标运算符[]
、指向成员选择符->
等 - 重载后的运算符不能改变其原有的优先级和结合性。
- 重载后的运算符的操作数个数也不能改变。例如,重载
+
运算符仍然需要两个操作数。 - 重载的运算符不能用于内置类型的操作数,除非至少有一个操作数是用户自定义类型。
- 重载的运算符不能改变其原有的语义。例如,你不能改变
+
运算符使其执行减法操作。
四、类型与语法
运算符重载的函数定义格式如下:返回类型 operator运算符名(参数列表) { ... }
重载后的运算符函数名由关键字operator
和要重载的运算符符号组成。
举个例子:
Student operator+(const Student& other) {
return Student(this->name + " + " + other.name, this->score + other.score);
五、注意事项
- 运算符重载不应过度使用,以避免代码变得难以理解和维护。
- 运算符重载应该有意义且直观,不能让人误解。比如,我们不应该重载
+
运算符让它执行减法操作。 - 重载的运算符应保持其原有的语义和直观性,以便其他程序员能够容易地理解和使用。
- 不是所有的运算符都可以被重载。有些运算符,比如
.
和::
,是不能被重载的。 - 运算符重载主要是为了让我们自定义的数据类型能够像内置类型那样使用运算符,而不是为了创造一些奇怪的行为。