C++中this指針的用法及介紹
this指針只能在一個(gè)類的成員函數(shù)中調(diào)用,它表示當(dāng)前對(duì)象的地址。下面是一個(gè)例子: 
 
void Date::setMonth( int mn )
{
month = mn; // 這三句是等價(jià)的
this->month = mn;
(*this).month = mn;
}
1. this只能在成員函數(shù)中使用。
全局函數(shù),靜態(tài)函數(shù)都不能使用this。
實(shí)際上,成員函數(shù)默認(rèn)第一個(gè)參數(shù)為T* const register this。
如:
class A{public: int func(int p){}};
其中,func的原型在編譯器看來(lái)應(yīng)該是: int func(A* const register this, int p);
2. 由此可見(jiàn),this在成員函數(shù)的開(kāi)始前構(gòu)造的,在成員的結(jié)束后清除。
這個(gè)生命周期同任一個(gè)函數(shù)的參數(shù)是一樣的,沒(méi)有任何區(qū)別。
當(dāng)調(diào)用一個(gè)類的成員函數(shù)時(shí),編譯器將類的指針作為函數(shù)的this參數(shù)傳遞進(jìn)去。如:
A a;
a.func(10);
此處,編譯器將會(huì)編譯成: A::func(&a, 10);
嗯,看起來(lái)和靜態(tài)函數(shù)沒(méi)差別,對(duì)嗎?不過(guò),區(qū)別還是有的。編譯器通常會(huì)對(duì)this指針做一些優(yōu)化的,因此,this指針的傳遞效率比較高--如vc通常是通過(guò)ecx寄存器來(lái)傳遞this參數(shù)。
3. 回答
#1:this指針是什么時(shí)候創(chuàng)建的?
this在成員函數(shù)的開(kāi)始執(zhí)行前構(gòu)造的,在成員的執(zhí)行結(jié)束后清除。
#2:this指針存放在何處? 堆,棧,全局變量,還是其他?
this指針會(huì)因編譯器不同,而放置的位置不同。可能是棧,也可能是寄存器,甚至全局變量。
#3:this指針如何傳遞給類中函數(shù)的?綁定?還是在函數(shù)參數(shù)的首參數(shù)就是this指針.那么this指針又是如何找到類實(shí)例后函數(shù)的?
this是通過(guò)函數(shù)參數(shù)的首參數(shù)來(lái)傳遞的。this指針是在調(diào)用之前生成的。類實(shí)例后的函數(shù),沒(méi)有這個(gè)說(shuō)法。類在實(shí)例化時(shí),只分配類中的變量空間,并沒(méi)有為函數(shù)分配空間。自從類的函數(shù)定義完成后,它就在那兒,不會(huì)跑的。
#4:this指針如何訪問(wèn)類中變量的/?
如果不是類,而是結(jié)構(gòu)的話,那么,如何通過(guò)結(jié)構(gòu)指針來(lái)訪問(wèn)結(jié)構(gòu)中的變量呢?如果你明白這一點(diǎn)的話,那就很好理解這個(gè)問(wèn)題了。
在C++中,類和結(jié)構(gòu)是只有一個(gè)區(qū)別的:類的成員默認(rèn)是private,而結(jié)構(gòu)是public。
this是類的指針,如果換成結(jié)構(gòu),那this就是結(jié)構(gòu)的指針了。
#5:我們只有獲得一個(gè)對(duì)象后,才能通過(guò)對(duì)象使用this指針,如果我們知道一個(gè)對(duì)象this指針的位置可以直接使用嗎?
this指針只有在成員函數(shù)中才有定義。因此,你獲得一個(gè)對(duì)象后,也不能通過(guò)對(duì)象使用this指針。所以,我們也無(wú)法知道一個(gè)對(duì)象的this指針的位置(只有在成員函數(shù)里才有this指針的位置)。當(dāng)然,在成員函數(shù)里,你是可以知道this指針的位置的(可以&this獲得),也可以直接使用的。
#6:每個(gè)類編譯后,是否創(chuàng)建一個(gè)類中函數(shù)表保存函數(shù)指針,以便用來(lái)調(diào)用函數(shù)?
普通的類函數(shù)(不論是成員函數(shù),還是靜態(tài)函數(shù)),都不會(huì)創(chuàng)建一個(gè)函數(shù)表來(lái)保存函數(shù)指針的。只有虛函數(shù)才會(huì)被放到函數(shù)表中。
但是,既使是虛函數(shù),如果編譯器能明確知道調(diào)用的是哪個(gè)函數(shù),編譯器就不會(huì)通過(guò)函數(shù)表中的指針來(lái)間接調(diào)用,而是會(huì)直接調(diào)用該函數(shù)。
# 7:這些編譯器如何做到的?8:能否模擬實(shí)現(xiàn)?
知道原理后,這兩個(gè)問(wèn)題就很容易理解了。
其實(shí),模擬實(shí)現(xiàn)this的調(diào)用,在很多場(chǎng)合下,很多人都做過(guò)。
例如,系統(tǒng)回調(diào)函數(shù)。系統(tǒng)回調(diào)函數(shù)有很多,如定時(shí),線程啊什么的。
舉一個(gè)線程的例子:
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 );
}
這里就是定義一個(gè)靜態(tài)函數(shù)來(lái)模擬成員函數(shù)。
也有許多C語(yǔ)言寫的程序,模擬了類的實(shí)現(xiàn)。如freetype庫(kù)等等。
其實(shí),有用過(guò)C語(yǔ)言的人,大多都模擬過(guò)。只是當(dāng)時(shí)沒(méi)有明確的概念罷了。
如:
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)建對(duì)象前創(chuàng)建.
this指針?lè)旁跅I?在編譯時(shí)刻已經(jīng)確定.
并且當(dāng)一個(gè)對(duì)象創(chuàng)建后,并且運(yùn)行整個(gè)程序運(yùn)行期間只有一個(gè)this指針.
上一篇:c語(yǔ)言中數(shù)組名a和&a詳細(xì)介紹
欄 目:C語(yǔ)言
下一篇:C++指向類成員函數(shù)的指針詳細(xì)解析
本文標(biāo)題:C++中this指針的用法及介紹
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/4225.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
 - 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
 - 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
 - 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
 - 01-10深入理解C++中常見(jiàn)的關(guān)鍵字含義
 - 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
 - 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
 - 01-10APUE筆記之:進(jìn)程環(huán)境詳解
 - 01-10c++中inline的用法分析
 - 01-10如何尋找數(shù)組中的第二大數(shù)
 


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
 - 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
 - 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
 - 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
 - 5c語(yǔ)言計(jì)算三角形面積代碼
 - 6什么是 WSH(腳本宿主)的詳細(xì)解釋
 - 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
 - 8正則表達(dá)式匹配各種特殊字符
 - 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
 - 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
 
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
 - 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
 - 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
 - 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
 - 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
 - 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
 - 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
 - 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
 - 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
 - 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
 
隨機(jī)閱讀
- 04-02jquery與jsp,用jquery
 - 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
 - 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
 - 01-11Mac OSX 打開(kāi)原生自帶讀寫NTFS功能(圖文
 - 01-10C#中split用法實(shí)例總結(jié)
 - 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
 - 01-10delphi制作wav文件的方法
 - 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
 - 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
 - 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
 


