這個自加過載運算子,為什麼每執行一次x自增2而y只自增

2021-08-16 11:09:34 字數 2053 閱讀 5463

1樓:吉祥二進位制

你的問題提的好,先回答第一個問題

1、 我覺得return a(x++,y++)和return a(x,y)沒有區別,這樣認為對嗎?

對的,如這樣int a = x++; int b = y ++;類似這樣的**,c++的本意就是將x和y的原值賦值給a 和b,而++x 和++y是將x 和y 增1後再進行其它操作,你的理解是沒有錯的。

2、關於程式執行結果的問題,這個從兩個方面來說:

a、static資料成員為什麼會引入?這是為了強化作用域的概念,如上面的類a中的static,它實際的記憶體分配位置依然在全域性變數的記憶體中,但是它的作用域卻在類a中,這樣有效的防止了名字衝突。值得注意的是static資料成員和成員函式是沒有this指標的,關於this指標我會在第二點中進行說明。

b、this指標的理解,c++和c的差別 僅僅在於 資料的操作和操作的資料。這句話可以這樣理解。比如下面的順序表結構:

struct seqlist ;

如果用c語言來進行遍歷輸出,我們需要 void print( seqlist *plist) ; //函式有一個引數指向要操作的資料。 即c語言是操作的資料。

在c++中呢,我們應該是這樣的**:

class seqlist {

public:

void print() { cout

int a, b;

這就是c++為什麼稱為資料的操作。

那麼c++是如何實現這種機制呢?答案是使用this指標,每個成員函式在呼叫的時候,最後一個引數都是this指標。比如 seqlist object; object.

print(); //這時候原始碼中雖然沒有引數,但實際在彙編層總會有一個引數,這個引數就是this指標。這就是在c++中為什麼要object.***來呼叫成員函式的原因,如果不是這樣的呼叫,函式是不知道要操作**的資料的。

所以,第一次執行c.print()的時候,x=4 y = 35,這個是很容易理解的。關鍵是理解第二次和第三次,你是在 過載運算子裡面呼叫的類a的建構函式,這時候,違背了上面所說的object.

***來呼叫成員函式的機制,或者說 在成員函式裡直接呼叫建構函式,它是不會傳遞this指標的。所以 即便你呼叫了類a的建構函式,它的結果也是難以預料的,因為它不知道要操作哪塊資料。實際上出現 出現y = 36 , y=37的結果,這個只是一個錯誤的結果。

但是x = 6 x =8,卻是正確的,因為類a中的x是static資料成員,是一個全域性的變數,它不是物件的,是所有的物件共享的,因此是沒有錯的。或者說static資料成員或者成員函式是沒有this指標的,所以你的呼叫是有效果的。

//這段**是建構函式的反彙編**

004011ea   mov         dword ptr [ebp-4],ecx  //ecx是this指標儲存到ebp-4

19:           a::x=::x+x;

004011ed   mov         eax,[x (0042ae50)]     //全域性x

004011f2   add         eax,dword ptr [ebp+8]  //第一個引數

004011f5   mov         [a::x (0042ae54)],eax  //儲存eax到a::x

20:           a::y=::y+y;

004011fa   mov         ecx,dword ptr [y (0042e168)]//全域性y

00401200   add         ecx,dword ptr [ebp+0ch] //第二個引數

00401203   mov         edx,dword ptr [ebp-4]   //edx = this指標

00401206   mov         dword ptr [edx],ecx     //儲存成員y的值

注意對比就不難發現,x的操作是有效的,而y的操作實際上在沒有傳入this指標的情況下,你都 不知道它賦值到**去了。所以

a operator ++(int)

{return a(x++,y++); //這裡的y根本就是在原來35的基礎上依次+1 +1

C 中的自增加運算子,C 運算子過載之自增 自減 運算子

簡單的說 運算子就是變數的內容加1個單位,但究竟1個單位是多少要看實際版定義的變權量的型別 比如 定義int a 0 那麼a 表示在下次使用a時a中存放的變數會變為1,即a 0 1 如果定位為int a b 這裡我們假設b已經經過了定義,為int b 10 此時a中存放的內容為b 0 的位址,我們假...

C中不能被過載的運算子中是什麼運算子高手們幫忙解決

是c 的類成員函式指標呼叫運算子,是用來呼叫乙個類函式指標的。舉例 假設有乙個專classa類擁有乙個成員函式void classa func int i 則可屬以這麼用 void classa fp int i 定義乙個類函式指標。classa obj fp classa func 給這個類函式指...

c 操作符過載問題,C 運算子過載是什麼意思

p13 p11 12不能過得原因是 operator 返回的是臨時變數,而你opertor 操作需要的是引用變數。會讓編譯器找不到需要的operator 操作。建議在operator 引數上加上const。或者讓operator 操作返回引用即可。這個錯誤的意思是 在乙個加了const限定符的成員函...