iT邦幫忙

3

【c/c++學習筆記】什麼是物件導向程式設計?什麼是class(類別)?

當學習程式到比較進階的時候,
常會聽到物件導向一詞,
但常常不明所以為何程式要使用一個物件
所以今天便嘗試用生活化的方式來說明物件導向的觀念

什麼是物件導向程式設計?

傳統的寫程式模式認為,
寫程式就是給電腦下達一個又一個的指令,
然而當程式開發的愈來愈大的時候也造成程式愈來愈難寫

物件導向程式設計則在程式中加入「物件」這個概念,
每個物件都應該可以看成是一個小型的「機器」,
可以接收一些資料、處理資料,或傳資料給其它的物件

物件可以有非常多形式,
譬如日常中: 電鍋、汽車、書本、水壺、…都是物件,
甚至抽象的東西也可以是一個物件
例如: 課程、會議、幽默感、… 等等都是

那麼有物件導向跟沒有物件導向的差別在哪裡呢?
以日常生活的例子比喻,
假設你現在要做「煮飯」這件事,
沒有物件導向的狀況下,
你就只能把「煮飯」的每個步驟寫下來,
一步一步去做

而如果有物件導向的話,
「電鍋」是一個物件,
你知道「電鍋」有「煮飯」這個方法
你只需要去買一個電鍋,
然後呼叫電鍋.煮飯()這個方法,
然後飯就會煮好了,
你甚至不需要知道電鍋是怎麼煮飯的,
僅僅需要會操作電鍋就好。

類別(class)基礎概念介紹

一、類別

不是程式領域的人初看class這個字可能會覺得有點莫名其妙,
class不是班級的意思嗎?
這邊class是類別的意思

類別定義了一個事物的屬性它可以做到的事情(稱做「方法」),
例如我們看一段虛擬碼:

class 電鍋:
    成員:
        顏色
        大小
        煮飯()

我們可以定義一個類別叫做「電鍋」,
它具有顏色、大小等屬性,會做煮飯這件事

二、物件v.s.類別

寫程式常會用到「物件」和「類別」,
這兩個名詞相同嗎?
給個簡單的區別:

  • 類別= 設計藍圖,是一個抽象的概念
  • 物件= 根據此概念所製作出來的實體

譬如說我們已經定義了「電鍋」這個類別,
我們就可以用這個類別去定義一個物件

定義 大同 是一個電鍋;
大同.顏色 = 紅色;
大同.煮飯();

你可以去呼叫大同.煮飯(),但無法去呼叫電鍋.煮飯()
就好像電鍋可以煮飯,但是沒有一個具體的電鍋是沒辦法叫它煮飯的

c++實作類的方法

來看如何撰寫實際的程式碼,
在c++中,要定義一個類別,
需要用關鍵字class

一、定義一個class

例如「電鍋」可以是一個類別,
我們可以為電鍋定義一個類別,
這個類別有「大小」和「顏色」兩種屬性
(命名class的習慣是首字母會大寫,普通變數則是小寫就可以了)

class ElectricPot
{
    public:
        int size;
        string color;
};

這邊程式碼中用了public這個字是什麼意思呢?
public表示說明定義在這裡面屬性是可以在class外面被存取的,
與此相對的關鍵字是private
定義為private的成員對於class外面的人來說,
會猶如隱形一樣,看不見也摸不著,
關於publicprivate的用法預計之後還會另寫文章統整

二、用class創建一個物件

程式碼很簡單,先寫類別再寫名字,
就像你平時在c++宣告一個整數(int),名稱叫作a
你會這樣寫:

int a;

類似的,假設我們已經定義過class ElectricPot了,
想創建名字叫myPot的電鍋,
可以這樣寫:

ElectricPot myPot;

三、存取物件內的成員

要存取一個物件內的成員,我們會使用「.」這個符號,
例如我們可以把剛剛創建的myPot這個電鍋的大小設為20,顏色設為yellow:

ElectricPot myPot;
myPot.size = 20;
myPot.color = "yellow";

四、完整的程式碼範例

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

class ElectricPot
{
    public:
        int size;
        string color;
};

int main()
{
    ElectricPot myPot;
    myPot.size = 20;
    myPot.color = "yellow";
    
    //測試列印物件內成員
    std::cout << myPot.size << std::endl; 
    std::cout << myPot.color << std::endl;  
    return 0;
}

結果為:
20
yellow

未完待續…

這時一定有讀者讀完後發現了什麼

咦?等等?心原一馬你好像還沒教完啊?
剛剛你在生活化的例子舉例說電鍋可以「煮飯」,
可是在程式碼範例都沒教到在函數內定義「煮飯」這個方法,
不要以為你轉移話題我就會忘記了吼~

嗯…class的使用可說是個蠻大的主題,
也並非一時半刻間能學完的,
如果想學到更完整的class使用攻略,
歡迎追蹤小馬關注我的新文章哦

吼~ 心原一馬也學會賣關子了齁~

其實也並非刻意藏私啦,
只是像學校老師般一堂課把好多的知識塞給學生好像往往消化不良(?)
那麼祝大家學習程式愉快啦


尚未有邦友留言

立即登入留言