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()
posted @ 2021-08-25 12:06  赶紧学习  阅读(202)  评论(0编辑  收藏  举报