C 中this指標的用法

2022-08-31 13:21:10 字數 2345 閱讀 7554

this指標只能在乙個類的成員函式中呼叫,它表示當前物件的位址。下面是乙個例子:

void date::setmonth( int mn )

1. this只能在成員函式中使用。

全域性函式,靜態函式都不能使用this。

實際上,成員函式預設第乙個引數為t* const register this。

如:

class a};

其中,func的原型在編譯器看來應該是: int func(a* const register this, int p);

2. 由此可見,this在成員函式的開始前構造的,在成員的結束後清除。

這個生命週期同任乙個函式的引數是一樣的,沒有任何區別。

當呼叫乙個類的成員函式時,編譯器將類的指標作為函式的this引數傳遞進去。如:

a a;

a.func(10);

此處,編譯器將會編譯成: a::func(&a, 10);

嗯,看起來和靜態函式沒差別,對嗎?不過,區別還是有的。編譯器通常會對this指標做一些優化的,因此,this指標的傳遞效率比較高--如vc通常是通過ecx暫存器來傳遞this引數。

3. 回答

#1:this指標是什麼時候建立的?

this在成員函式的開始執行前構造的,在成員的執行結束後清除。

#2:this指標存放在何處? 堆,棧,全域性變數,還是其他?

this指標會因編譯器不同,而放置的位置不同。可能是棧,也可能是暫存器,甚至全域性變數。

#3:this指標如何傳遞給類中函式的?繫結?還是在函式引數的首引數就是this指標.那麼this指標又是如何找到類例項後函式的?

this是通過函式引數的首引數來傳遞的。this指標是在呼叫之前生成的。類例項後的函式,沒有這個說法。類在例項化時,只分配類中的變數空間,並沒有為函式分配空間。自從類的函式定義完成後,它就在那兒,不會跑的。

#4:this指標如何訪問類中變數的/?

如果不是類,而是結構的話,那麼,如何通過結構指標來訪問結構中的變數呢?如果你明白這一點的話,那就很好理解這個問題了。

在c++中,類和結構是只有乙個區別的:類的成員預設是private,而結構是public。

this是類的指標,如果換成結構,那this就是結構的指標了。

#5:我們只有獲得乙個物件後,才能通過物件使用this指標,如果我們知道乙個物件this指標的位置可以直接使用嗎?

this指標只有在成員函式中才有定義。因此,你獲得乙個物件後,也不能通過物件使用this指標。所以,我們也無法知道乙個物件的this指標的位置(只有在成員函式裡才有this指標的位置)。當然,在成員函式裡,你是可以知道this指標的位置的(可以&this獲得),也可以直接使用的。

#6:每個類編譯後,是否建立乙個類中函式表儲存函式指標,以便用來呼叫函式?

普通的類函式(不論是成員函式,還是靜態函式),都不會建立乙個函式表來儲存函式指標的。只有虛函式才會被放到函式表中。

但是,既使是虛函式,如果編譯器能明確知道呼叫的是哪個函式,編譯器就不會通過函式表中的指標來間接呼叫,而是會直接呼叫該函式。

# 7:這些編譯器如何做到的?8:能否模擬實現?

知道原理後,這兩個問題就很容易理解了。

其實,模擬實現this的呼叫,在很多場合下,很多人都做過。

例如,系統**函式。系統**函式有很多,如定時,執行緒啊什麼的。

舉乙個執行緒的例子:

class a

void process(){}

};main()

這裡就是定義乙個靜態函式來模擬成員函式。

也有許多c語言寫的程式,模擬了類的實現。如freetype庫等等。

其實,有用過c語言的人,大多都模擬過。只是當時沒有明確的概念罷了。

如:

typedef struct studentstudent;

void initstudent(student* pstudent);

void addscore(student* pstudent, int score);

...

如果你把 pstudent改成this,那就一樣了。

它相當於:

class student

const常量可以有物理存放的空間,因此是可以取位址的

///this指標是在建立物件前建立.

this指標放在棧上,在編譯時刻已經確定.

並且當乙個物件建立後,並且執行整個程式執行期間只有乙個this指標.

C 中this指標的用法

1 為什麼引入this指標?最簡單的應用場景就是 當我們在類中定義了乙個變數,同時在類成員函式中定義了同一變數時,也就是說變數名重複時,但是我們想使用類中定義的變數,這個時候我們該怎麼辦呢?這個時候就是this指標大顯身手的時候了。為此我們引入this指標的概念。2 this指標的使用。乙個物件的t...

C 中this指標的用法

this指標抽象比喻 當我們在進入乙個房子之後,可以看見房子裡的桌子,椅子 地板等,但是看不到房子的全貌。對於乙個類的例項來說,你可以看到它的成員 函式 成員 變數,但是例項本身呢?this是乙個指標,它時時刻刻指向這個例項。乙個物件的多個成員就可看作是這個物件所擁有的桌子,椅子 地板等 而在很多個...

C 中this指標的用法詳解

1.this指標的用處 乙個物件的this指標並不是物件本身的一部分,不會影響sizeof 物件 的結果。this作用域是在類內部,當在類的非靜態成員函式中訪問類的非靜態成員的時候,編譯器會自動將物件本身的位址作為乙個隱含引數傳遞給函式。也就是說,即使你沒有寫上this指標,編譯器在編譯的時候也是加...