對象成員

我們在定義類的時候,里面會包含各種類型的數(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é)果:


運行結(jié)果1

我們可以看到,系統(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ù)初始化列表。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容