2 回答

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
哎,這些東西如果一說(shuō)就復(fù)雜了。
是這樣的,其實(shí)不管C語(yǔ)言還是C++語(yǔ)言,最后編譯成機(jī)器碼并沒(méi)有什么本質(zhì)的區(qū)別,所謂類(lèi),雖然在語(yǔ)言這個(gè)層面有了一個(gè)概念性的解釋?zhuān)ㄏ嗤瑢傩韵嗤僮鞯募系某橄蠡?,但是?shí)際上在二進(jìn)制的表示和結(jié)構(gòu)上沒(méi)有什么本質(zhì)的區(qū)別,都是一個(gè)內(nèi)存區(qū)域保存了一些值。那這樣一來(lái),就可能使得程序員跨過(guò)一個(gè)類(lèi)的限制(比如應(yīng)該只能訪問(wèn)自己的成員,但是你想辦法訪問(wèn)了其他對(duì)象的成員)。
所以C++在設(shè)計(jì)的時(shí)候就隱含了一個(gè)this指針,這個(gè)指針主要是用于保證你的訪問(wèn)不能跨界和用于區(qū)分不同的對(duì)象。舉個(gè)例子,你的任何一個(gè)函數(shù)的申明實(shí)際隱含了一個(gè)this指針參數(shù),這個(gè)參數(shù)你不可見(jiàn),也不可編輯,是編譯器自動(dòng)添加上去的,為什么要這樣?實(shí)際上對(duì)象在實(shí)例化的時(shí)候,體積是非常小的,并沒(méi)有每一個(gè)對(duì)象都保存函數(shù),同一個(gè)類(lèi)的對(duì)象的函數(shù)實(shí)際上只有一份副本(二進(jìn)制層面),那如何來(lái)區(qū)分到底是誰(shuí)調(diào)用了函數(shù)?就是這個(gè)this指針。
this指針實(shí)際是指向了對(duì)象的內(nèi)存地址起始值,所以通過(guò)一個(gè)偏移量,就知道了對(duì)象的各種屬性(變量),也就確定了一個(gè)絕對(duì)的對(duì)象。當(dāng)然在對(duì)象的函數(shù)操作里我們可以顯示的用this->的方式來(lái)引用變量,但是你也發(fā)現(xiàn)你即使不加上this指針,它依然知道你引用了誰(shuí),其實(shí)就是隱含了一個(gè)參數(shù)this指針。
為了進(jìn)一步理解,想一下static修飾的函數(shù)有什么區(qū)別,為什么static函數(shù)只能訪問(wèn)static修飾的屬性?因?yàn)閟tatic修飾的函數(shù)就沒(méi)有傳遞這個(gè)this指針,所以它不知道你指的是哪一個(gè)對(duì)象。而實(shí)際上,static修飾的符號(hào)就和C語(yǔ)言的全局變量和函數(shù)無(wú)區(qū)別了。

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個(gè)贊
一個(gè)對(duì)象的this指針并不是對(duì)象本身的一部分,不會(huì)影響sizeof(對(duì)象)的結(jié)果。this作用域是在類(lèi)內(nèi)部,當(dāng)在類(lèi)的非靜態(tài)成員函數(shù)中訪問(wèn)類(lèi)的非靜態(tài)成員的時(shí)候,編譯器會(huì)自動(dòng)將對(duì)象本身的地址作為一個(gè)隱含參數(shù)傳遞給函數(shù)。也就是說(shuō),即使你沒(méi)有寫(xiě)上this指針,編譯器在編譯的時(shí)候也是加上this的,它作為非靜態(tài)成員函數(shù)的隱含形參,對(duì)各成員的訪問(wèn)均通過(guò)this進(jìn)行。
例如,調(diào)用date.SetMonth(9) <===> SetMonth(&date, 9),this幫助完成了這一轉(zhuǎn)換 .
- 2 回答
- 0 關(guān)注
- 1301 瀏覽
添加回答
舉報(bào)