對象指針 對象指針就是指針指向一個對象。
class Coordinate//坐標系上的點{public: int m_iX; int m_iY;};Coordinate *p = new Coordinate;//在堆中實例化在實例化時,p的指針實際指向的是m_iX,在實例化對象時,下列代碼中的注釋部分也是符合語法的。
int main(){ Coordinate *p = new Coordinate;//在堆中實例化 p->m_iX = 10;//(*p).m_iX=10; p->m_iY = 20;//(*p).m_iY=20; delete p; p = NULL; return 0;}對象成員指針 對象成員是指作為一個對象來說成為另一個類的數據成員。那么對象成員指針則是對象的指針作為另一個類的數據成員。 代碼1
class Coordinate//坐標系上的點{public: Coordinate(int x, int y);PRivate: int m_iX; int m_iY;};class Line//坐標系上的線{public: Line(); ~Line();private: Coordinate *m_pCoorA; Coordinate *m_pCoorB;};在構造函數時,可以初始化列表構造,也可以普通構造,因為是指針,所以可以置位NULL 代碼2
Line::Line() :m_pCoorA(NULL), m_pCoorB(NULL)//初始化列表初始{}Line::Line()//普通初始化{ m_pCoorA=NULL; m_pCoorB=NULL;}當然更多是賦予指針值 代碼3
Line::Line()//普通初始化{ m_pCoorA=new Coordinate(1,3); m_pCoorB=new Coordinate(5,6);}Line::~Line(){ delete m_pCoorA; delete m_pCoorB;}當然對于對象成員和對象成員指針,他們還有另外一個最大的不同 用對于對象成員來說,如果我們使用sizeof(line)這個對象的話,他就應該是里面所有對象的體積的總和應該是16,而對象成員指針則不同,在代碼1中我們寫了兩個指針作為對象成員,在32位上,每個指針占4位,兩個指針則占8個。下面我們來看一看內存中的對象成員指針。 當示例化line時,里面的兩個對象成員指針也會生成出來,都是指針類型的,所以每個都會占4個內存單元,如果我們在構造函數當中通過new這樣的運算符從堆中申請內存,實例化兩個Coordinate這樣的對象的話呢,這兩個Coordinate對象都是在堆中的,而不再line這個對象當中,所以剛才我們使用sizeof的時候也只能得到8
當我們銷毀line這個對象的時候呢,我們也應該先釋放掉堆中的內存,然后再釋放掉line這個對象。
this指針 一般來說類函數的傳遞參數和成員不重名,如下所示
class Array{public: Array(int _len){ len = _len; } int getLen(){ return len; } void setLen(int _len){ len = _len; }private: int len;};那么如果重名的話會發生什么?如下代碼,編譯器會報錯,因為無法分辨哪個是作為參數的Len
class Array{public: Array(int len){ len = len; } int getLen(){ return len; } void setLen(int len){ len = len; }private: int len;};因此我們需要一種技術來標注出參數或者標記出數據成員。這就是this指針。
新聞熱點
疑難解答
圖片精選