-------------------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个对象成员(分别各有2个int) cout << sizeof(Line) << endl;
system("pause"); return 0; } |
运行一览:
【made by siwuxie095】