C++ 入門指南 - 封裝

開發新類別 (class) 的目的不外是提供給其他人使用,然而用的人往往只需要知道類別的規格就可以了,至於怎麼樣實作出類別的細節,其實不是那麼重要,這是程式設計中頗為重要的概念 --- 資訊隱藏 (information hiding)




最基本的就是把成員變數 (variable member) 封裝 (encapsulation) 在類別之中,這時候就要用到 private 存取標籤 (accsee label) 了
class Demo {
public:
    void setA(int n);
    void setB(int n);
    int getA();
    int getB();
    int do_something();

private:
    int a;
    int b;

};


這裡 ab 已經改放到 private 之後,也由於 ab 都是 private 的,因此另外宣告 publicsetA()setB() 設定 ab 之值, getA()getB() 取得 ab 之值。


setA()setB() 就是俗稱的 setter ,至於 getA()getB() 是俗稱的 getter


因此 setAsetBgetAgetB 的實作很簡單,如下
void Demo::setA(int n) {
    a = n;
}

void Demo::setB(int n) {
    b = n;
}

int Demo::getA() {
    return a;
}

int Demo::getB() {
    return b;
}


do_something也要稍作改變
int Demo::do_something() {
    return getA() + getB();
}


我們寫成一個完整範例,如下
#include <iostream>

using namespace std;

class Demo {
public:
    void setA(int n);
    void setB(int n);
    int getA();
    int getB();
    int do_something();

private:
    int a;
    int b;

};

int Demo::do_something() {
    return getA() + getB();
}

void Demo::setA(int n) {
    a = n;
}

void Demo::setB(int n) {
    b = n;
}

int Demo::getA() {
    return a;
}

int Demo::getB() {
    return b;
}

int main(void) {
    Demo t;
    t.setA(11);
    t.setB(22);
 
    cout << endl;
    cout << t.do_something() << endl;
    cout << endl;
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:classdemo2.cpp
    功能:示範 C++ 程式 
    作者:張凱慶
    時間:西元 2012 年 10 月 */


編譯執行結果如下



但是這樣設定變數成員還得呼叫 setAsetB ,有點麻煩,我們希望宣告 (declare) 時就能夠直接設定,嗯,這用建構子 (constructor) 就可以了。


中英文術語對照
類別class
資訊隱藏information hiding
成員變數variable member
封裝encapsulation
存取標籤accsee label
宣告declare
建構子constructor


您可以繼續參考
基礎篇


相關目錄
回 C++ 入門指南
回 C++ 教材目錄
回首頁


參考資料
http://www.cplusplus.com/doc/tutorial/classes/
http://www.cplusplus.com/doc/tutorial/classes2/

2 則留言:

豆花 提到...

為甚麼要多個getA()和getB()

Unknown 提到...

樓上
因為a, b是private,在class外部不能用他們
getA() 和 getB()是public,程式各處都能用