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

86

我正在实现一个向量类,需要获取某个向量的相反向量。是否可以使用运算符重载定义此方法?

这是我的意思:

Vector2f vector1 = -vector2;

这是我希望这个运算符完成的任务:

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

 return *this;
}

谢谢。


7
风格评论:不要在变量名前加下划线“_”。这种风格通常保留给实现(编译器),如果你这样做可能会产生冲突。此外,由于下划线前缀,读者可能会错误地将您的变量视为实现变量。在函数内部不需要使用下划线;它们可以在没有下划线的情况下清晰可读。 - Thomas Matthews
5
两个下划线被保留用于实现,而不是只有一个。 - el.pescado - нет войне
我相信这是宏和标识符。 - Puppy
2
请告诉我为什么在您的简单向量类型上使用.getX().getY() - bobobobo
3
要精确一点:标识符中任何地方连续出现两个下划线的均被保留 - 总是如此;以下划线开头后跟大写字母的标识符始终被保留;以下划线开头的任何标识符在全局命名空间中都被保留。 - Aconcagua
2个回答

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

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

请注意,您不应该返回*this。一元减运算符需要创建一个全新的向量值,而不是改变它所应用的对象,因此您的代码可能类似于这样:
class Vector {
   ...
   Vector operator-() const {
      Vector v;
      v.x = -x;
      v.y = -y;
      return v;
   }
};

8
将其称为“唯一正确的解决方案”是误导性的。一元负号-也可以被一个独立的函数重载,这将与原帖中使用的oppositeVector函数非常相似。 - AnT stands with Russia

34

它是

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

可以在类内或类外定义。我的示例是在命名空间作用域中。


+1,你需要返回一个新的Vector2f实例,而不是当前对象的引用。 - Mike Seplowitz
1
这是二元运算符“-”的实现。一元运算符没有参数,正如@anon所说。 - Daniele Santi
8
不,这是一元运算符。它以 Vector2f 作为参数,因为它是在命名空间范围内定义的,而不是类范围内。我的回答是正确的。 - Alexander Gessler
10
参见13.5.1 - “前缀一元运算符应由没有参数的非静态成员函数(9.3)或带有一个参数的非成员函数实现”。 - Alexander Gessler
2
@shunz 这是一个一元运算符。请注意,它是命名空间范围而不是类范围。 - xis
你是在引用Herb Sutter的内容吗? - stephanmg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接