对象成员指针

来源:互联网 发布:服务器定时开关机软件 编辑:程序博客网 时间:2024/06/05 09:20

-------------------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】

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 鱼刺长在喉咙里怎么办 吃到鱼刺卡喉咙怎么办 带鱼刺扎进喉咙怎么办 喉咙被鱼刺卡了怎么办 喉咙里卡了鱼刺怎么办 卡了鱼刺在喉咙怎么办 日剧 哥哥太爱我怎么办 被竹叶青蛇咬了怎么办 被眼镜王蛇咬了怎么办 被黄蜂蛰了怎么办消肿 被黑色黄蜂蜇了怎么办 手指被黄蜂蛰了怎么办 被马蜂蛰了肿了怎么办 给青竹蛇咬了怎么办 被青竹蛇咬了怎么办 孕早期吃了桂皮怎么办? 怀孕后吃了八角怎么办 孕妇吃了点八角怎么办 煮粥老是溢出来怎么办 6个月的小孩咳嗽怎么办 10个月婴儿咳嗽怎么办 6个月婴儿感冒了怎么办 六个月宝宝有痰怎么办 9月婴儿牛奶过敏怎么办 一用粉底就过敏怎么办 7个月婴儿过敏怎么办 9个月宝宝腹泻怎么办 9个月宝宝拉肚子怎么办 5个月宝宝拉肚子怎么办 九个月大宝宝拉肚子怎么办 九个半月的宝宝拉肚子怎么办 9个月婴儿拉稀怎么办 九个月的宝宝拉肚子怎么办 9个月宝宝拉稀水怎么办 2岁宝宝腹泻拉水怎么办 18个月宝宝拉水怎么办 2个月宝宝拉稀水怎么办 2个月的宝宝腹泻怎么办 2个月的宝宝拉稀怎么办 宝宝不喝补液盐怎么办 4个月宝宝腹泻怎么办