c++中使用this指標來指向用來呼叫成員函
數的物件。
乙個物件
的this指標並不是物件本身的一部分,不會影響sizeof(物件)的結果。this
作用域是在類內部,當在類的非靜態成員函式中訪問類的非靜態成員的時候,
編譯器會自動將
物件本身的位址作為乙個隱含
引數傳遞
給函式。
也就是說,即使你沒有寫上
this
指標,編譯器在編譯的時候也是加上
this
的,它作為非靜態成員函式的隱含形參,對各成員的訪問均通過
this
進行。
1、在類的非靜態成員函式中,如果要返回物件本身,比較簡單的辦法就是return *this; 2、
當引數與成員變數名相同時,如
this->n = n
(不能寫成
n = n);
3、使用this對兩個物件進行操作,使得程式更加清晰;
(1)this
只能在成員函式中使用。
全域性函式、靜態函式都不能使用
this.
實際上,成員函式預設第乙個引數為
t * const this。
如: class a
};其中,
func
的原型在編譯器看來應該是:
int func(a * const this,int p);
(2)由此可見,
this
在成員函式的開始前構造,在成員函式的結束後清除。
這個生命週期同任何乙個函式的引數是一樣的,沒有任何區別。
當呼叫乙個類的成員函式時,編譯器將類的指標作為函式的
this
引數傳遞進去。如:
a a;
a.func(10);
此處,編譯器將會編譯成:
a::func(&a,10);
看起來和靜態函式沒差別,對嗎?不過,區別還是有的。編譯器通常會對
this
指標做一些優化,
因此,this
指標的傳遞效率比較高--如
vc通常是通過
ecx暫存器傳遞
this
引數的。
(3)幾個
this
指標的易混問題。
a. this
指標是什麼時候建立的?
this
在成員函式的開始執行前構造,在成員的執行結束後清除。
但是如果
class
或者struct
裡面沒有方法的話,它們是沒有建構函式的,只能當做c的
struct
使用。採用
type xx
的方式定義的話,在棧裡分配記憶體,這時候
this
指標的值就是這塊記憶體的位址。採用
new的方式
建立物件的話,在堆裡分配記憶體,
new操作符通過
eax返回分配
的位址,然後設定給指標變數。之後去調
用建構函式(如果有建構函式的話),這時將這個記憶體塊的位址傳給
ecx,之後建構函式裡面怎麼處理請
看上面的回答。
b. this
指標存放在何處?堆、棧、全域性變數,還是其他?
this
指標會因編譯器不同而有不同的放置位置。可能是棧,也可能是暫存器,甚至全域性變數。在彙編級
別裡面,乙個值只會以
3種形式出現:立即數、暫存器值和記憶體變數值。不是存放在暫存器就是存放在內
存中,它們並不是和高階語言變數對應的。
c. this
指標是如何傳遞類中的函式的?
繫結?還是在函式引數的首引數就是
this
指標?那麼,
this
指標又是如何找到「類例項後函式的」?
大多數編譯器通過
ecx暫存器傳遞
this
指標。事實上,這也是乙個潛規則。一般來說,不同編譯器都會遵從一致的傳參規則,否則不同編譯器產生的
obj就無法匹配了。 在
call
之前,編譯器會把對應的物件位址放到
eax中。
this
是通過函式引數的首參來傳遞的。
this
指標在呼叫之前生成,至於「類例項後函式」,沒有這個說法。類在例項化時,只分配類中的變數空間,並沒有為函式分配空間。自從類的函式定義完成後,它就在那兒,不會跑的。
d. this
指標是如何訪問類中的變數的?
如果不是類,而是結構體的話,那麼,如何通過結構指標來訪問結構中的變數呢?如果你明白這一點的話,就很容易理解這個問題了。 在
c++中
,類和結構是只有乙個區別的:類的成員預設是
private
,而結構是
public
。this
是類的指標,如果換成結構,那
this
就是結構的指標了。
e.我們只有獲得乙個物件後,才能通過物件使用
this
指標。如果我們知道乙個物件
this
指標的位置,可以直接使用嗎?
this
指標只有在成員函式中才有定義。因此,你獲得乙個物件後,也不能通過物件使用
this
指標。所以,我們無法知道乙個物件的
this
指標的位置(只有在成員函式裡才有
this
指標的位置)。當然,在成員函式裡,你是可以知道
this
指標的位置的(可以通過
&this
獲得),也可以直接使用它。
f.每個類編譯後,是否建立乙個類中函式表儲存函式指標,以便用來呼叫函式?
普通的類函式(不論是成員函式,還是靜態函式)都不會建立乙個函式表來儲存函式指標。只有虛函式才會被放到函式表中。但是,即使是虛函式,如果編譯器能明確知道呼叫的是哪個函式,編譯器就不會通過函式表中的指標來間接呼叫,而是會直接呼叫該函式。
比較兩個student物件mike,john中的score,返回較大的那乙個。
為了程式簡單又能說明問題,這裡的類盡量簡單。
#ifndef this_h_
#define this_h_
class student
;#endif
重點在於get_high_score()函式,是乙個物件對另乙個物件的引用,返回score更大的物件;
#include "this.h"
student::student(int data)
const student & student::get_high_score(const student &s)const
student::~student()
{}
在main函式裡面簡單的使用一下:
這種用法的原理是乙個物件(mike)呼叫另乙個物件的引用
#include#include "this.h"
using namespace std;
int main()
程式的執行結果會返回86。 C 中的this指標
當乙個成員函式被呼叫時,自動向它傳遞乙個隱含的引數,該引數是乙個指向接 受該函式的呼叫的物件的指標,在程式中可以使用關鍵字this指標來引用改制鎮,因此稱該指標為this指標。this指標是c 實現封裝的一種機制,它將成員和用於操作這些成員的成員函式聯絡在一起。例如 location類的成員函式in...
C 中的this指標
1.this 指標的引入 每個成員函式 static函式外 都有乙個額外的隱含的this指標,乙個類物件在條用成員函式時this指標初始化為呼叫函式物件的位址。例1 sales item.h class sales item sales item.cpp bool sales item same i...
C 中的指標
在學習c c 過程中,指標是乙個比較讓人頭痛的問題,稍微不注意將會是程式編譯無法通過,甚至造成宕機。在程式設計過程中,指標也往往是產生隱含bug的原因。下面就來談談指標的應用以及需要注意的一些問題,裡面也許就有你平時沒有注意到的問題,希望能幫助各位讀者理解好指標。一 我們先來回憶一下指標的概念吧,方...