2

这是一个普遍的问题,但我有一些类我想定义一些二进制“操作”,并且有几种不同的方法。例如,假设我有一个Vector要在其上实现加法运算的类。一方面,我可以只重载'+'运算符,但我从一些资料中了解到这不是一个很好的做法(这不禁让人问为什么这是一种语言特性)。在许多情况下,我可以看到为什么方法比运算符重载更可取,但是向量加法已得到广泛认可,因此使用'+'应该非常自然。

另一方面,我可以add()在类中定义一个方法。我可以将它定义为普通方法并使用x.add(y)to perform x + y,但它并没有将自己展示为二元运算符,所以我不确定这是否应该是首选。我也可以将其定义为静态方法,例如Vector.add(x, y). 最后,我还可以定义add()为类的友元函数,这非常(数学上)自然,但在我看来有点违背OOP. 我希望对哪些方法更可取(以及为什么)有所了解。

4

2 回答 2

5

通常的方法是将反身运算符(+=,*=等)定义为修改它们所应用的对象的成员,并将非反身运算符(+,*等)定义为创建其副本之一的非成员参数,使用相应的反身运算符进行操作,并返回新对象作为结果。

虽然 Java 程序员认为add函数是一件好事,但他们这样做是因为 Java 没有运算符重载。对于应该简单的事情,命名操作会导致非常长且不可读的表达式。

于 2013-05-21T17:20:12.603 回答
1

将二元运算符定义为友元函数(可能作为一组重载)的优点是允许左侧值不是类的实例。这通常用于流插入器/提取器。请注意,只有当您的操作员需要访问其操作数之一的内部时,才需要好友状态。最好是操作员可以通过每个操作数的公共接口工作,避免对朋友的需要和由此产生的更紧密的耦合。

于 2013-05-21T17:19:36.757 回答