iT邦幫忙

1

【c/c++學習筆記】類別中的存取權限: public, private, protected

c++

每個人都有秘密,
總有想要隱藏的東西與願意公開分享的東西。
我們c++的類別- class也是,
我們用三種關鍵字: public, private, protected表達對成員的存取權限

以日常生活比喻這三種權限:

  • public猶如你在iT邦幫忙發技術文章,人人可以看到
  • private猶如你不想給人看到的秘密日記,只有自己可以看
  • protected雖是隱私的訊息,但跟親近的人分享還是可以的,譬如你朋友或你小孩

對應到c++是否可以被存取的關係,
我們可以整理成一張表格:

https://ithelp.ithome.com.tw/upload/images/20200308/20117114WYZ5o30XMw.png

大致像這樣,表格中打勾的地方表示能夠存取
這邊提到了一個專有名詞「繼承」,
關於「繼承」的語法後續再提

首先示範c++如何為class內的成員定義存取權限,
一樣以這幾篇一直在用的類別「電鍋」做示範:
假設電鍋有colorsize兩種屬性,
secretcook兩種方法
這邊我們將color屬性和secret方法定義成private
size屬性和cook方法定義成public

class ElectricPot
{
    private:
        string color;
        void secret(){ 
            std::cout << "神秘功能"<<std::endl;
        }
    public:
        int size;
        void cook(){
            std::cout << "我是"<< this->color <<"顏色的電鍋,我正在煮飯"<<std::endl;
        }
};

注意這邊定義cook()函數時,用到了color這個private的成員,
但由於cook()是自己類別的函數,
所以用到private成員是沒有關係的 (比喻: 自己本來就可以看自己的秘密)

另外,語法上private可省略不寫,在class中默認所有的成員都是private

class ElectricPot
{
    string color;
    void secret(){ 
        std::cout << "神秘功能"<<std::endl;
    }
    public:
        int size;
        void cook(){
            std::cout << "我是"<< this->color <<"顏色的電鍋,我正在煮飯"<<std::endl;
        }
};

我們在主程式中測試是否可以存取這些成員

合法的存取

由於sizecook()都是public,
在主程式要去修改size的值或是呼叫cook()都是可以的

int main()
{
    ElectricPot myPot;
    myPot.size = 20;
    myPot.cook();
}

不合法的存取

由於colorsecret()都是private,
在主程式中自是既不能看也不能用的

int main()
{
    ElectricPot myPot;
    myPot.size = 20;
    myPot.cook();
    std::cout << myPot.color << std::endl; //錯誤: color是private成員
    myPot.color = "yellow"; //錯誤: color是private成員
    myPot.secret(); //錯誤: secret()是private成員
    return 0;
}

完整的範例程式

#include <iostream>
#include <string>
using std::string;

class ElectricPot
{

    string color;
    void secret() {
        std::cout << "神秘功能" << std::endl;
    };
    public:
        int size;
        void cook() {
            std::cout << "我是" << this->color << "顏色的電鍋,我正在煮飯" << std::endl;
        }
};

int main()
{
    ElectricPot myPot;
    myPot.size = 20;
    myPot.cook();
    return 0;
}

什麼時候用private?

小馬常看到的例子是普通的變數會用private保護,
class能做的事情則定義為public讓其它地方可以使用。

譬如我們定義一個長方形類別,它有長和寬:
比如說如果需要修改長方形的長寬,會另外定義public的函數允許修改,

class Rectangle
{
    int x, y;
    public:
        void set_values(int x, int y) {
            this->x = x;
            this->y = y;
        };
};

這樣我們在其它地方用到Rectangle這個類別時,
只能透過set_values這個函數來修改x, y的值,
而無法直接修改x, y

Rectangle r;
r.set_values(3,4); //合法
r.x = 3; //不合法,因為x是private

你可能覺得在這種小的程式中保護x, y變數好像沒什麼意義,
但在撰寫大型且複雜的程式時,
可以避免x, y變數被意外的修改


尚未有邦友留言

立即登入留言