2012-07-07 101 views
0

我明白,我們可以在內部數據類型適用於增量和減量,如:運營商的關鍵字和運算符重載模擬

int a; 

a++; 
a--; 

...等。

但是,在下面的代碼中,如果我省略operator int& () { return value; }行中的&,我將收到一個編譯錯誤。請解釋如何以及爲什麼使用&使得增量可能在這裏:

#include <iostream> 

class Foo { 

public: 
    int value; 
    operator int& () { return value; } 

}; 


int main () { 
    Foo p; 
    p.value = 10; 

    p++; 

    std::cout << p << std::endl; 

    std::cin.get (); 
    return 0; 
} 
+0

這聽起來像作業 – 2012-07-07 19:37:39

回答

2

這個函數的定義:

operator int&() { return value; } 

允許從Foo類的引用轉換爲int。

這條線:

p++; 

不能增加p因爲作爲類沒有operator++實施Foo類型。但是它可以通過調用operator int&()將p轉換爲對int的引用,該函數在Foo的特定實例中返回對value的引用。對value的引用是int的類型,可以使用++來遞增。所以代碼在原地增加value

作爲一個在和int的參考返回之間的區別,下面的代碼顯示了你所提到的行爲是不顯着的轉換oeprator:

class Foo 
{ 
public: 
    Foo() : m_value(0) 
    { 
    } 

    int getCopy() { return m_value; } 
    int& getRef() { return m_value; } 
private: 
    int m_value; 
}; 

int main() 
{ 
    Foo f; 

    // Works 
    f.getRef()++; 

    // Does not work on g++ with 'error: lvalue required as increment operand` 
    f.getCopy()++; 
} 

你不能做一個增量的原因時,轉換運算符返回int而不是int&是增量操作需要左值,即可以作爲賦值目標的東西。有關更多詳細信息,請參閱here

+0

謝謝你。 – 2012-07-07 19:40:45

+0

@Zzz Zz:它確實有效...... – 2012-07-07 19:51:20

+0

是不是這行「運算符int(){返回值;}」以任何方式將類Foo轉換爲int?儘管不是對int的引用,但int仍然是這樣,所以p ++應該可以工作,但事實並非如此。 – 2012-07-07 20:02:18