C++封裝 之 成員物件
阿新 • • 發佈:2021-08-25
成員物件
一個類的資料成員是另一個類的物件,就叫做成員物件。
思考:
- 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)
說明:
-
呼叫順序:
- 初始化時,先例項化Coordinate物件,再例項化Line物件
- 銷燬時,先銷燬Line物件,後銷燬Coordinate物件
-
由於使用的時預設建構函式,所以例項化了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物件之後,自動初始化了兩個點