运算符重载意外结果

时间:2017-05-21 13:15:41

标签: c++ overloading operator-keyword

我无法理解为什么一元操作员不能正常工作。我相信我错过了一些概念。请帮忙。

#include <iostream>
using namespace std;

class Distance {
   private:
      int feet;             // 0 to infinite
      int inches;           // 0 to 12
   public:
      // required constructors
      Distance(){
         feet = 0;
         inches = 0;
      }
      Distance(int f, int i){
         feet = f;
         inches = i;
      }
      // method to display distance
      void displayDistance() {
         cout << "F: " << feet << " I:" << inches <<endl;
      }
      // overloaded minus (-) operator
      Distance operator- () {
         return Distance(-feet, -inches);
      }
};

int main() {
   Distance D1(11, 10), D2(-5, 11);

   -D1;                     // apply negation
   D1.displayDistance();    // display D1

   -D2;                     // apply negation
   D2.displayDistance();    // display D2

   return 0;
}

输出是:

F: 11 I:10
F: -5 I:11

我预计它会是-11 -10和5和-11

不知道我在哪里错过了一个概念。顺便说一句,我发现它enter image description here

3 个答案:

答案 0 :(得分:5)

这些行

-D1;                     // apply negation
-D2;                     // apply negation

不要做你认为他们正在做的事情。我们假设我们有一个int变量:

int var = 3;
-var; // What does this do?

这是做什么的? -var 评估-3,但修改 var等于-3。如果您想修改var,请按照正常情况分配给它:

var = -var; // Now var == -3

与您的Distance类型相同。 -D1不会修改D1,而 不会修改它,因为这不是一元operator-所期望的。只需将负面版本分配回自身,如下所示:

D1 = -D1;

答案 1 :(得分:1)

您的一元否定运算符返回新的Distance对象,它不会修改现有对象。

你应该这样做。

Distance D3 = -D1;
D3.displayDistance();

答案 2 :(得分:0)

您返回新对象,但不要将其用于存储在任何地方。

你应该D1 = -D1;