2012-04-20 49 views
2

我剛剛閱讀了一元運算符重載使用減號( - ),增量(++)等。我以爲只是爲了練習而編寫相同的代碼。但是當我嘗試運行它時,它給了我減號和增量運算符的錯誤。我認爲問題是我在main中調用運算符的方式。請任何人都可以這樣做的正確方法是什麼?一元運算符在C++中重載的困難?

#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 ++不起作用),爲什麼?

謝謝。

+0

您的重載操作符需要返回一個值。請參閱http://stackoverflow.com/questions/4421706/operator-overloading – 2012-04-20 19:51:33

+0

@ThomasMatthews - 要清楚,它是*約定*,而不是語言,它要求重載操作符返回一個值。重載操作符返回「void」是完全可能的和可接受的。這樣做是合法的,並且排除了運營商的某些用途。 – 2012-04-20 20:35:37

回答

4

一元減號運算符-僅限於前綴運算符。

要超載後綴版本的++運算符,您需要一個虛擬的int參數。例如

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

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

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

感謝您的幫助。 – 2012-04-20 19:47:45

+3

重載增量運算符返回一個值。見Scott Meyers的* More Effective C++ *,第6項;區分增量和減量運算符的前綴和後綴形式。「**另請參閱:http://stackoverflow.com/questions/4421706/operator-overloading – 2012-04-20 19:50:24

+0

@ThomasMatthews好點,我同意重要的是保留操作符的語義 – 2012-04-20 20:02:47

1

一元運算符是否定運算符。當你說-5-var時會發生什麼情況。你不要說5-var-。如果您在var - 3之後,則重載二元運算符。

postincrement運算符有一個虛擬int參數以區別於preincrement運算符。

2

首先,你不能發明新的操作符,只能重新定義現有的操作符,所以你的一元后減法不能完成。減數後運算符(當然)是兩個減號,而不僅僅是一個。其次,當你定義一個遞增或遞減運算符時,你給函數一個(未使用的)int參數來區分預格式和後表單;如果函數具有參數,那麼它是後增量或後減量操作,但沒有它,它是預增量/預遞減。