所谓对象成员指针就是让一个类的对象的指针作为另外一个类的成员变量,对象成员就是让一个类的对象成为另一个类的成员变量。下面以代码举例说明:
公用坐标类:
class Coordinate
{
public:
Coordinate(int x,int y);
private:
int m_iX;
int m_iY;
}
(1)对象成员代码如下:
class Line
{
public:
Line();
~Line();
private:
Coordinate m_coorA;
Coordinate m_coorB;
};
(2)对象成员指针代码如下:
class Line
{
public:
Line();
~Line();
private:
Coordinate *m_pCoorA;
Coordinate *m_pCoorB;
}
初始化有两种方式:1)Line::Line():m_pCoorA(NULL), m_pCoorB(NULL)
2)Line::Line()
{
m_pCoorA = NULL;
m_pCoorB = NULL;
}
经常使用如下的方式进行初始化和销毁
Line::Line()
{
m_pCoorA = new Coordinate(1, 3);//只有初始化指向确定的对象才有意义
m_pCoorB = new Coordinate(5, 6);
}
Line::~Line()
{
delete m_pCoorA;
delete m_pCoorB;
}
(3)对象成员和对象成员指针的区别:
int main()
{
Line line();
cout<<sizeof(line)<<endl;
return 0;
}
在32位编译器中:
如果是对象成员的话,sizeof()得到的应该是line里面的所有对象的内存体积总和,8+8 = 16;
如果是对象成员指针的话,sizeof()得到的只是两个指针的大小总和:4+4 = 8;
原因如下所示,指针所指向的对象并不在Line这个对象的内存单元当中,而在堆内存当中,当销毁的时候,也应该先释放堆中内存,再释放Line对象本身的内存。
注:
指针占用的内存空间大小与指针指向的内容和内容的大小无关。
在不同的操作系统及编译环境中,指针类型占用的字节数是不同的。一般而言,
编译生成16位的代码时,指针占2个字节
编译生成32位的代码时,指针占4个字节
编译生成64位的代码时,指针占8个字节
对于某一个具体的环境,可以用下面的语句精确的知道指针类型占用的字节数:
printf("%d\n", sizeof(int *));
另外,int型占用4字节。