C++之指针(对象指针+对象成员指针+this指针[待补充])

来源:互联网 发布:网络暴力的现状 编辑:程序博客网 时间:2024/05/29 19:11

对象指针
对象指针就是指针指向一个对象。

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指针。

0 0
原创粉丝点击