前言
類別 (class) 是 C++ 面向物件的核心,將資料與操作封裝為可重用單元。本文從結構體延伸,建立類別、物件、成員、存取控制等核心概念。
一、從結構體到類別
// 結構體 (C 風格,資料導向)
struct Student {
int id;
float score;
};
// 類別 (C++ 風格,行為導向)
class Student {
private: // 私有:類別內部可存取
int id;
public: // 公開:介面,外部可存取
float score;
int GetId() const { return id; } // 唯讀存取器
void SetId(int v) { id = v; } // 寫入器 (可驗證)
};
二、核心術語對照
| 傳統/結構體術語 | 面向物件術語 | 說明 |
| 結構體變數 | 物件 / 實例 | 類別的具體化實體 |
| 成員變數 | 資料成員 / 屬性 | 物件狀態 |
| 成員函數 | 方法 / 成員函數 | 物件行為 |
| 建構子 | 建構子 | 初始化物件 |
| 解構子 | 解構子 | 清理資源 |
三、存取控制三大關鍵字
| 關鍵字 | 可見範圍 | 用途 |
public | 任何地方 | 對外介面:建構子、公有方法、常數 |
protected | 類別內部 + 衍生類別 | 給子類別用的輔助方法/資料 |
private | 僅類別內部 | 內部實作細節、不變式保護 |
預設存取權
class:**預設 private**
struct:**預設 public** (相容 C)
四、物件建立與成員存取
Student stu; // 呼叫預設建構子
stu.score = 95.5f; // 公開資料成員直接存取
// stu.id = 100; // 錯誤:private 不可外部存取
stu.SetId(100); // 透過公開方法間接存取
int id = stu.GetId(); // 讀取私有資料
五、完整範例:封裝銀行帳戶
class BankAccount {
private:
std::string owner;
double balance;
static double interestRate; // 靜態成員:類別級共享
public:
BankAccount(const std::string& name, double initial)
: owner(name), balance(initial) {} // 成員初始化清單
void Deposit(double amount) {
if (amount > 0) balance += amount;
}
bool Withdraw(double amount) {
if (amount > 0 && amount <= balance) {
balance -= amount; return true;
}
return false;
}
double GetBalance() const { return balance; }
const std::string& GetOwner() const { return owner; }
static void SetInterestRate(double r) { interestRate = r; }
static double GetInterestRate() { return interestRate; }
};
// 靜態成員定義 (在 .cpp 中)
double BankAccount::interestRate = 0.015;
六、C 與 C++ 程式設計範式對比
| 維度 | C (程序導向) | C++ (物件導向) |
| 核心公式 | 程式 = 演算法 + 資料結構 | 物件 = 演算法 + 資料結構 程式 = 物件 + 物件 + ... |
| 資料與函數 | 分離 | 封裝於類別 |
| 重用機制 | 函數庫、複製貼上 | 繼承、組合、模板、多型 |
| 擴充性 | 修改原始碼 | 衍生新類別、覆寫虛擬函數 |
七、域解析運算子 ::
ClassName::StaticMember:存取靜態成員
ClassName::Method():類別外定義成員函數
Namespace::Name:命名空間限定
::GlobalName:全域命名空間
八、常見新手錯誤
| 錯誤 | 正確認知 |
以為 private 能防駭客/反編譯 | 僅編譯期存取控制,執行期記憶體可直接讀寫 |
所有成員設為 public 方便 | 破壞封裝,無法維護不變式,耦合度極高 |
| 建構子未初始化所有成員 | 使用成員初始化清單,啟用編譯器警告 |
| 混淆「物件」與「類別」 | 類別是模具,物件是實例 (如圖紙 vs 房子) |
結語
類別透過 private 隱藏實作、public 暴露介面,實現封裝。這是 C++ 從 C 進化的關鍵:將「資料+操作」綁定,建立清晰契約,支援大規模軟體工程。下一章將深入建構子、解構子與資源管理 (RAII)。