对象指针
1.对象指针
/******************************************/
要求:
定义Coordinate类
数据成员:m_iX和m_iY
声明对象指针,并通过指针操控对象
计算两个点,横、纵坐标的和
/******************************************/
/*Coordinate.h*/
class Coordinate
{
public:
Coordinate();
~Coordinate();
public:
int m_iX;
int m_iY;
};
/*Coordinate.cpp*/
#include<iostream>
#include"Coordinate.h"
using namespace std;
Coordinate::Coordinate()
{
cout << "Coordinate()" << endl;
}
Coordinate::~Coordinate()
{
cout << "~Coordinate()" << endl;
}
/*demo.cpp*/
#include<iostream>
#include<stdlib.h>
#include"Coordinate.h"
using namespace std;
int main(void)
{
Coordinate *p1 = NULL;
p1 = new Coordinate;
Coordinate *p2 = new Coordinate();
p1->m_iX = 10;
p1->m_iY = 20;
(*p2).m_iX = 30;
(*p2).m_iY = 40;
cout << p1->m_iX + (*p2).m_iX << endl;
cout << p1->m_iY + (*p2).m_iY << endl;
delete p1;
p1 = NULL;
delete p2;
p2 = NULL;
system("pause");
return 0;
}
运行结果:
2.对象成员指针
例子如下:画一条线段(端点坐标为A和B)
/************************************************************/
要求:
定义两个类:
坐标类:Coordinate
数据成员:横坐标m_iX,纵坐标m_iY
成员函数:构造函数、析构函数、数据封装函数
线段类:Line
数据成员:点A指针 m_coorA,点B指针 m_coorB
成员函数:构造函数、析构函数、数据封装函数、信息打印函数
/************************************************************/
与上述对象成员的不同之处就是Line成员里用到了指针
#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;
};
#include<iostream>
#include"Line.h"
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;
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;
}
/*demo.cpp*/
#include<iostream>
#include<stdlib.h>
#include"Line.h"
using namespace std;
int main(void)
{
Line *p = new Line(1,2,3,4);
p->printInfo();
delete p;
p = NULL;
cout << "(32位机)指针的大小:"<<sizeof(p) << endl;
cout << "Line的大小:"<<sizeof(Line) << endl;
system("pause");
return 0;
}
运行代码:
三个注意的地方:
1.与前面那个例子不同的地方,前面那个例子没有用到指针,所以是通过栈申请内存的,内存释放是系统自动完成的,而且释放过程与对象创建过程正好相反;而这个例子用到了指针,是从堆中分配内存的,内存释放需要手动完成,所以析构函数的执行顺序与你delete指针的顺序一致。
2.sizeof(p)为什么是4,因为在32位机中所有的指针都占4字节。
3.sizeof(Line)为什么是8,因为Line中包含两个点指针,每一个点指针是4,所以总大小是8字节。