您的位置:首页 > 编程语言 > C语言/C++

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

2017-03-03 17:36 441 查看
对象指针

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

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指针。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 指针