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

And*_*tin 2 c++

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

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

Pet*_*ker 5

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

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