物件導向 Object-Oriented Programming

在 C++ 的世界中,物件導向是一個非常重要的觀念!英文叫做 Object-Oriented Programming (OOP)。

物件導向這個觀念將在程式中的各種元件看作一個擁有特定屬性和行為的對象,這對程式開發的效率和清晰度的提升起到關鍵的作用。

在這一章中,我們就來討論到底什麼是物件導向?「物件」到底是什麼?以及如果沒有物件導向概念,我們的程式碼又會如何?

什麼是物件導向

物件導向,顧名思義這個概念就是以「物件」為核心觀念。那麼什麼是「物件」?

在 C++ 中,「物件」基本上就是一個 Class 的實例。我知道這樣講你們一定也聽不懂,因為我們根本還沒講到 Class 是什麼。

我們可以想像,寫程式碼就像是在疊樂高,最終的目標是要搭建出城堡,而「物件」就是一塊一塊的樂高。

每塊樂高具有不同的顏色、形狀,功能也不盡相同。但是他們會互相合作以達成最終目標。

再看看現實生活中,我們所看到的每一個物體,都是一個物件。我們可以利用兩個特點來描述這些物件:

  1. 特徵 Attributes
  2. 行為 Behaviors
特徵 Attributes

現實生活中,一個物件的特徵可能是它的顏色、形狀、大小等等,這些特徵可以為我們提供有關這個物件更深入的資訊,讓我們更了解這個物件。

行為 Behaviors

行為描述了一個物件可能存在的狀態、或是可能有的行為,比如說是否盛滿水、保溫等等。

我們可以透過這些行為,去了解當前物件所處的狀態,或是利用它的行為去影響另一個物件。

優點

物件導向是貫穿程式設計的核心觀念,那麼這樣的觀念具體帶給我們哪些優點呢?

  • 模組化:OOP 讓我們可以将程式碼拆分為更小且更容易管理的物件,這讓程式碼更簡潔也更容易維護。
  • 可重複使用:當我們創建了一個類別 Class,我們可以在程式碼的不同部分重複使用它,節省時間和精力。
  • 封裝:封裝隱藏物件的內部細節,只對外暴露必要的信息和功能。這可以防止惡意攻擊或是意外干擾,可以很大的提升程式碼的安全性。
  • 繼承:繼承讓我們可以創建新的類別,並繼續使用原類別所有的屬性和行為。這促進了程式碼的重複使用,也有助於創建程式碼的良好結構。

我知道以上這些優點對於剛碰觸物件導向這個觀念的人來說基本上算是有看沒有懂,但沒關係!這些看過去有印象就好了,你只要知道物件導向真的帶給我們很多優點就好哈哈哈!

實例

這裡我們就來看一下,對於有基於物件導向觀念去做設計的程式碼,和沒有基於這個觀念的程式碼,兩者究竟有什麼差別!

沒有使用物件導向:

int main()
{
    int radius = 5;
    double pi = 3.14;
    double area = pi * radius * radius;
    std::cout << "Area of the circle: " << area << std::endl;
    return 0;
}

有使用物件導向:

class Circle
{
private:
    int radius;
    double pi;
public:
    Circle(int r) : radius(r), pi(3.14) {}

    double calculateArea() {
        return pi * radius * radius;
    }
};

int main() {
    Circle circle(5);
    std::cout << "Area of the circle: " << circle.calculateArea() << std::endl;
    return 0;
}

一直以來,我們都是寫出像是第一個例子中的程式碼(沒有使用物件導向觀念)。

在第二個例子中,雖然現在可能看不懂在幹嘛,但是我們只要注意幾件事。

第一,我們在這裡創造了一個物件 circle 。

第二,這個物件具有兩個特徵

  • 半徑 radius
  • 常數 pi

和一個行為

  • 計算面積 calculateArea()

而在主函數中,我們只要呼叫這個物件的行為即可,非常方便。

事實上,我們常常會將物件的定義寫在另一個檔案中,並在主文件中使用,這大大簡化了主文件的複雜性。

比如說:

Circle.hpp

class Circle {
private:
    int radius;
    double pi;
public:
    Circle(int r) : radius(r), pi(3.14) {}

    double calculateArea() {
        return pi * radius * radius;
    }
};

main.cpp

int main() {
    Circle circle(5);
    std::cout << "Area of the circle: " << circle.calculateArea() << std::endl;
    return 0;
}

可能你們會感覺第二個例子寫了更多的程式碼,以這個例子來看,是這樣沒錯。

但是在大型專案中,可能會有幾百幾千個這樣的物件,你可以想像全部像第一個例子一樣寫的後果嗎?不僅難懂而且超級複雜。

況且,我們也不可能每個物件都花時間一個一個查看內部運作邏輯,我們只需要知道,這個物件可以做到我想要他做到的事就好。

以這個例子來說,我們不需要知道圓的面積是如何計算,只需要知道我們呼叫該物件的 calculateArea() 就好!

總結

這章我們了解了貫穿程式設計的基礎觀念:物件導向 OOP。

這個觀念雖然基礎,但是也為程式設計增添了一層複雜性與擴展性。

我知道在這章我提到了還沒被提到的觀念:類別。但不用緊張!下一章就讓我們一起來了解類別 Class 這個關念!