我是否应该更喜欢运算符重载而不是 functions/methods?

Should I ever prefer operators overloading over functions/methods?

我觉得使用运算符重载会给代码增加不必要的复杂性和歧义。

在值得使用自定义运算符或重载现有运算符而不是使用函数或对象方法的实际情况下,它是否有好处?

它是经常使用还是只是一种有趣的异国情调的东西来增加语言的时髦度?

来自维基 运算符重载——通常称为运算符临时多态——是多态的一种特殊情况,其中不同的运算符根据其参数有不同的实现

Swift 有 40 多个运算符,所有运算符都已过载,我们经常使用它们。你更喜欢 let sum = value.plus(anotherValue) 而不是 let sum = value + anotherValue ??我敢肯定,你不会!如果该值是符合协议 Equatable 的自定义类型,则必须重载 == 运算符,我们会定期重载。

使用自定义运算符(如 ±、<*> 等...)是个好主意吗?在那个领域我不确定。我不太喜欢这个......

为 sum 之外的其他东西重载 + 运算符是个好主意吗?不,绝对不是!

重载的主要原因是使用自定义 class 具有数学或逻辑背景

喜欢:

  • 向量
  • 矩阵
  • 复数
  • 相量、张量、四元数、...
  • 有限域
  • 大数(arbnum、biginteger、bigdecimal...)
  • 自定义精度浮动和固定格式
  • 谓词、布尔、模糊和概率
  • 字符串、列表、问题
  • 还有更多

如果编码正确,您可以直接编写数学方程式,而不必费心转换为一组函数调用。使用运算符阅读和理解数学代码更加简单直接。

有时甚至非严格数学 类 也以这种方式用于例如图像或信号。在 DIP/CV 中通常有 math/physics 方程应用于这些方程,重载运算符使它更简单。

对于非数学类

运算符通常是 useless/meaningless(如您所想),除了特殊的 operator= 之外,这对于任何具有动态分配成员的 class/struct 都是至关重要的。没有它,std:vector<> 之类的东西将无法正常工作。

另一个例子是比较运算符,有时会为非数学实现 类 以使排序更容易。