類別 Class

在前一章節,我們提到了程式設計的一個重要基礎觀念,物件導向。在那個章節中我們提到了類別 Class 的概念,相信大家都還不是很懂什麼是類別。

這個章節我們就要來探索什麼是類別 Class,這也是一個在程式設計中非常重要的觀念!

什麼是類別

物件導向 那篇文中,我們提到了物件導向的核心就是物件。而每個物件都有兩個特點,特徵以及行為。

在 C++ 中,類別 Class 就像是物件的藍圖或是模板。在這個模板中,我們會定義這個物件該如何被創造、具有哪些特徵、以及可以執行什麼行為。

舉個例子來說,如果我們有一個名叫 Car 的類別,那這個類別可能就具有這些特徵及行為:

特徵:

  • brand
  • model
  • color

行為:

  • start()
  • accelerate()
  • stop()

在 C++ 中,這些類別有一個專有名字,叫做自定義型別,英文叫做 User Defined Types。

因為不像是 int 或是 double 等基本型別,我們使用者可以自行創造類別,並使其中含有不同的資料型態。

創建類別

了解什麼是類別後,我們就來看該如何創建類別吧!

創建類別其實非常簡單,只需要使用關鍵字 class 就好!我們直接來看例子:

// 建立 Person 類別
class Person
{
private:
    std::string name;
    int age;

public:
    // 建構子: 定義如何創建這個類別
    Person(std::string n, int a) {
        name = n;
        age = a;
    }

    // 這個類別可以做的行為
    void introduce() {
        std::cout << "Hello, my name is " << name << " and I am " << age << " years old." << std::endl;
    }
};

int main()
{
    // 基於 Person 類別創建實體物件
    Person person1("Alice", 25);
    Person person2("Bob", 30);

    // 使用類別中的行為
    person1.introduce();
    person2.introduce();

    return 0;
}

接下來我們仔細解析一下其中的細節。

private v.s. public

首先我們看到了兩個關鍵字,privatepublic這個機制控制了除了這個類別以外的程式碼是否可以取得這個類別中的成員。

  • private:當類別中的成員標記為 private 時,這代表它僅能從同一類別內訪問。程式的其他部分無法直接訪問 private 成員。在我們的 Person 類別範例中,nameage 變數被標記為 private,因此無法直接從 main() 或程式的其他部分訪問。它們只能通過 Person 類別內部定義的成員函式來訪問或修改,也就是 introduce() 這個函數。
  • public:相反的,當類別的成員標記為 public 時,代表著它可以從類別外訪問。舉例來說,在我們的 Person 類別範例中,introduce() 函式被標記為 public,因此可以在 main() 函式中使用。
建構子

建構子,英文叫做 Constructor。建構子定義了物件該如何被創造。

在我們的範例中,這個建構子需要兩個參數,一個是字串型別的 n,另一個是整數型別的 a。這兩個參數會在實際物件被創建時分別初始化 nameage

創建物件

接下來我們來到 main() 函數,我們可以看到我們利用 Person 這個模板,創立了兩個實體物件,person1person2

請注意,這裡有一個程式初學者常常會犯的觀念錯誤,這兩個物件來自同一個類別模板,但是兩個是不同物件,彼此沒有任何關係!

也就是說,如果我更改了 person1 中的資料,對 person2 不會有任何影響!

上面的程式碼在執行後就會有這樣的輸出:

Hello, my name is Alice and I am 25 years old.
Hello, my name is Bob and I am 30 years old.

優點

我們在物件導向的 優點 那節中談到物件導向觀念的優點,包括模組化、封裝、繼承等等一堆有看沒有懂的專業術語。

這邊我們就不講專業術語了,我們來講點人話。

我個人認為,Class 的概念之所以在程式設計中如此重要,是因為它可以將各種應用細節給「包起來」。當你需要使用一個物件時,你只需要知道這個物件提供你什麼服務,你要如何使用它就好。你並不需要知道它是如何做到的,這大大減少了開發程式碼所需的時間與腦力。

我永遠記得在大學上課提到這個觀念時,當時的老師舉的例子:

類別這個概念就像生活中的電視遙控器一樣,除了製造那個遙控器的人以外,沒有人知道裡面是如何運作的。但我們需要知道嗎?當然不需要!我們只要知道我們可以用電視遙控器打開電視、轉台、調整音量就好!

也就是說,在程式碼中,我們只需要這樣:

Remote remote;
remote.openTV();

我們需要知道 openTV() 裡面是什麼嗎?不需要。我們只要確認 openTV() 是讓我們打開電視就行了!

沒有類別這個概念的程式碼就像是在跟你說,如果你想要遙控電視,那麼首先你必須先知道電視遙控器是如何製作的,然後自行實作出電視遙控器,才能遙控電視。你想一想就知道這有多花時間跟腦力!怎麼可能這樣做!

這樣比喻是不是有比較理解類別的優點啦!

總結

這章我們了解了什麼是類別 Class,還有他的使用方式與技巧。

這個觀念為程式碼大大增添了擴展性,也讓我們在設計上更為自由。

實際上,你可能在學這章以前就已經使用過 Class 了!因為絕大部分標準程式庫的東西,都是使用 Class 實作,比如說 std::string

當我們在呼叫其中的函數比如說 size()reverse() 時,其實就是在呼叫類別中的行為喔!

在下一章,我們要來介紹 Class 的兄弟:Struct!