掀開c 中this指標的神秘面紗

2021-08-09 18:38:55 字數 1715 閱讀 1813

我們都知道類的不同例項都可以呼叫成員函式,那麼成員函式如何知道哪個例項要被操作呢,原因在於每個物件都擁有乙個指標:this指標,通過this指標來訪問自己的位址。

#include 

using

namespace

std;

class date

private:

int _year;

int _month;

int _day;

};int main()

以上**是乙個日期類,建立了2個物件d1和d2,都呼叫了成員函式setdate()。成員函式是如何知道哪個物件要呼叫它呢?如果用c語言去實現以上功能,**如下。

#define _crt_secure_no_warnings

typedef

struct date

date,*pdate;

void setdate(pdate this,int year,int month,int day)

int main()

建立了date型別的變數d1,d2後,要想呼叫setdate()函式去設定日期,引數除了年月日之外,還必須要傳乙個當前物件的位址才可以。而在cpp中,我們並沒有顯式的去傳乙個當前物件的位址,而是用當前物件加上成員選擇符去呼叫成員函式,那編譯器會不會幫我們隱式的傳了當前物件的位址呢?
d1.setdate(2017, 10, 22);

00c7177e push 16h

00c71780 push 0ah

00c71782 push 7e1h

00c71787 lea ecx,[d1]

00c7178a call date::setdate (0c7101eh)

以上**是setdate()函式的彙編**,顯而易見,該函式除了的引數除了我們顯式定義的引數,編譯器還使用ecx暫存器傳遞了例項d1的位址。
void setdate(int year, int month, int day)

進入setdate()函式內部,根據彙編**可知,ecx暫存器把它的內容交給了this指標,這就可以解釋不同例項為什麼可以呼叫同乙個成員函式。類型別*const,我們無法改變this指標的指向,所以是const.首先應該明確的是指標和引用在底層的實現是相同的,之所以叫this指標,是因為最開始將c++稱作帶類的c,而引用則是在c++1.0版才加入使用的,因此叫做this指標。
#define _crt_secure_no_warnings

#include

using

namespace

std;

class date

private:

int _year;

int _month;

int _day;

};int main()

以上**的執行結果為

00affd20

00affd20

00000000

根據執行結果可知,this指標是可能為空的。只是無法在成員函式內部置空,this為空時不能呼叫成員變數。當函式引數確定時,使用_thiscalll 呼叫約定

當函式引數不確定時,使用_cdecl呼叫約定

python中類的神秘面紗

看完篇你就可以飄起來了 一 例項化過程 例項化 其實就是以people類為模版,在記憶體裡開闢一塊空間,存上資料,賦值成乙個變數名 class people object def init self,name,f self.name name self.def people name self pr...

TF IDF的神秘面紗

tf idf演算法 可以評估一字詞對於乙個檔案集或乙個語料庫中的其中乙份檔案的重要程度。字詞的重要性隨著它在檔案 現的次數成正比增加,但同時會隨著它在語料庫 現的頻率成反比下降。主要思想是 如果某個詞或短語在一篇文章 現的頻率tf高,並且在其他文章中很少出現,則認為此詞或者短語具有很好的類別區分能力...

揭開C 類中虛表的「神秘面紗」

c 類中的虛表結構是c 物件模型中乙個重要的知識點,這裡咱們就來深入分析下虛表的在記憶體中的結構。c 乙個類中有虛函式的話就會有乙個虛表指標,其指向對應的虛表,一般乙個類只會有乙個虛表,每個虛表有多個 插槽 每個插槽存放乙個虛函式的位址。插槽中的內容可以被覆蓋,子類如果重寫了父類中的虛函式,則插槽中...