CPP-類定義(Class definitions)

Member function 的declaration和普通函數一樣。僅有的差別是放在類的定義裏面。同樣數據成員的declaration和普通變量也一樣,只是放在類的定義裏面。保留字public和private用來實現信息隱藏。public暗示被宣稱的屬性在類的定義的後續部分是可見的。即到處都可獲得。private暗示只能在類的內部獲得。 如果沒有指明是public或private,類中所有成員默認爲private.

C++中成員的宣稱可以以任何順序放置,public 和private也可以任意放置。但通常public放於private之前。

Declaration: what the function is called, what parameters it has, and what result type it returns. 爲了使用一個類,成員函數的定義,包括函數的完整實現,必須存在。c++中,有兩種方法來定義成員函數,他們可以直接放在內中間,也可以單獨放在內的定義之外。例如,我們可以定義如下類:
其中,三個簡單函數的實現在類中間,另外三個函數的實現在內之外:

class Clock {
public:
    void set(int hour, int min, int sec);
    int read_hour() {return h;}
    int read_min() { return m;}
    int read_sec() { return s;}
    void write(bool write_sec = true);
    void tick();
private:
    int h, m, s;
};

void Clock::set(int hour, int min, int sec)
{
    h = hour; m = min; s = sec;
}
void Clock::write(bool write_sec)
{
    cout << setw(2) << setfill('0') << h
        << ':' << setw(2) << setfill('0') << m;
    if (write_sec)
        cout << ':' << setw(2) << setfill('0') << s;
}
void Clock::tick()
{
    s = (s + 1) % 60;
    if (s == 0)
    {
        m = (m + 1) % 60;
        if (m == 0)
            h = (h + 1) % 24;
    }
}

注意儘管數據成員沒有在成員函數中定義,也沒有作爲亞元傳遞給成員函數,但成員函數能夠直接訪問數據成員,但這隻侷限在成員函數。如果我們有另外一個函數,並不是類Clock的成員函數,那麼就不能訪問h,m和s. 當在一個成員函數內使用數據成員名字時,暗示數據成員屬於當時成員函數被調用的類。成員函數不是普通函數,他們有獨特的性質。例如:成員函數能直接訪問類中的數據成員。當成員函數在所屬類的外部被定義時,不能直接寫成員函數的名字,必須指明此成員函數屬於那個類。
在類的內部直接定義成員函數顯得很方便,由於寫的東西較少,但也應該小心,因爲程序的可讀性會降低。
關於成員函數的位置,另外一些事情也必須清楚,這和c++編譯器如何將成員函數轉變爲機器罵有關。當調用一個函數時候(適用普通函數和成員函數),編譯器通常產生機器碼,這意味着程序要跳轉到函數代碼的位置,當函數機器碼執行完畢,程序要跳轉回調用的地方。函數機器碼本身只存在於一個地址,因此所有調用都導致跳轉到該地址。因此在每次調用時候必須有些指令保證程序的正確跳轉和參數的正確傳遞。如果一個程序極其簡單,只包含一條或兩條語句,很可能這些額外指令比函數本身更復雜並要求更多的內存空間。此時,最好的情況是不執行跳轉,而讓程序在調用的地方直接開始執行,這種函數是inline function. inline function的代碼在程序中所有調用的地方重複。
成員函數經常很簡短,因此最好定義爲inline function.如果成員函數的定義直接在類的內部,那麼編譯器默認將這些函數變爲inline function. 由於比較長的函數不被認爲是inline,因此,在類的內部定義多餘幾條語句的函數是不恰當的。這些函數應該單獨定義。
將類的定義和函數定義分開還有其他好處,即使需要多書寫代碼,例如,程序看起來更好,更容易懂。依次所有函數應該在類的外部定義,即使函數很簡短。如果我們想讓函數成爲inline, 我們總能用在函數定義時候使用inline。

例如:

inline void Clock::set(int hour,int min,int sec)
{
    h=hour;m=min;s=sec;
}
發佈了16 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章