1. 程式人生 > 其它 >C++封裝 之 物件成員指標

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()