运算符重载是指为自定义类定义标准运算符(如 +, -, *, ==)的用户行为的能力。这有助于在使用用户定义类型(例如向量、矩阵)时编写表达性、可读的代码。
运算符重载机制在 C++ 中出现,以支持在处理对象时使用直观的语法(例如,复数的加法、迭代器的操作),就像在处理基本类型时一样。
没有运算符重载,许多操作看起来将像普通函数(add(a, b)),这使得代码的可读性下降,且表达性减弱。但过度或不当使用会导致混淆和错误。
在 C++ 中,可以通过声明相应的成员函数或友元函数来重载大多数运算符,以为新操作定义逻辑。
代码示例:
class Vector2D { double x, y; public: Vector2D(double x, double y) : x(x), y(y) {} Vector2D operator+(const Vector2D& rhs) const { return Vector2D(x + rhs.x, y + rhs.y); } };
关键特性:
是否可以重载运算符 . (点) 和 :: (双冒号) ?
不可以,这些运算符如 . (点)、::、sizeof、?: 和一些其他运算符按照语言标准是不支持重载的。
重载运算符的行为是否必须完全符合其标准语义?
不需要,但建议这样做(例如,重载 == 时应进行等价比较)。
在错误地传递按值对象到重载运算符时会发生什么?
可能会导致多余的复制或解引用,从而减慢程序或导致错误。最好传递常量引用 (const T&)。
代码示例:
Vector2D operator+(Vector2D rhs) const; // 低效,复制对象
在 DataFrame 类中重载了运算符 * 进行标量乘法,带有副作用(修改对象)。
优点:
缺点:
在复数类中重载了 +, -, == 运算符,遵循常规数学逻辑,且没有修改原始对象。
优点:
缺点: