C++中this指針的用法及介紹

this指針只能在一個類的成員函數(shù)中調(diào)用卫键,它表示當(dāng)前對象的地址输拇。下面是一個例子:

void Date::setMonth( int mn )

{

month = mn; // 這三句是等價的

this->month = mn;

(*this).month = mn;

}

1. this只能在成員函數(shù)中使用贪庙。

全局函數(shù),靜態(tài)函數(shù)都不能使用this。

實際上,成員函數(shù)默認(rèn)第一個參數(shù)為T* const register this奔缠。

如:

class A{public: int func(int p){}};

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

2. 由此可見吼野,this在成員函數(shù)的開始前構(gòu)造的校哎,在成員的結(jié)束后清除。

這個生命周期同任一個函數(shù)的參數(shù)是一樣的瞳步,沒有任何區(qū)別贬蛙。

當(dāng)調(diào)用一個類的成員函數(shù)時,編譯器將類的指針作為函數(shù)的this參數(shù)傳遞進(jìn)去谚攒。如:

A a;

a.func(10);

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

嗯氛堕,看起來和靜態(tài)函數(shù)沒差別馏臭,對嗎?不過讼稚,區(qū)別還是有的括儒。編譯器通常會對this指針做一些優(yōu)化的,因此锐想,this指針的傳遞效率比較高--如vc通常是通過ecx寄存器來傳遞this參數(shù)帮寻。

3. 回答

#1:this指針是什么時候創(chuàng)建的?

this在成員函數(shù)的開始執(zhí)行前構(gòu)造的,在成員的執(zhí)行結(jié)束后清除赠摇。

#2:this指針存放在何處? 堆,棧,全局變量,還是其他?

this指針會因編譯器不同固逗,而放置的位置不同浅蚪。可能是棧烫罩,也可能是寄存器惜傲,甚至全局變量。

#3:this指針如何傳遞給類中函數(shù)的?綁定?還是在函數(shù)參數(shù)的首參數(shù)就是

如何找到類實例后函數(shù)的?

this是通過函數(shù)參數(shù)的首參數(shù)來傳遞的贝攒。this指針是在調(diào)用之前生成的盗誊。類實例后的函數(shù),沒有這個說法隘弊。類在實例化時哈踱,只分配類中的變量空間,并沒有為函數(shù)分配空間梨熙。自從類的函數(shù)定義完成后开镣,它就在那兒,不會跑的串结。

#4:this指針如何訪問類中變量的/?

如果不是類哑子,而是結(jié)構(gòu)的話,那么肌割,如何通過結(jié)構(gòu)指針來訪問結(jié)構(gòu)中的變量呢卧蜓?如果你明白這一點(diǎn)的話,那就很好理解這個問題了把敞。

在C++中弥奸,類和結(jié)構(gòu)是只有一個區(qū)別的:類的成員默認(rèn)是private,而結(jié)構(gòu)是public奋早。

this是類的指針盛霎,如果換成結(jié)構(gòu),那this就是結(jié)構(gòu)的指針了耽装。

#5:我們只有獲得一個對象后,才能通過對象使用this指針,如果我們知道一個對象this指針的位置可以直接使用嗎?

this指針只有在成員函數(shù)中才有定義愤炸。因此,你獲得一個對象后掉奄,也不能通過對象使用this指針规个。所以,我們也無法知道一個對象的this指針的位置(只有在成員函數(shù)里才有this指針的位置)姓建。當(dāng)然诞仓,在成員函數(shù)里,你是可以知道this指針的位置的(可以&this獲得)速兔,也可以直接使用的墅拭。

#6:每個類編譯后,是否創(chuàng)建一個類中函數(shù)表保存函數(shù)指針,以便用來調(diào)用函數(shù)?

普通的類函數(shù)(不論是成員函數(shù),還是靜態(tài)函數(shù))涣狗,都不會創(chuàng)建一個函數(shù)表來保存函數(shù)指針的谍婉。只有虛函數(shù)才會被放到函數(shù)表中舒憾。

但是,既使是虛函數(shù)屡萤,如果編譯器能明確知道調(diào)用的是哪個函數(shù)珍剑,編譯器就不會通過函數(shù)表中的指針來間接調(diào)用,而是會直接調(diào)用該函數(shù)死陆。

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

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

其實措译,模擬實現(xiàn)this的調(diào)用别凤,在很多場合下,很多人都做過领虹。

例如规哪,系統(tǒng)回調(diào)函數(shù)。系統(tǒng)回調(diào)函數(shù)有很多塌衰,如定時诉稍,線程啊什么的。

舉一個線程的例子:

class A{

int n;

public:

static void run(void* pThis){

A* this_ = (A*)pThis;

this_->process();

}

void process(){}

};

main(){

A a;

_beginthread( A::run, 0, &a );

}

這里就是定義一個靜態(tài)函數(shù)來模擬成員函數(shù)最疆。

也有許多C語言寫的程序杯巨,模擬了類的實現(xiàn)。如freetype庫等等努酸。

其實服爷,有用過C語言的人,大多都模擬過获诈。只是當(dāng)時沒有明確的概念罷了仍源。

如:

typedef struct student{

int age;

int no;

int scores;

}Student;

void initStudent(Student* pstudent);

void addScore(Student* pstudent, int score);

...

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

它相當(dāng)于:

class Student{

public:

int age; int no; int scores;

void initStudent();

void addScore(int score);

}

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

///this指針是在創(chuàng)建對象前創(chuàng)建.

this指針放在棧上,在編譯時刻已經(jīng)確定.

并且當(dāng)一個對象創(chuàng)建后,并且運(yùn)行整個程序運(yùn)行期間只有一個this指針.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亡嫌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子昼伴,更是在濱河造成了極大的恐慌镣屹,老刑警劉巖圃郊,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異女蜈,居然都是意外死亡色瘩,警方通過查閱死者的電腦和手機(jī)逸寓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門居兆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人竹伸,你說我怎么就攤上這事泥栖。” “怎么了吧享?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵譬嚣,是天一觀的道長。 經(jīng)常有香客問我拜银,道長,這世上最難降的妖魔是什么尼桶? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮牲尺,結(jié)果婚禮上幌蚊,老公的妹妹穿的比我還像新娘谤碳。我一直安慰自己溢豆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布搓茬。 她就那樣靜靜地躺著队他,像睡著了一般。 火紅的嫁衣襯著肌膚如雪麸折。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天窜锯,我揣著相機(jī)與錄音,去河邊找鬼锚扎。 笑死吞瞪,一個胖子當(dāng)著我的面吹牛驾孔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播助币,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼眉菱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了俭缓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤愿吹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后犁跪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歹袁,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年枫耳,在試婚紗的時候發(fā)現(xiàn)自己被綠了孟抗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡凄硼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出警医,到底是詐尸還是另有隱情,我是刑警寧澤预皇,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布婉刀,位于F島的核電站,受9級特大地震影響突颊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜律秃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一棒动、第九天 我趴在偏房一處隱蔽的房頂上張望糙申。 院中可真熱鬧船惨,春花似錦、人聲如沸粱锐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恶座。三九已至,卻和暖如春奥裸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背湾宙。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工侠鳄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留埠啃,地道東北人伟恶。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像潦牛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子巴碗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • __block和__weak修飾符的區(qū)別其實是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用橡淆,...
    LZM輪回閱讀 3,291評論 0 6
  • 1.寫一個NSString類的實現(xiàn) +(id)initWithCString:(c*****t char *)nu...
    韓七夏閱讀 3,752評論 2 37
  • C++文件 例:從文件income. in中讀入收入直到文件結(jié)束,并將收入和稅金輸出到文件tax. out具滴。 檢查...
    SeanC52111閱讀 2,764評論 0 3
  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型师倔。 運(yùn)用指針編程是C語言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu)溯革; ...
    朱森閱讀 3,430評論 3 44
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,511評論 1 51