对象成员指针
来源:互联网 发布:服务器定时开关机软件 编辑:程序博客网 时间: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个对象成员(分别各有2个int)
cout <<sizeof(Line) << endl;
system("pause");
return0;
}
运行一览:
【made by siwuxie095】
- C++ 对象成员指针
- 对象成员指针
- C++对象指针、对象成员和对象成员指针
- 指向对象成员的指针
- 指向对象成员的指针
- 指针、内存与对象的指针成员
- C++对象指针—指向对象成员的指针
- 对象指针—指向对象成员的指针
- 从成员对象指针获取父对象指针
- <C++略识>之对象指针与对象成员指针
- 使用对象指针访问类的成员
- 指向对象的指针访问成员函数
- c++指针对象调用成员函数
- C++:指向对象成员函数的指针
- C++学习之对象成员指针篇
- c++封装之对象成员指针
- 指向对象成员变量的指针
- c++指向对象成员函数的指针
- I
- Android内核开发:系统分区与镜像文件的烧写
- LeetCode 345. Reverse Vowels of a String 对撞指针
- 【数据结构-链表】杂记
- 年轻互联网人的焦虑
- 对象成员指针
- linux cmake 安装mysql5.5.11,以及更高版本
- 苹果审核IPv6被拒,阿里云服务器配置
- python的json.dumps输出中文
- Java NIO Channel与Buffer的概述
- Python习题
- 小白五一期间个人建站
- eclipse中 properties文件编码问题
- css三种引入方式的优先级