類別與物件核心概念
- 類別:自訂複合資料類型,將**資料(屬性)**與**操作資料的函數(方法)**封裝在一起。是物件的**抽象藍圖**。
- 物件:類別的**具體實例**,佔用記憶體、擁有狀態與行為。
- 三大特性:封裝性、繼承性、多態性。
類別定義語法
class <類別名稱> {
public: // 公有介面,提供外部服務
成員函數宣告;
成員資料宣告;
private: // 私有實作細節,隱藏內部狀態
成員資料宣告;
成員函數宣告;
protected: // 保護成員,供衍生類別存取
成員宣告;
}; // 分號不可省略
// 成員函數定義(類別外部)
回傳型別 類別名稱::函數名稱(參數列) {
函數本體;
}
存取指定符
| 指定符 | 存取權限 | 典型用途 |
public | 任意處存取 | 介面方法、常數 |
private | 僅類別內部、友元 | 資料成員、輔助函數 |
protected | 類別內部、衍生類別、友元 | 供繼承使用的成員 |
- 順序不限、可重複出現
- **預設為 private**(
struct 預設 public)
完整範例:日期類別 TDate
分離宣告與實作(推薦)
// TDate.h
class TDate {
public:
void SetDate(int y, int m, int d);
int IsLeapYear() const;
void Print() const;
private:
int year_, month_, day_;
};
// TDate.cpp
void TDate::SetDate(int y, int m, int d) {
year_ = y; month_ = m; day_ = d;
}
int TDate::IsLeapYear() const {
return (year_%4==0 && year_%100!=0) || (year_%400==0);
}
void TDate::Print() const {
std::cout << year_ << '-' << month_ << '-' << day_;
}
內嵌定義(簡單類別適用)
class TDate {
public:
void SetDate(int y, int m, int d) { year_=y; month_=m; day_=d; }
int IsLeapYear() const { return (year_%4==0&&year_%100!=0)||(year_%400==0); }
void Print() const { std::cout << year_ << '-' << month_ << '-' << day_; }
private:
int year_, month_, day_;
};
定義類別的關鍵規則
- 類別內不可初始化資料成員(C++11 起靜態常數整數除外),需在建構函式初始化
- 資料成員型別:可為基本型別、陣列、指標、引用、其他類別物件
- 遞迴包含限制:不可包含自身類別物件,但可包含**自身指標/引用**
- 成員排序建議:public 先於 private;資料成員按大小排序(小→大)提升記憶體對齊效率
- 習慣做法:宣告置於
.h,實作置於 .cpp,大型專案便於管理
作用域解析運算子 ::
格式:類別名稱::成員名稱,用於:
- 類別外定義成員函數
- 存取靜態成員
- 區分同名全域/區域識別項
從結構體到類別的演進
| 特性 | C struct | C++ struct | C++ class |
| 包含函數 | 否 | 是 | 是 |
| 存取控制 | 無 | 預設 public | 預設 private |
| 封裝性 | 無 | 有 | 有 |
| 繼承 | 無 | 有 | 有 |
物件導向設計原則
- 高內聚:類別職責單一明確
- 低耦合:類別間依賴最小化
- 介面與實作分離:使用者只依賴 public 介面
- 資訊隱藏:private 封裝實作細節