2014-09-30 33 views
0

我有一個關於一元運算符重載的問題。代碼如下:是否所有的操作符重載都會將操作符放到超載被調用的對象之後?

class Fraction { 
public: 
    Fraction() {} 
    Fraction(int a); 
    Fraction(int n, int d, int reduce=1); 
    Fraction operator +(const Fraction& y) const; 
    Fraction operator -(const Fraction& y) const; 
    Fraction operator -() const;   // unary negation 

    // etc. 
}; 

爲一元運算符-,代碼如下:

Fraction Fraction::operator -() const {   return (Fraction(-num, denom, 0)); } 

Suppse我們有三個Fraction對象,f1f2f3。 我知道下面的代碼:

f3=f1+f2等於f3=f1.operator+(f2),即在運營商面前的對象將調用操作員和一個後面將作爲參數傳遞,對不對?

然後,對於一元運算符-,代碼

f3=-f1

上述用於操作者+,我認爲代碼應該像f3=f1-,其等於f3=f1.operator-()思想如下。爲什麼實際的代碼是f3=-f1而不是f3=f1-?我認爲操作員面前的對象應該叫它......我知道在數學中它是f3=-f1,但編譯器如何識別代碼f3=-f1實際上是f1調用操作符?它怎麼知道在這種情況下,-是一個一元運算符?

非常感謝!

+0

因爲語言(和數學)就是這樣。 – deviantfan 2014-09-30 22:12:58

+0

@deviantfan,那麼編譯器如何識別? – 2014-09-30 22:13:57

+2

編譯器只看到一個只有右側操作數的'-',所以它知道使用一元版本。 – Adam 2014-09-30 22:15:35

回答

1

只有兩個一元運算符,其中對象的引用最先出現。這是後綴++和後綴--

如何在過載中區分這些語法的語法有點奇怪。您添加一個虛假的參數:

class Ptr_to_X { 
    // ... 
    X operator++();  //prefix: no argument 
    X& operator++(int); //postfix: because of 
         //the argument 

    X operator--();  //prefix: no argument 
    X& operator--(int); //postfix: because of 
         //the argument 
}; 

Here's some history of how that came to be.使它成爲你會的。

除了那些後綴形式以外,所有其他一元運算符都出現在對象引用之前。這包括:

  • 元減號( - )
  • 元加號(+)
  • 的補(〜)(&)
  • 指針引用(*)
  • 邏輯的
  • 地址NOT(!or not)

如果它讓你感到不舒服,因爲你習慣於看「方法」總是出現在「物體之後」......這太糟糕了。例如,一些語言的語法是規範的和規則的......使用所有前綴或所有後綴表示法。但是認知科學家和語言學家認爲,有人認爲人類的思想是以某種形式運作的,我認爲許多純粹一致的語言與我們腦海裏想要創造「我們腦海中的結構」的慾望作鬥爭。無論哪種方式,正如@dyp所說,所有這些操作符都來自C(除了能夠編寫!not,我這樣做,因爲它處於標準並且很難錯過)。如果您用前面的減號表示否定整數,然後否定一個帶有減號的複數類,那將會很奇怪。

+0

謝謝!!!!!真的解決了我的問題! – 2014-10-01 23:17:36