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 簡單的說 運算子就是變數的內容加1個單位,但究竟1個單位是多少要看實際版定義的變權量的型別 比如 定義int a 0 那麼a 表示在下次使用a時a中存放的變數會變為1,即a 0 1 如果定位為int a b 這裡我們假設b已經經過了定義,為int b 10 此時a中存放的內容為b 0 的位址,我們假... 是c 的類成員函式指標呼叫運算子,是用來呼叫乙個類函式指標的。舉例 假設有乙個專classa類擁有乙個成員函式void classa func int i 則可屬以這麼用 void classa fp int i 定義乙個類函式指標。classa obj fp classa func 給這個類函式指... p13 p11 12不能過得原因是 operator 返回的是臨時變數,而你opertor 操作需要的是引用變數。會讓編譯器找不到需要的operator 操作。建議在operator 引數上加上const。或者讓operator 操作返回引用即可。這個錯誤的意思是 在乙個加了const限定符的成員函...C 中的自增加運算子,C 運算子過載之自增 自減 運算子
C中不能被過載的運算子中是什麼運算子高手們幫忙解決
c 操作符過載問題,C 運算子過載是什麼意思