C ++中一元运算符重载的难度?

时间:2012-04-20 19:23:47

标签: c++ operator-overloading

我刚刚阅读了使用减号( - ),增量(++)等的一元运算符重载。我想为练习编写相同的代码。但是当我试图运行它时,它给我减去和增量运算符的错误。我认为问题是我在main中调用运算符的方式。任何人都可以请这样做的正确方法是什么?

#include<iostream>

using namespace std;

class c{
   int x;
   int y;
   public:
      c(int a,int b){
             x=a;
             y=b;   
      }

      void operator -(){
             x=x+1;
             y=y+1;
      }

      void display(){
             cout<<x<<" "<<y<<"\n";
      }

};

int main()
{
     c obj(2,3);
     obj.display();
         obj- ;    //I think the error is on this line
     obj.display();
     return 0;
}

如果我用obj替换obj,代码工作正常。为什么会这样?同样是++运算符重载的问题(使用++ obj工作正常,但obj ++不起作用),为什么?

感谢。

3 个答案:

答案 0 :(得分:4)

一元减号运算符-仅是前缀运算符。

要重载++运算符的后缀版本,您需要一个虚拟的 int 参数。 e.g。

struct foo
{
    void operator - ()
    {
        std::cout << "hello" << std::endl;
    }

    void operator ++ (int)
    {
        std::cout << "world" << std::endl;
    }
};

int main()
{
    foo bar;
    -bar;
    bar++;
}

答案 1 :(得分:2)

首先,你不能发明新的操作符,只能重新定义现有的操作符,所以你的一元post-minus无法完成。后递减运算符(当然)是两个减号,而不仅仅是一个。

其次,当你定义一个递增或递减运算符时,你给函数一个(未使用的)int参数来区分pre-form和post-form;如果函数有参数,则它是后递增或后递减操作,但没有它,它是预递增/预递减。

答案 2 :(得分:1)

一元运算符是否定运算符。当你说-5-var时会发生这种情况。您没有说5-var-。如果您在var - 3之后,请重载二元运算符。

postincrement运算符有一个伪int参数,以区别于preincrement运算符。