-------------------siwuxie095

  

  

  

  

  

  

  

  

  

  

对象成员指针

  

  

对象成员指针,即对象的指针作为另外一个类的数据成员

  

  

看如下实例:

  

定义一个坐标类:Coordinate,有数据成员:m_iX 和 m_iY

  

对象成员指针

  

  

再定义一个线段类:Line,如果使用 对象成员 作 数据成员:

  

对象成员指针

  

  

  

如果使用 对象成员指针 作 数据成员,即:*m_pCoorA 和 *m_pCoorB

  

对象成员指针

  

  

  

初始化时,可以使用初始化列表来初始化:

  

对象成员指针

  

  

  

也可以使用普通的初始化:

  

对象成员指针

  

  

  

  

但更多的是这种情况:

  

因为是两个指针,指针一定要指向某一个对象才能进行操作,才会有意义,

这里指向的就是两个坐标对象,相当于是在构造函数中从堆中分配了内存,

同时需要在析构函数中将内存释放掉,保证内存不被泄露

  

对象成员指针

  

  

  

 

对象成员和对象成员指针的不同:

  

作为对象成员来说,如果使用sizeof(line) 判断 line 的大小,就应该是

里面所有对象的大小的总和:16

  

而对象成员指针则不同,如果使用sizeof(line) 判断 line 的大小,仅仅

是两个指针的大小的总和:8

  

对象成员指针

  

  

  

  

  

内存中的对象成员指针:

  

当实例化Line 对象时,两个指针就会被定义出来,各占 4 个

基本内存单元,如果在构造函数中通过new 运算符从堆中申

请内存,实例化两个 Coordinate 对象,这两个对象都是在堆

中,不在Line 对象中,所以刚才 sizeof(line) 时只能得到 8

  

当销毁 Line 对象时,也应该先释放掉堆中的内存,再释放掉

Line 对象本身

  

对象成员指针

  

  

  

  

  

  

  

程序:

  

Coordinate.h:

  

class Coordinate

{

public:

Coordinate(int x,int y);

~Coordinate();

int getX();

int getY();

private:

int m_iX;

int m_iY;

};

  

  

  

Coordinate.cpp:

  

#include"Coordinate.h"

#include <iostream>

using namespace std;

  

  

Coordinate::Coordinate(int x,int y)

{

m_iX = x;

m_iY = y;

cout << "Coordinate(int x,int y) " << m_iX << "," << m_iY << endl;

}

  

Coordinate::~Coordinate()

{

cout << "~Coordinate() " << m_iX << "," << m_iY << endl;

}

  

int Coordinate::getX()

{

return m_iX;

}

  

int Coordinate::getY()

{

return m_iY;

}

  

  

  

Line.h:

  

#include"Coordinate.h"

  

class Line

{

public:

Line(int x1, int y1, int x2, int y2);

~Line();

void printInfo();

private:

Coordinate *m_pCoorA;

Coordinate *m_pCoorB;

};

  

  

  

Line.cpp:

  

#include"Line.h"

#include <iostream>

using namespace std;

  

  

Line::Line(int x1, int y1, int x2, int y2)

{

m_pCoorA = new Coordinate(x1,y1);//从堆中申请内存来实例化

m_pCoorB = new Coordinate(x2, y2);

cout << "Line()" << endl;

}

  

Line::~Line()

{

delete m_pCoorA;

m_pCoorA = NULL;//将指针置于安全状态 NULL

delete m_pCoorB;

m_pCoorB = NULL;

cout << "~Line()" << endl;

}

  

void Line::printInfo()

{

cout << "printInfo()" << endl;

cout << "(" <<m_pCoorA->getX() << "," <<m_pCoorA->getY() << ")" << endl;

cout << "(" <<m_pCoorB->getX() << "," << m_pCoorB->getY() << ")" << endl;

}

  

  

  

main.cpp:

  

#include <stdlib.h>

#include"Line.h"

#include <iostream>

using namespace std;

  

//注意:是在32位编译环境下

int main(void)

{

Line *p = new Line(1, 2, 3, 4);

p->printInfo();

delete p;

p = NULL;

//指针p的大小是4个字节

cout << sizeof(p) << endl;

  

//Line类的对象是8个字节因为对象包含了2个对象成员指针

//new出来的是在堆中所以不归Line类)

//

//如果这里的Line类包含的是Coordinate类的对象成员

//而不是对象成员指针那么这时就是16个字节

//因为Line的对象包含了里面所有数据成员2个对象成员(分别各有2int

cout << sizeof(Line) << endl;

 

system("pause");

return0;

}

  

  

运行一览:

  

对象成员指针

  

  

  

  

  

  

  

  

  

  

【made by siwuxie095】

相关文章: