用于在类中定义二元运算符的样式指南/约定(C ++)

时间:2013-05-21 17:15:27

标签: c++

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

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

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