首页 > 编程 > C++ > 正文

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

2019-11-06 08:05:15
字体:
来源:转载
供稿:网友

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

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++实现

下一篇:函数重载 c++

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选