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

C++封裝 之 成員物件

成員物件

一個類的資料成員是另一個類的物件,就叫做成員物件。

思考

  • 1:成員物件初始化和銷燬時的呼叫順序?
  • 2:如何用帶有引數的建構函式初始化成員物件?

重要結論:

  • 例項化物件A時,如果物件A有物件成員B,那麼先執行B的建構函式,再事項A的建構函式
  • 如果物件A有物件成員B,那麼銷燬物件A時,先執行A的解構函式,再執行B的解構函式。
  • 如果物件A有物件成員B,物件B沒有預設建構函式,那麼物件A必須在初始化列表中初始化物件B.

例項:


  物件成員
  要求:
       定義兩個類:
       座標類:Coordinate
           資料成員:橫座標m_iX、縱座標m_iY
           成員函式:建構函式、解構函式、資料封裝函式
       線段類:Line
           資料成員:點m_CoorA、點m_CoorB
           成員函式:建構函式、解構函式、資料封裝函式、資訊列印函式


1. 使用預設建構函式

test1.cpp原始碼

#include<iostream>
using namespace std;

/***************** 定義 Coordinate 類 *****************/
class Coordinate{
public:
    Coordinate();   //預設建構函式
    ~Coordinate(); 
    void setX(int x);
    void setY(int y);
    int getX();
    int getY();
private:
    int m_iX;
    int m_iY;
};

/***************** 定義 Line 類 *****************/
class Line{
public:
    Line();   //預設建構函式
    ~Line();
    void setA(int x, int y);
    void setB(int x, int y);
    void printInfo();
private:
    Coordinate m_CoorA;    // 物件成員
    Coordinate m_CoorB;    // 物件成員
};

/********************** Coordinate類的函式 ***************************/
Coordinate::Coordinate(){  //建構函式
    cout << "Coordinate()" <<endl;
}   
Coordinate::~Coordinate(){  //解構函式
    cout << "~Coordinate():(" <<m_iX <<" , "<< m_iY << ")"<<endl;
}
void Coordinate::setX(int x){
    m_iX = x;
}
void Coordinate::setY(int y){
    m_iY = y;
}
int Coordinate::getX(){
    return m_iX;
}
int Coordinate::getY(){
    return m_iY;
}

/********************** Line類的函式 ***************************/
Line::Line(){  //建構函式
    cout << "Line()"<<endl;
}
Line::~Line(){  //建構函式
    cout << "~Line()"<<endl;
}

void Line::setA(int x, int y){
    m_CoorA.setX(x);
    m_CoorA.setY(y);
}
void Line::setB(int x, int y){
    m_CoorB.setX(x);
    m_CoorB.setY(y);
}
void Line::printInfo(){   //列印兩個點的座標
    cout << "A = ("<< m_CoorA.getX() << "," << m_CoorA.getY() << ")" << endl;
    cout << "B = ("<< m_CoorB.getX() << "," << m_CoorB.getY() << ")" << endl;
}

/************************** 測試主函式 *******************************/
int main(){
    
    Line *p = new Line();  // 宣告Line型別的指標 

    p->setA(1,2);      //呼叫Coordinate類的資料封裝函式來例項化點
    p->setB(3,4);
    p->printInfo();    //列印

    delete p;         // 銷燬Line物件 
    p = NULL;         //置空指標
    system("pause");
    return 0;
}

執行結果:

Coordinate()
Coordinate()
Line()
A = (1,2)
B = (3,4)
~Line()
~Coordinate():(3 , 4)
~Coordinate():(1 , 2)

說明:

  1. 呼叫順序:

    • 初始化時,先例項化Coordinate物件,再例項化Line物件
    • 銷燬時,先銷燬Line物件,後銷燬Coordinate物件
  2. 由於使用的時預設建構函式,所以例項化了Line物件之後,還需要呼叫Coordinate類的資料封裝函式來例項化點。

2. 使用有引數的建構函式

  • 前面的例子中使用了預設建構函式(沒有引數),例項化Line物件之後,還需要呼叫Coordinate的資料封裝函式來初始化兩個點
  • 事實上,當例項化一個Line物件時,我們希望同時初始化了兩個點,這就需要使用帶有引數的建構函式
  • 使用初始化列表列表給有引數的建構函式傳參

test2.cpp原始碼

#include<iostream>
using namespace std;
/***************** 定義 Coordinate 類 *****************/
class Coordinate{
public:
    Coordinate(int x, int y);   //有引數的建構函式
    ~Coordinate(); 
    void setX(int x);
    void setY(int y);
    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 setA(int x, int y);
    void setB(int x, int y);
    void printInfo();
private:
    Coordinate m_CoorA;    // 物件成員
    Coordinate m_CoorB;    // 物件成員
};

/********************** 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;
}
void Coordinate::setX(int x){
    m_iX = x;
}
void Coordinate::setY(int y){
    m_iY = y;
} 
int Coordinate::getX(){
    return m_iX;
}
int Coordinate::getY(){
    return m_iY;
}

/********************** Line類的函式 ***************************/
Line::Line(int x1, int y1, int x2, int y2):m_CoorA(x1, y1),m_CoorB(x2, y2){  //用初始化列表給有引數的建構函式傳參
    cout << "Line()"<<endl;
}
Line::~Line(){  //建構函式
    cout << "~Line()"<<endl;
}

void Line::setA(int x, int y){
    m_CoorA.setX(x);
    m_CoorA.setY(y);
}
void Line::setB(int x, int y){
    m_CoorB.setX(x);
    m_CoorB.setY(y);
}
void Line::printInfo(){  //列印兩個點的座標
    cout << "A = ("<< m_CoorA.getX() << "," << m_CoorA.getY() << ")" << endl;
    cout << "B = ("<< m_CoorB.getX() << "," << m_CoorB.getY() << ")" << endl;
}

/************************** 測試主函式 *******************************/
int main(){
    
    Line *p = new Line(1,2,3,4);   // 例項化物件時,直接傳引數 

    p->printInfo();         //列印

    delete p;               // 銷燬Line物件 */
    p = NULL;               //置空指標
    system("pause");
    return 0;
}

執行結果:

Coordinate():(1 , 2)
Coordinate():(3 , 4)
Line()
A = (1,2)
B = (3,4)
~Line()
~Coordinate():(3 , 4)
~Coordinate():(1 , 2)

說明:

  • 將預設建構函式改造成帶引數的建構函式之後,使用初始化列表進行傳參
  • 例項化Line物件之後,自動初始化了兩個點