2 回答

TA貢獻1865條經驗 獲得超7個贊
哎,這些東西如果一說就復雜了。
是這樣的,其實不管C語言還是C++語言,最后編譯成機器碼并沒有什么本質的區別,所謂類,雖然在語言這個層面有了一個概念性的解釋(相同屬性相同操作的集合的抽象化),但是實際上在二進制的表示和結構上沒有什么本質的區別,都是一個內存區域保存了一些值。那這樣一來,就可能使得程序員跨過一個類的限制(比如應該只能訪問自己的成員,但是你想辦法訪問了其他對象的成員)。
所以C++在設計的時候就隱含了一個this指針,這個指針主要是用于保證你的訪問不能跨界和用于區分不同的對象。舉個例子,你的任何一個函數的申明實際隱含了一個this指針參數,這個參數你不可見,也不可編輯,是編譯器自動添加上去的,為什么要這樣?實際上對象在實例化的時候,體積是非常小的,并沒有每一個對象都保存函數,同一個類的對象的函數實際上只有一份副本(二進制層面),那如何來區分到底是誰調用了函數?就是這個this指針。
this指針實際是指向了對象的內存地址起始值,所以通過一個偏移量,就知道了對象的各種屬性(變量),也就確定了一個絕對的對象。當然在對象的函數操作里我們可以顯示的用this->的方式來引用變量,但是你也發現你即使不加上this指針,它依然知道你引用了誰,其實就是隱含了一個參數this指針。
為了進一步理解,想一下static修飾的函數有什么區別,為什么static函數只能訪問static修飾的屬性?因為static修飾的函數就沒有傳遞這個this指針,所以它不知道你指的是哪一個對象。而實際上,static修飾的符號就和C語言的全局變量和函數無區別了。

TA貢獻1811條經驗 獲得超4個贊
一個對象的this指針并不是對象本身的一部分,不會影響sizeof(對象)的結果。this作用域是在類內部,當在類的非靜態成員函數中訪問類的非靜態成員的時候,編譯器會自動將對象本身的地址作為一個隱含參數傳遞給函數。也就是說,即使你沒有寫上this指針,編譯器在編譯的時候也是加上this的,它作為非靜態成員函數的隱含形參,對各成員的訪問均通過this進行。
例如,調用date.SetMonth(9) <===> SetMonth(&date, 9),this幫助完成了這一轉換 .
- 2 回答
- 0 關注
- 1304 瀏覽
添加回答
舉報