【问题标题】:How to overload unary minus operator in C++?如何在 C++ 中重载一元减号运算符?
【发布时间】:2023-03-03 17:37:01
【问题描述】:

我正在实现矢量类,我需要得到一些矢量的对立面。是否可以使用运算符重载来定义这种方法?

这就是我的意思:

Vector2f vector1 = -vector2;

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

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

 return *this;
}

谢谢。

【问题讨论】:

  • 风格注释:不要在变量前加上''。这种风格是为实现(编译器)保留的,你可能会有冲突。此外,由于 '' 前缀,读者无意中将您的变量识别为实现变量。您不需要在函数内部使用“_”;没有它,它们将是可读的。
  • 两个下划线保留用于实现,而不仅仅是一个。
  • 我相信是_MACROs和__identifiers。
  • 请告诉我你为什么在简单的 Vector 类型上使用 .getX().getY()
  • 要成为precise:带有两个后续下划线anywhere的标识符被保留-always,以下划线后跟一个大写字母开头的标识符是总是保留,任何以下划线开头的标识符都保留在全局命名空间

标签: c++ operator-overloading


【解决方案1】:

是的,但你没有提供参数:

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

请注意,您不应返回 *this。一元 - 运算符需要创建一个全新的 Vector 值,而不是更改它所应用的内容,因此您的代码可能希望看起来像这样:

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

【讨论】:

  • @Kornel Kisielewicz:称其为“唯一正确的解决方案”具有误导性。一元 - 也可以被独立函数重载,这将密切反映 OP 对 oppositeVector 的实现。
【解决方案2】:

这是

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

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

【讨论】:

  • +1 表示您需要返回一个新的 Vector2f 实例,而不是对当前对象的引用。
  • 这是一个 binary 操作符的实现。正如@anon 所说,一元没有参数。
  • 不,它是一元运算符。它采用Vector2f 作为参数,因为它是在命名空间而不是类范围中定义的。我的回答是正确的。
  • 另见 13.5.1 - '前缀一元运算符应由不带参数的非静态成员函数 (9.3) 或带一个参数的非成员函数实现'。
  • @shunz 它是一元运算符。注意它是命名空间范围而不是类范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 2016-08-24
  • 2022-01-20
相关资源
最近更新 更多