Fork me on GitHub

对象成员指针

-------------------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");

return 0;

}

   

   

运行一览:

   

   

   

   

   

   

   

   

   

   

   

【made by siwuxie095】

posted on 2017-05-02 15:27  siwuxie095  阅读(385)  评论(0编辑  收藏  举报

导航