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

2021-08-16 11:09:33 字數 2053 閱讀 4559

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 中關於運算子過載的乙個問題

如果沒有自己定義預設建構函式,而你使用了ccomplex s 顯然編譯器是會報錯的。在c 中如果程式設計師沒有編寫任何形式的建構函式,那麼編譯器就會自動合成乙個預設 的建構函式,原型可能是這個樣子 classname 該建構函式用來構造預設物件。而一旦程式設計師自己定義了任何形式的其他建構函式,那麼...

C 運算子過載中過載為類的成員函式和過載為類的友元函式

友元函式 bai 具有與du類成員函式相同訪問zhi權利的 非dao成員函式 他可以訪問類專的私有和保護成員屬 通過該類物件 物件指標或其引用。簡單且一般的說 運算子過載為類的成員函式,他的引數個數會比 該運算子的操作符 少一,而運算子過載為友元函式時,他的引數與其操作個數是相同的。友員函式是指來在...

C過載後置自增運算子把時間物件的秒數加1,返回原值

按照理解,24 60 60是轉化為0 60 60吧 後增一般是先用個臨時變數拷貝乙份 this,在本身自增1後 return這個臨時變數就好了吧。一般前置 返回的是time 後置的好像直接返回time就好,沒有引用。在c 中,用友元函式過載後置自增運算子時,其參數列中的引數個數為?乙個,在後遞增運算...