1、對象指針的一般概念
對象指針:指向類的成員的指針。在C++中,可以說明指向類的資料成員和成員函數的指針。
對象指針遵循一般變量指針的各種規則:類名 *對象指針名;
對象指針名à成員名;
對象指針在使用之前,也一定要先進行初始化,讓它指向一個已經聲明過的對象,然後再使用。通過對象指針,可以通路到所指向對象的公有成員。
2.指向對像的指針
在建立對像時,編譯系統會為每一個對像配置設定一定的存儲空間,以存放其成員,對像空間的起始位址就是
對像的指針。可以定義一個指針變量,用來存和對像的指針。如果有一個類:
在此有以下語句:
這樣,pt 就是指向Time類對象的指針變量,它指向對象t1。
定義指向類對象的指針變量的一般形式為:
類名 *對象指針名;
可以通過對象指針通路對象和對象的成員。如:
3.指向對象成員的指針
a.指向對象資料成員的指針
定義指向對象資料成員的指針的方法與定主指向變通的指針變量的方法相同。如:
int *p;
定義指向對象資料成員的指針變量的一般形式為:
資料類型名 *指針變量名;
b.指向對象成員函數的指針
定義指向對象成員函數的指針變量的方法和定義指向變通函數的指針變量方法有所不同。
定義指向變通函數的指針變量的方法:
資料類型名 (*指針變量名)();如:
void (*p)();//p是指向void型函的指針變量
定義指向成員函的指針:
資料類型名 (類名::*指針變量名)();
使指針變量指向一個公用成員函數的一般形式為
指針變量名=&類名::成員函數名;
示例:
4、指向類的非靜态成員的指針(非指向對象,而是指向對象成員)
指向對象成員的指針使用前也要先聲明,再指派,然後引用,是以首先要聲明指向該對象所在類的成員的指針。注意,通過指向成員的指針也隻能通路到公有成員。
文法形式:類型說明符 類名::*指針名; //聲明指向公有資料成員的指針
類型說明符 (類名::*指針名)(參數表);//聲明指向公有函數成員的指針
對資料成員指針指派:
指針名 = &類名::資料成員;
此時還不能通過指針通路變量。類的聲明隻确定了各個資料成員的類型、所占記憶體大小以及它們的相對位置,在聲明時并不為資料成員配置設定具體的位址。是以經上述指派之後,隻是說明了被指派的成員指針式專門用于指向哪個資料成員的,同時在指針中存放該資料成員在類中的相對位置,當然通過這樣的指針現在并不能通路什麼。
由于類是通過對象而執行個體化的,在聲明類的對象時才會為具體的對象配置設定記憶體空間,這時隻要将對象在記憶體中的起始位址與成員指針中存放的相對偏移結合起來就可以通路到對象的資料成員了。
文法形式:對象名.*類成員指針名
或 對象指針名à*類成員指針名
成員函數指針指派:
指針名 = 類名::函數成員名;
經過上述對成員函數指針指派之後,還不能用指針直接調用成員函數,而是需要首先聲明類的對象,因為必須要通過對象來調用非靜态成員函數。
利用指針調用成員函數:
(對象名.*類成員指針名)(參數表)
或 (對象指針名à*類成員指針名)(參數表)
5、指向類的靜态成員的指針
類的靜态成員可以用普通的指針來指向和通路。/**形式上把靜态成員看成普通變量就可以**/
對象指針:在C++中,可以說明指向類的資料成員和成員函數的指針。
1. 對象指針作函數的參數
使用對象指針作為函數參數要經使用對象作函數參數更普遍一些。因為使用對象指針作函數參數有如下兩點好處:
(1) 實作傳址調用。可在被調用函數中改變調用函數的參數對象的值,實作函數之間的資訊傳遞。
(2) 使用對象指針實參僅将對象的位址值傳給形參,而不進行副本的拷貝,這樣可以提高運作效率,減少時空開銷。
當形參是指向對象指針時,調用函數的對應實參應該是某個對象的位址值,一般使用&後加對象名。下面舉一例子說明對象指針作函數參數。
從輸出結果可以看出,當在被調用函數fun中,改變了對象的資料成員值[m1.setxy(12, 15)]和指向對象指針的資料成員值[m2->setxy(22, 25)]以後,可以看到隻有指向對象指針作參數所指向的對象被改變了,而另一個對象作參數,形參對象值改變了,可實參對象值并沒有改變。是以輸出上述結果。
2. 對象引用作函數參數
在實際中,使用對象引用作函數參數要比使用對象指針作函數更普遍,這是因為使用對象引用作函數參數具有用對象指針作函數參數的優點,而用對象引用作函數參數将更簡單,更直接。是以,在C++程式設計中,人們喜歡用對象引用作函數參數。現舉一例子說明對象引用作函數參數的格式。
該例子與上面的例子輸出相同的結果,隻是調用時的參數不一樣。
3.this指針
this指針是一個隐含于每一個類的成員函數中的特殊指針,它用于指向正在被成員函數操作的對象。實際過程是,當通過一個對象調用成員函數時,系統先将該對象的位址賦給this指針,然後調用成員函數,成員函數對對象的資料成員進行操作時,就隐含使用了this指針。/**難怪:在成員函數之外無法通路資料成員,找不到對象呀!(當然中間的private,protected另作談論**/
當對一個對象調用成員函數時,編譯程式先将對象的位址賦給this指針,然後調用成員函數,每次成員函數存取資料成員時,由隐含作用this指針。而通常不去顯式地使用this指針來引用資料成員。同樣也可以使用*this來辨別調用該成員函數的對象。下面舉一例子說明this指針的應用。