运算符重载意外结果

Vid*_*rom 0 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;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

F: 11 I:10
F: -5 I:11
Run Code Online (Sandbox Code Playgroud)

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

不知道我在哪里错过了一个概念.顺便说一句,我在这里找到

小智 5

这些线

-D1;                     // apply negation
-D2;                     // apply negation
Run Code Online (Sandbox Code Playgroud)

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

int var = 3;
-var; // What does this do?
Run Code Online (Sandbox Code Playgroud)

这是做什么的?-var 评估-3,但不改变 var等于-3.如果要修改var,则按照通常的方式分配给它:

var = -var; // Now var == -3
Run Code Online (Sandbox Code Playgroud)

与您的Distance类型相同.-D1不修改D1,它不应该修改它,因为这不是一元operator-预期要做的.只需将否定版本分配回自身,如下所示:

D1 = -D1;
Run Code Online (Sandbox Code Playgroud)