运算符重载是c++中赋予已有运算符新含义的技术,例如让复数对象用+相加。实现时需用operator关键字定义函数,如complex operator+(const complex& a, const complex& b); 重载可作为成员函数或全局函数实现,前者适合访问内部数据,后者利于保持封装性。推荐重载算术、比较、赋值及下标运算符,但不应重载&&、||、?:、. 和 ::。注意事项包括保持语义清晰、选择正确的函数形式、注意参数顺序与返回类型,并尽量传递引用以提高效率。

在C++中,重载运算符是一种非常实用的技术,可以让你自定义类的对象支持像
+、
-、
==这样的操作符。实现的关键是使用
operator关键字来定义这些操作的具体行为。

什么是运算符重载?
简单来说,运算符重载就是赋予已有运算符新的含义。比如,你有一个表示复数的类,你想让两个复数对象之间可以直接用
+相加,这时候就需要重载
+运算符。

需要注意的是,并不是所有运算符都能被重载,而且有些限制,比如不能改变操作数的数量或优先级。
如何使用 operator 定义运算符重载?
要重载一个运算符,你需要定义一个函数,函数名以
operator开头,后面接你要重载的符号。例如:

Complex operator+(const Complex& a, const Complex& b);
这个函数处理两个
Complex类型对象相加的情况。你可以把它写成成员函数,也可以写成全局函数。
常见方式:
- 成员函数:适用于需要访问对象内部数据的情况。
- 全局函数:如果需要两个操作数都可转换或者想保持类封装性更强时使用。
举个例子,假设你在写一个
Vector2D类,想让它支持加法操作,就可以这样写:
Vector2D operator+(const Vector2D& v1, const Vector2D& v2) {
return Vector2D(v1.x + v2.x, v1.y + v2.y);
}哪些运算符适合重载?哪些不建议?
并不是所有运算符都适合重载,选择合适的运算符能提升代码可读性,否则反而会让人困惑。
推荐重载的运算符:
- 算术运算符:
+
,-
,*
,/
- 比较运算符:
==
,!=
,<
,>
- 赋值运算符:
=
,+=
,-=
- 下标运算符:
[]
(常用于容器类)
不建议重载的运算符:
&&
和||
:因为它们有短路特性,重载后容易引发误解。?:
(三目运算符):语言层面不允许重载。.
和::
:也不能被重载。
注意事项和常见问题
重载运算符虽然方便,但有几个细节很容易出错:
-
保持语义清晰:不要为了炫技而重载,比如给
+
赋予减法的逻辑。 -
是否为成员函数:有些运算符必须是非成员函数,比如
<<
(流输出),否则无法正常使用。 - 返回类型和参数顺序:特别是当涉及隐式类型转换时,参数顺序会影响匹配结果。
- 效率问题:尽量传引用而不是传值,避免不必要的拷贝。
举个实际的例子,如果你写了一个
Fraction类并希望它能和整数相加:
Fraction operator+(const Fraction& f, int num);
这样写可以让
f + 5合法,但如果反过来
5 + f就不行了,除非你再写一个参数顺序调换的版本。
基本上就这些。掌握好
operator的用法,可以让你的类更自然地融入 C++ 的表达式体系。










