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

Ily*_*ski 69 c++ operator-overloading

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

这就是我的意思:

Vector2f vector1 = -vector2;
Run Code Online (Sandbox Code Playgroud)

这就是我希望这个运算符完成的事情:

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

 return *this;
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

小智 118

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

class Vector {
   ...
   Vector operator-()  {
     // your code here
   }
};
Run Code Online (Sandbox Code Playgroud)

请注意,您不应该返回*this.一元 - 运算符需要创建一个全新的Vector值,而不是更改它应用的东西,所以你的代码可能想看起来像这样:

class Vector {
   ...
   Vector operator-() const {
      Vector v;
      v.x = -x;
      v.y = -y;
      return v;
   }
};
Run Code Online (Sandbox Code Playgroud)

  • @Kornel Kisielewicz:称之为"*唯一*正确的解决方案"具有误导性.一元函数也可以重载一元`-`,这将严格反映OP对`oppositeVector`的实现. (7认同)

Ale*_*ler 27

它的

Vector2f operator-(const Vector2f& in) {
   return Vector2f(-in.x,-in.y);
}
Run Code Online (Sandbox Code Playgroud)

可以在班级内,也可以在外面.我的示例位于命名空间范围内.

  • 另见13.5.1 - '前缀一元运算符应由不带参数的非静态成员函数(9.3)或带有一个参数的非成员函数'实现. (8认同)
  • 不,这是一个一元的运营商.它需要一个`Vector2f`作为参数,因为它是在名称空间而不是类范围中定义的.我的回答是正确的. (5认同)
  • @shunz这是一个一元的运营商.注意它是命名空间范围而不是类范围. (2认同)