1. 程式人生 > >C++——指針4

C++——指針4

amp 相對 erl 系統 style 方式 類名 類的構造函數 line

8、對象指針 聲明: 類名 *對象指針名

Point A(5,10);

Point *ptr;

ptr=&A;//通過指針訪問對象成員:對象指針名->成員名。ptr->getX();相當於(*ptr).getX;

曾經錯誤的前向引用的例子

class Fred; //前向引用聲明

class Barney { Fred x; //錯誤:類Fred的聲明尚不完善,若改成Fred *x;就正確了。 };//因為沒有聲明fred類的對象,編譯器不知道如何分配內存,所以出錯,如果//改成指針類型的對象,相當於unsigned long類型,編譯器可以明確處理。

class Fred { Barney y;

};

This指針 隱含於每一個類的成員函數中的特殊指針,存放當前對象的地址,通過對象名調用成員函數,系統先將該對象的地址賦給this指針,然後調用成員函數,成員函數對對象的數據進行操作時,就隱含使用了this指針。如:point類的構造函數中語句 X=xx;相當於this->X=xx;

8.1 指向類的非靜態成員的指針 通過指向成員的指針只能訪問公有成員,聲明:指向公有數據成員的指針 類型說明符 類名::*指針名; 指向公有函數成員的指針 類型說明符 (類名::*指針名)(參數表);僅僅這樣聲明之後並不能直接使用,必須指明指針指向那個成員,需要賦給指針地址(初始化)。指針名

=&類名::數據成員名;該處只是賦給指針一個相對地址,因為一個數據成員名並沒有一個確切的地址,因此還需要落實到對象名(起始地址),結合相對地址(偏移量)才能真正訪問到數據成員:

對象名.*類成員指針名; 對象指針名->*類成員指針名

6-13 訪問對象的公有成員函數的不同方式

int main() //主函數

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

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

//聲明成員函數指針並初始化

int (Point:::*p_GetX)()=Point::GetX;

//1)使用成員函數指針訪問成員函數

cout<<(A.*p_GetX)()<<endl;

//2)使用對象指針訪問成員函數

cout<<(p1->GetX)()<<endl;

//3)使用對象名訪問成員函數

cout<<A.GetX()<<endl; }

C++——指針4