張永超
摘要: this指針是由系統(tǒng)自動(dòng)生成的,隱含于每一個(gè)類的成員函數(shù)中的特殊指針,該指針指向正在對(duì)某個(gè)成員函數(shù)操作的對(duì)象。該文通過(guò)實(shí)例及其匯編代碼詳細(xì)地分析了this指針的特點(diǎn)和它的使用方法,從而進(jìn)一步的理解C++中的對(duì)象和其在內(nèi)存中的分配情況。
關(guān)鍵詞:this指針;對(duì)象;成員函數(shù)
中圖分類號(hào):TP313 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)20-4738-02
The Research of Implicit This Pointer in C++
ZHANG Yong-chao
(Dept.of Computer,Jilin institute of Chemical Technology,Jilin 132022,China)
Abstract: this pointer is a special pointer that hidden in every class member function automatically generated by system. It points to the object of operating to a member function.the article analyses characteristics of this pointer and its application method by instances and their assembly code, so as to understanding of objects in C++ and its distribution in memory.
Key words:this pointer;object; member function
1 this指針的引入
類是對(duì)一組具有相同或者相似性質(zhì)對(duì)象的抽象描述,類的本質(zhì)是定義了一種對(duì)象類型,它完整的描述了該類型的所有對(duì)象的屬性和服務(wù)。C++語(yǔ)言中,一般把屬性稱為數(shù)據(jù),服務(wù)稱為函數(shù)。從程序設(shè)計(jì)語(yǔ)言的角度講,類好比是一種程序員自己定義的數(shù)據(jù)類型,類可以用來(lái)聲明對(duì)象,一個(gè)對(duì)象是一個(gè)類的實(shí)例,類只是邏輯上的抽象,它并不能在物理上存在,只有創(chuàng)建了類的對(duì)象之后,在內(nèi)存中才有一個(gè)類的物理表示。當(dāng)定義了一個(gè)類的若干對(duì)象后,每個(gè)對(duì)象都有屬于自己的數(shù)據(jù)成員,但成員函數(shù)代碼卻合用一份。成員函數(shù)如何辨別數(shù)據(jù)成員是哪個(gè)對(duì)象的呢?例如,我們定義一個(gè)三角形類Triangle,再分別定義2個(gè)Triangle類的對(duì)象t1,t2。假如有t1. area(),應(yīng)該使用對(duì)象t1中的bottom和height,計(jì)算出三角形t1的面積,假如有t2. area(),需要利用對(duì)象t2中的bottom和height,算出三角形t2的面積,問(wèn)題是對(duì)象t1和t2調(diào)用同一個(gè)函數(shù)area()時(shí),編譯系統(tǒng)如何做到分別使用t1或t2對(duì)象中的bottom和height計(jì)算出各自的面積呢?答案就是在C++的類的成員函數(shù)中隱式包含著一個(gè)指向當(dāng)前對(duì)象的指針,這個(gè)指針被稱為this指針。
2 this指針的應(yīng)用
this指針是指向本類對(duì)象的指針,它的值是當(dāng)前正在調(diào)用成員函數(shù)的對(duì)象的起始地址。例如,在執(zhí)行t1. area();語(yǔ)句時(shí),編譯系統(tǒng)就把第一個(gè)三角形對(duì)象t1的起始地址傳給this指針,這樣,在計(jì)算面積的成員函數(shù)area()引用數(shù)據(jù)成員時(shí),就會(huì)取this指向的對(duì)象t1中的數(shù)據(jù)。area()通過(guò)1/2*(bottom*height)計(jì)算t1的面積時(shí),其實(shí)是執(zhí)行語(yǔ)句:1/2*(this→ bottom)*(this→ height),而此刻this指向的是第一個(gè)三角形t1,因此也可以理解為:1/2*(t1. bottom)*(t1.height),所以計(jì)算的面積為三角形t1的面積。同樣如果有t2. area(),當(dāng)前對(duì)象就換成了t2,編譯器就把第二個(gè)三角形對(duì)象t2的地址賦給this指針,從而計(jì)算出t2的面積??梢?jiàn),this指針是作為隱含的參數(shù)被傳遞給類的成員函數(shù)的。程序中成員函數(shù)area()的定義為:float Triangle::area(){return 1/2*(bottom*height);}C++把它處理為float Triangle::area (Triangle *this){return 1/2*(this→ bottom)*(this→ height);} 在Triangle類的成員函數(shù)area()的形參表列中隱含著一個(gè)this指針,當(dāng)this=&t1,area被調(diào)用時(shí),編譯器先將對(duì)象t1的地址傳給形參this指針,再根據(jù)this當(dāng)前所指的對(duì)象去引用該對(duì)象中的數(shù)據(jù)成員。下面我通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)對(duì)this指針作進(jìn)一步地分析:
class A
{public:
A(int a,int b)
{ x=a;//等價(jià)于this→x=a;
y=b;//等價(jià)于this→y=b
cout<<"Construct is called.this="<
電腦知識(shí)與技術(shù)2014年20期