2011-11-08 34 views
2

我正在閱讀一些書,我決定編寫我自己的用戶定義類型的後增量運算符的實現。這是代碼。用戶定義類型的行爲的後增量運算符

#include <iostream> 

using namespace std; 

class X 
{ 
    int a; 

    public: 
    X(int x=1):a(x){} 

    X operator++(int) 
    { 
     X oldobj = *this; 
     (*this).a++; 
     return oldobj; 
    } 

int get(){return a;} 

}; 

int main() 
{ 
    X obj,obj2; 
    obj++ = obj2; 
    cout<< obj.get() << endl; 
    return 0; 
} 

我希望輸出爲1,因爲增量完成後OBJ 2的值將被複制。但輸出是2

想法?

P.S.我知道這段代碼不會贏得任何獎牌和謬論。這僅僅是爲了我的理解。順便提一句,++obj = obj2返回1;

行爲未定義?

+0

'(*此)。A ++'更通常寫作爲'this-> a ++'(或者只是'a ++') – sehe

回答

4

正如你的語法告訴你的那樣,postfix操作符返回一箇舊值的副本,所以這就是遞增的值,而不是你的對象。

基本上,

obj++ = obj2; 

會做到這一點:

X tempObj = obj; 
obj ++; 
tempObj = obj2; 

你分配obj2給一個臨時變量。

1

該行爲實際上是明確定義的。

您正在分配obj++的結果,這是一個臨時的 - obj從後增量前的副本。此作業不影響obj,該值從增量中保留其值2

的代碼是大致等效於:

X temp = obj; 
obj++; 
temp = obj2; 
2

obj++返回一個臨時對象保持舊值。

所以,雖然「增量完成後obj2的價值將被複制」是真實的,它不是複製到原來的obj在所有:)