如何在C ++中重载一元负运算符?


76

我正在实现向量类,我需要得到一些向量的反义词。是否可以使用运算符重载来定义此方法?

这就是我的意思:

Vector2f vector1 = -vector2;

这是我希望该运算符完成的操作:

Vector2f& oppositeVector(const Vector2f &_vector)
{
 x = -_vector.getX();
 y = -_vector.getY();

 return *this;
}

谢谢。


7
样式注释:不要在变量前添加“ ”。这种样式是为实现(编译器)保留的,您可能会发生冲突。另外,由于前缀' ' ,读者无意间将您的变量识别为实现变量。您无需在函数内部使用“ _”;没有它们,它们将是可读的。
Thomas Matthews,2010年

4
为实现保留了两个下划线,而不仅仅是一个。
el.pescado

我相信这是_MACRO和__identifiers。
小狗

2
请告诉我为什么使用.getX()和使用.getY()简单的Vector类型
-bobobobo

1
为了精确:有两个后续下划线标识的任何地方都保留-始终,标识符以下划线后跟一个下水管局字母开头都始终保留,也开始用下划线任何标识被保留在全局命名空间
阿空加瓜

Answers:


128

是的,但是您没有为其提供参数:

class Vector {
   ...
   Vector operator-()  {
     // your code here
   }
};

请注意,您不应返回* this。一元运算符需要创建一个崭新的Vector值,而不是更改要应用于它的对象,因此您的代码可能希望如下所示:

class Vector {
   ...
   Vector operator-() const {
      Vector v;
      v.x = -x;
      v.y = -y;
      return v;
   }
};

8
@Kornel Kisielewicz:称其为“唯一正确的解决方案”是一种误导。一元-函数也可以由独立函数重载,这将紧密反映OP的实现oppositeVector
AnT 2012年

28

它的

Vector2f operator-(const Vector2f& in) {
   return Vector2f(-in.x,-in.y);
}

可以在班级内,也可以在班级外。我的示例在名称空间范围内。


+1表示需要返回一个新的Vector2f实例,而不是对当前对象的引用。
Mike Seplowitz 2010年

1
这是二进制运算符-的实现。一元没有@anon说的参数。
Shunz先生11年

6
不,它是一元运算符。它需要一个Vector2f作为参数,因为它是在namespace-而非类范围限定。我的回答是正确的。
亚历山大·盖斯勒

8
另请参见13.5.1-“前缀一元运算符应由不带参数的非静态成员函数(9.3)或具有一个参数的非成员函数实现”。
亚历山大·盖斯勒

2
@shunz,它是一元运算符。请注意,它是名称空间范围而不是类范围。
xis 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.