我們在定義類的時候,里面會包含各種類型的數(shù)據(jù)成員,比如整型、字符串類型、雙精度實數(shù)型……但是,比如我們要定義一個汽車的類,那么里面必定會包含很多的零件,然而每個零件并不能簡單地被定義為某個類型的數(shù)據(jù)。所以,在除上述類型的數(shù)據(jù)成員之外,我們還需要引進一種特殊的數(shù)據(jù)成員,這種數(shù)據(jù)成員,本身就是一個對象,我們稱之為“對象成員”。
比如,我們定義一個坐標(biāo)的類Coordinate,里面有數(shù)據(jù)成員m_iX,m_iY,分別表示點的橫坐標(biāo)和縱坐標(biāo),然后我們又定義了一個線段的類Line,數(shù)據(jù)成員包括兩個坐標(biāo)類對象m_coorA和m_coorB,分別表示A點和B點的坐標(biāo)。
接下來來看代碼示例。
定義坐標(biāo)類:
#pragma once
#include <iostream>
using namespace std;
class Coordinate
{
public:
Coordinate(int x, int y);
~Coordinate();
void setX(int x);
int getX();
void setY(int y);
int getY();
private:
int m_iX;
int m_iY;
};
定義 線段類:
#pragma once
#include <iostream>
#include "Coordinate.h"
using namespace std;
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;//起點,坐標(biāo)類型
Coordinate m_coorB;//終點,坐標(biāo)類型
};
Coordinate類的成員函數(shù)的類外定義:
#include <iostream>
#include "Coordinate.h"
using namespace std;
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;
}
int Coordinate::getX()
{
return m_iX;
}
void Coordinate::setY(int y)
{
m_iY = y;
}
int Coordinate::getY()
{
return m_iY;
}
Line類成員函數(shù)的類外定義:
#include <iostream>
#include "Line.h"
#include "Coordinate.h"
using namespace std;
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 << "(" << m_coorA.getX() << "," << m_coorA.getY() << ")" << endl;
cout << "(" << m_coorB.getX() << "," << m_coorB.getY() << ")" << endl;
}
主函數(shù):
#include <iostream>
#include "Coordinate.h"
#include "Line.h"
using namespace std;
int main(void)
{
Line* p = new Line(1, 2, 3, 4);
p->printInfo();
delete p;
p = NULL;
system("PAUSE");
return EXIT_SUCCESS;
}
在上面這一段代碼中,我們?yōu)榱搜芯緾oordinate類的對象和Line類的對象調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序,在它們的構(gòu)造函數(shù)和析構(gòu)函數(shù)下加入了打印函數(shù)名的代碼。接下來看一下上面這個程序的運行結(jié)果:

我們可以看到,系統(tǒng)首先調(diào)用了Coordinate類對象的構(gòu)造函數(shù),而后調(diào)用了Line類對象的構(gòu)造函數(shù);在對象銷毀時,又先調(diào)用了Line類對象的析構(gòu)函數(shù),再調(diào)用Coordinate類對象的析構(gòu)函數(shù);如果有兩個或多個對象成員,那么對對象成員的初始化按照初始化列表中的順序進行,每初始化一個對象成員就調(diào)用一次構(gòu)造函數(shù),對象銷毀時也遵循“后初始化的先調(diào)用析構(gòu)函數(shù)”的原則。這就好比我們要組裝一輛汽車,肯定是要先將里面的零部件先各自組裝起來,然后再把各個零件組裝成一輛車;如果要拆掉它,則先要把整個汽車拆成一個一個零件,然后再把每個小零件拆開。在每個零件上,也遵循“后組裝的先拆開”的原則。
值得一提的是,如果一個類中包含了對象成員,那么對對象成員的初始化必須使用構(gòu)造函數(shù)初始化列表。