C++封装 之 对象成员指针
对象成员指针
概念:
- 对象成员是指一个类的对象是另一个类的数据成员。
- 对象成员指针是指,指向一个类的对象的指针作为另一个类的数据成员(强调:只是一个指针,而不是一个对象)
实例:坐标类和线段类
/***************** 定义 Coordinate 类 *****************/
class Coordinate{
public:
Coordinate();
~Coordinate();
private:
int m_iX;
int m_iY;
};
/***************** 定义 Line 类 *****************/
class Line{
public:
Line(); //默认构造函数
~Line();
private:
Coordinate m_CoorA; //对象成员
Coordinate m_CoorB; //对象成员
};
将Line类中的对象成员更改为对象成员指针。注意:对象成员指针只是一个指向Coordinate对象的指针,而不是一个Coordinate对象
/***************** 定义 Line 类 *****************/
class Line{
public:
Line(); //默认构造函数
~Line();
private:
Coordinate *m_pCoorA; //对象成指针
Coordinate *m_pCoorB; //对象成员指针
};
demo.cpp源码
/******************************************************
* 对象成员指针
* 要求:
* 定义两个类:
* 坐标类:Coordinate
* 数据成员:构造函数、析构函数、数据封装函数
* 线段类:Line
* 数据成员:点A指针m_pCoorA、点B指针m_pCoorB
* 成员函数:构造函数、析构函数、信息打印函数
*
******************************************************/
#include<iostream>
using namespace std;
/***************** 定义 Coordinate 类 *****************/
class Coordinate{
public:
Coordinate(int x, int y); //有参数的构造函数
~Coordinate();
int getX();
int getY();
private:
int m_iX;
int m_iY;
};
/***************** 定义 Line 类 *****************/
class Line{
public:
Line(int x1, int y1, int x2, int y2); //默认构造函数
~Line();
void printInfo();
private:
Coordinate *m_pCoorA; // 对象成员指针 (只是一个指向Coordinate对象的指针,而不是一个Coordinate对象,所以访问数据成员时需注意)
Coordinate *m_pCoorB; // 对象成员指针
};
/********************** Coordinate类的函数 ***************************/
Coordinate::Coordinate(int x, int y){ //构造函数
m_iX = x;
m_iY = y;
cout << "Coordinate():(" <<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类的函数 ***************************/
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(){ //打印两个点的坐标,由于m_pCoorA是指针,而不是对象,所以访问数据成员用"->",而不是"."
cout << "A = ("<< m_pCoorA->getX() << "," << m_pCoorA->getY() << ")" << endl;
cout << "B = ("<< m_pCoorB->getX() << "," << m_pCoorB->getY() << ")" << endl;
}
/************************** 测试主函数 *******************************/
int main(){
Line *p = new Line(5,6,7,8); // 声明Line类型的指针
p->printInfo(); //打印
cout<<"sizeof(p) = "<<sizeof(p)<<endl; //一个指针的大小
cout<<"sizeof(Line) = "<<sizeof(Line)<<endl<<endl;//Line对象的大小(占两个指针)
delete p; // 销毁Line对象
p = NULL; //置空指针
system("pause");
return 0;
}
运行结果:
Coordinate():(5 , 6)
Coordinate():(7 , 8)
Line()
A = (5,6)
B = (7,8)
sizeof(p) = 4
sizeof(Line) = 8
~Coordinate():(5 , 6)
~Coordinate():(7 , 8)
~Line()