用匯編的眼光看C++(之算術(shù)符重載).doc_第1頁(yè)
用匯編的眼光看C++(之算術(shù)符重載).doc_第2頁(yè)
用匯編的眼光看C++(之算術(shù)符重載).doc_第3頁(yè)
用匯編的眼光看C++(之算術(shù)符重載).doc_第4頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

軟件英才網(wǎng) 軟件行業(yè)馳名招聘網(wǎng)站用匯編的眼光看C+(之算術(shù)符重載) 算術(shù)符重載是類的有一個(gè)特性,但是每個(gè)人使用的方法不一樣。用的好,則事半功倍;但是如果不正確的使用,則會(huì)后患無(wú)窮。 (1) 簡(jiǎn)單算術(shù)符介紹 那什么是算術(shù)符重載呢?我們可以舉個(gè)例子。一般來(lái)說(shuō),我們定義兩個(gè)int類型的變量的話,我們就可應(yīng)對(duì)這兩個(gè)類型進(jìn)行加、減、乘、除的操作,同時(shí)還能比較判斷、打印、數(shù)組操作、*號(hào)操作等等。那么如果我們想自己定義的類也具有這樣的屬性,那我們應(yīng)該怎么辦呢?當(dāng)然就要算術(shù)符重載了。首先,我們對(duì)基本class做一個(gè)定義:cpp view plaincopy1 class desk 2 3 public: 4 int price; 5 6 desk(int value):price(value) 7 desk() 8 desk& operator+= (desk& d) 9 this-price += d.price; 10 return *this; 11 12 ; 下面,可以用一個(gè)范例函數(shù)說(shuō)明一下使用的方法:cpp view plaincopy13 74: desk n(5); 14 0040126D push 5 15 0040126F lea ecx,ebp-10h 16 00401272 call ILT+0(desk:desk) (00401005) 17 00401277 mov dword ptr ebp-4,0 18 75: desk m(10); 19 0040127E push 0Ah 20 00401280 lea ecx,ebp-14h 21 00401283 call ILT+0(desk:desk) (00401005) 22 00401288 mov byte ptr ebp-4,1 23 76: n += m; 24 0040128C lea eax,ebp-14h 25 0040128F push eax 26 00401290 lea ecx,ebp-10h 27 00401293 call ILT+40(desk:operator+=) (0040102d) 28 77: 大家可以把重點(diǎn)放在76句上面,不過(guò)74、75句我們也會(huì)稍微介紹一下: 74句: 創(chuàng)建desk類型的臨時(shí)變量n,調(diào)用構(gòu)造函數(shù) 75句: 創(chuàng)建desk類型的臨時(shí)變量m,調(diào)用構(gòu)造函數(shù) 76句: 兩個(gè)desk類型的數(shù)據(jù)相加,但是在匯編的形式上面,我們發(fā)現(xiàn)編譯器把這段代碼解釋成函數(shù)調(diào)用,也就是我們?cè)谏厦娑x的算術(shù)符重載函數(shù)。 (2)new、free重載 在C+里面,我們不光可以對(duì)普通的算術(shù)符進(jìn)行重載處理,還能對(duì)new、free進(jìn)行重載。通過(guò)重載new、free,我們還可以加深對(duì)代碼的認(rèn)識(shí),正確認(rèn)識(shí)構(gòu)造、析構(gòu)、堆內(nèi)存分配的原理。 首先,我們對(duì)new和delete進(jìn)行重載定義:cpp view plaincopy29 class desk 30 31 public: 32 int price; 33 34 desk(int value):price(value) 35 desk() 36 void* operator new(size_t size) return malloc(size); 37 void operator delete (void* pData) if(NULL != pData) free(pData); 38 ; 那么使用呢?cpp view plaincopy39 72: desk* d = new desk(10); 40 0040127D push 4 41 0040127F call ILT+65(desk:operator new) (00401046) 42 00401284 add esp,4 43 00401287 mov dword ptr ebp-18h,eax 44 0040128A mov dword ptr ebp-4,0 45 00401291 cmp dword ptr ebp-18h,0 46 00401295 je process+56h (004012a6) 47 00401297 push 0Ah 48 00401299 mov ecx,dword ptr ebp-18h 49 0040129C call ILT+5(desk:desk) (0040100a) 50 004012A1 mov dword ptr ebp-24h,eax 51 004012A4 jmp process+5Dh (004012ad) 52 004012A6 mov dword ptr ebp-24h,0 53 004012AD mov eax,dword ptr ebp-24h 54 004012B0 mov dword ptr ebp-14h,eax 55 004012B3 mov dword ptr ebp-4,0FFFFFFFFh 56 004012BA mov ecx,dword ptr ebp-14h 57 004012BD mov dword ptr ebp-10h,ecx 58 73: delete d; 59 004012C0 mov edx,dword ptr ebp-10h 60 004012C3 mov dword ptr ebp-20h,edx 61 004012C6 mov eax,dword ptr ebp-20h 62 004012C9 mov dword ptr ebp-1Ch,eax 63 004012CC cmp dword ptr ebp-1Ch,0 64 004012D0 je process+91h (004012e1) 65 004012D2 push 1 66 004012D4 mov ecx,dword ptr ebp-1Ch 67 004012D7 call ILT+0(desk:scalar deleting destructor) (00401005) 68 004012DC mov dword ptr ebp-28h,eax 69 004012DF jmp process+98h (004012e8) 70 004012E1 mov dword ptr ebp-28h,0 71 74: 上面是一段普通的new、delete使用代碼。但是我們發(fā)現(xiàn),簡(jiǎn)單的一個(gè)語(yǔ)句,在匯編器看來(lái),卻需要做這么多的內(nèi)容,這是為什么呢,我們不妨來(lái)自習(xí)看一看: 72句:匯編中有兩個(gè)函數(shù)調(diào)用,一個(gè)是new調(diào)用,也就是我們重定義的new函數(shù),一個(gè)是構(gòu)造函數(shù),最后的幾行代碼主要是把構(gòu)造函數(shù)返回指針賦值給一些臨時(shí)變量,可忽略 73句:匯編中首先讓指針和0進(jìn)行了判斷,然后調(diào)用了一個(gè)函數(shù),似乎沒(méi)有調(diào)用我們的delete函數(shù),我們可以跟進(jìn)去看一下:cpp view plaincopy72 desk:scalar deleting destructor: 73 00401410 push ebp 74 00401411 mov ebp,esp 75 00401413 sub esp,44h 76 00401416 push ebx 77 00401417 push esi 78 00401418 push edi 79 00401419 push ecx 80 0040141A lea edi,ebp-44h 81 0040141D mov ecx,11h 82 00401422 mov eax,0CCCCCCCCh 83 00401427 rep stos dword ptr edi 84 00401429 pop ecx 85 0040142A mov dword ptr ebp-4,ecx 86 0040142D mov ecx,dword ptr ebp-4 87 00401430 call ILT+75(desk:desk) (00401050) 88 00401435 mov eax,dword ptr ebp+8 89 00401438 and eax,1 90 0040143B test eax,eax 91 0040143D je desk:scalar deleting destructor+3Bh (0040144b) 92 0040143F mov ecx,dword ptr ebp-4 93 00401442 push ecx 94 00401443 call ILT+80(desk:operator delete) (00401055) 95 00401448 add esp,4 96 0040144B mov eax,dword ptr ebp-4 97 0040144E pop edi 98 0040144F pop esi 99 00401450 pop ebx 100 00401451 add esp,44h 101 00401454 cmp ebp,esp 102 00401456 call _chkesp (00408810) 103 0040145B mov esp,ebp 104 0040145D pop ebp 105 0040145E ret 4 上面的代碼便是跟到0x401005之后遇到的代碼,這里有一個(gè)跳轉(zhuǎn),真正函數(shù)開(kāi)始的地方是0x401410。這里我們發(fā)現(xiàn)函數(shù)實(shí)際上還是調(diào)用了我們定義的delete函數(shù)和desk的析構(gòu)函數(shù)。只不過(guò)析構(gòu)函數(shù)一定要放在delete調(diào)用之前。所以,這里我們就看到了,c+中new的真正含義就是先分配內(nèi)存,然后調(diào)用構(gòu)造函數(shù);而delete則是先對(duì)變量進(jìn)行析構(gòu)處理,然后free內(nèi)存,這就是new和delete的全部意義。掌握了這個(gè)基礎(chǔ),可以幫助我們本地對(duì)內(nèi)存進(jìn)行很好的管理。 (3)friend算術(shù)符重載和普通算術(shù)符重載的區(qū)別 有一種算術(shù)符的重載是這樣的:cpp view plaincopy106 class desk 107 108 int price; 109 public: 110 desk(int value):price(value) 111 desk() 112 friend desk operator+ (desk& d1, desk& d2); 113 ; 114 115 desk operator +(desk& d1, desk& d2) 116 117 desk d(0); 118 d.price = d1.price + d2.price; 119 return d; 120 121 122 void process() 123 124 desk d1(3); 125 desk d2(4); 126 desk d = d1 + d2; 127 return; 128 感興趣的同學(xué)可以匯編看一下,找一找它和普通的非友元函數(shù)有哪些區(qū)別。不過(guò)上面的代碼還是讓我們看出了一些端倪: a)友元函數(shù)不屬于類,因?yàn)槎x的時(shí)候我們發(fā)現(xiàn)沒(méi)有desk:這樣的前綴 b)友元算術(shù)符重載需要比普通的算術(shù)符重載多一個(gè)輸入?yún)?shù) c)友元函數(shù)在進(jìn)行算術(shù)重載定義的時(shí)候需要多定義一個(gè)臨時(shí)變量d,這在函數(shù)operator+()可以看出來(lái) d)友元算術(shù)重載函數(shù)會(huì)破壞原來(lái)類地封裝性 e)友元函數(shù)實(shí)際上就是全

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論