天天看點

4-數組、指針與字元串1.3-this指針

this指針時一個隐含于每一個類的成員函數中的特殊指針(包括構造函數和析構函數),它用于指向正在被成員函數操作的對象。

this指針明确地指出了成員函數目前所操作的資料所屬的對象。實際過程是,當通過一個對象調用成員函數時,系統先将該對象的位址賦給this指針,然後調用成員函數,成員函數對對象的資料成員進行操作時,就隐含使用了this指針。

this是一個指針變量,是以在成員函數中,可以使用*this來辨別正在調用該函數的對象。

1、指向類的非靜态成員的指針

指向對象成員的指針使用前也要先聲明,再指派,然後引用。注意,通過指向成員的指針也隻能通路到共有成員。聲明指針的語句形式為:

類型說明符 類名:: *指針名;//聲明指向公有資料成員的指針

類型說明符 (類名::*指針名)(參數表);//聲明指向公有函數成員的指針

聲明了指向成員的指針之後,需要對其進行指派,也就是要确定指向類的哪一個成員。對資料成員指針指派的一般文法形式為:

指針名=&類名::資料成員名;

類的定義隻确定了各個資料成員的類型、所占記憶體大小以及他們的相對位置,在定義時并不為資料成員配置設定具體的位址。是以上述指派之後,隻是說明了被指派的指針時專門用于指向哪個資料成員的,同時在指針中存放該資料成員在類中的相對位置,當然通過這樣的指針現在并不能通路什麼。

由于類是通過對象而執行個體化的,在聲明類的對象時才會為具體的對象配置設定記憶體空間,這時隻要将對象在記憶體中的起始位址與成員指針中存放的相對偏移結合起來就可以通路到對象的資料成員了。通路資料成員時,這種結合可通過以下兩種文法形式實作:

對象名. *類成員指針名

或對象指針名->*類成員指針名

成員函數指針在聲明之後要用以下形式的語句對其指派:

指針名=&類名::函數成員名;

c++标準規定不能将非靜态成員函數名直接指派給成員指針,必須要進行“&”運算。

類的成員函數雖然并不在每個對象中複制一個份拷貝,但是文法規定必須要通過對象來調用非靜态成員函數,是以經過上述對成員函數指針指派以後,還不能用指針直接調用成員函數,而是需要首先聲明類的對象,然後用以下形式的語句利用指責你調用成員函數:

(對象名.*類成員指針名)(參數表)

或:(對象指針名->*類成員指針名)(參數表)

注意:成員函數指針的聲明、指派和使用過程中的傳回值類型、函數參數表一定要互相比對。

 如,

int main()

{

  Point A(4,5);//聲明對象A

  Point *p1=&A;//聲明對象指針并初始化

  int (Point::*p_GetX)()=&Point::GetX;//聲明成員函數指針并初始化

  cout<<(A.*p_GetX)()<<endl;//使用成員函數指針通路成員函數

  cout<<(p1->GetX)()<<endl;//使用對象指針通路成員函數

  cout<<A.GetX()<<endl;//使用對象名通路成員函數

}

注意分析對象指針及成員指針的不同用法。

2、指向類的靜态成員的指針