成員函式和this指標
阿新 • • 發佈:2019-01-24
成員函式和this指標
類的成員函式和一個普通的(全域性)函式可以認為沒有什麼差別。對於編譯器來說,經過名稱處理後(利用名稱空間、類名、引數等資訊進行技術性處理,使函式名稱內部唯一),一個成員函式其實就是一個普通函式,在編譯後的程式碼區域有著確定的函式體和函式入口。最大的差異發生在呼叫時,對於成員函式,編譯器將隱含push this指標,this指標指向物件的地址(物件可能位於棧上或堆上或全域性資料區),這就是操作所需要的資料(即成員資料)所在。
…
push p2
push p1
push object_pointer ; for C++ programmer, it is called “this” pointer
call f
…
將資料和對於資料的操作捆在一起,正是面嚮物件語言中的封裝思想,成員函式的需要訪問成員資料,通過傳遞this指標,這完美地實現了。
對於靜態成員函式,實際上就是普通函式而已,只不過編譯器限制了它的名字可視範圍(掛在某個類下)。呼叫靜態成員函式,是不需要push this指標的。呼叫某個類的靜態函式,只要在函式名字前加上類名限定符即可,而不需要一個物件指標。一個常見的誤用就是在靜態成員函式中試圖訪問普通成員變數(沒有物件指標,如何訪問其成員變數?)。不過靜態成員函式能訪問靜態成員變數(當然訪問全域性變數更沒有問題)。類似地,靜態成員變數實際上就是一種有訪問限制的全域性變數而已。從類的外部訪問靜態成員變數,前面需要加上類名限定符。