2011-10-13 71 views
8

只見有關實現預增量和後加,這聲稱超載預增量能夠被定義爲超載預增量和後加

T& T ::operator++() 

和重載後遞增的示例可以定義和預incremet方面實現如下

const T T::operator++(int){ 
    const T old(*this); 
    ++(*this); 
    return old; 
} 

我有兩個問題:

1)什麼是「老」呢?

2)++(* this)被假定使用預增量,並且原始預增量定義沒有參數。但是,它有*這裏。

+3

'''===''''新' – Mehrdad

回答

2

「老」是什麼意思?

該方法是後增量。當前值(「舊值」)被返回,然後該值遞增(「新值」)。

++(* this)被假定爲使用預增量,並且原始預增量定義沒有參數。但是,它有*這裏。

*this不是一個參數。括號是沒有必要的,他們在那裏爲了可讀性。
這相當於++*this

+0

你的意思是'old'是* pre *增量值;因爲它是遞增之前對象的值 – Praetorian

+0

@Praetorian:將第一個單詞「It's」讀作「操作符」。建議改寫。 –

1

old只是一個變量名(它不是關鍵字,如果這就是你想知道的)。它用於保存操作數以前的值。

2

1)「old」是「this」在增加之前的值。後增加應該返回該值。

2)++(*此)等效於這個 - >運算符++()

2

2)++(*此)被假定爲使用預增量和原始 預增量定義沒有參數。但是,這裏有*此 。

++是一元操作符,所以它有一個參數沒問題。無論何時將運算符作爲成員函數進行重載,第一個參數都是當前對象。

未使用的int參數僅僅是區分增量前後的一個竅門,因爲operator++可以表示任意一個。後增加並不真的接受一個整數*,它只是一個(笨拙的)語言結構。

您也可以重載這些運營商免費功能:

struct T 
{ 
    int n; 
}; 

T& operator++(T& t) { ++t.n; return t; } 
T operator++(T& t, int) { T old(t); ++t; return old; } 

int main() 
{ 
    T a; 
    T b = a++; 
    ++b; 
} 

*在正常使用。當您使用函數調用語法調用操作符時,可以傳遞另一個int來區分這兩種操作:

operator++(a); //calls-preincrement 
operator++(b, 1); //calls post-increment