物件 是客觀事物在電腦中的抽象描述,封裝資料 (屬性) 與操作 (方法/行為)。類別 是擁有相同屬性與行為的一群物件的統一描述,也是一種使用者定義型別 (User-Defined Type)。物件則是該型別的實例 (變數)。
class ClassName {
private: // 私有:僅類別內部成員函式可存取 (預設)
// 資料成員 / 成員函式
protected: // 保護:類別內部 + 衍生類別可存取
// 資料成員 / 成員函式
public: // 公有:任何程式碼皆可存取 (介面)
// 建構函式、解構函式、公用介面函式
}; // 分號不可漏
class 關鍵字定義類別,慣例類別名首字母大寫 (PascalCase)。private (預設)、protected、public。封裝原則:資料成員盡量 private,提供 public 成員函式存取。ReturnType ClassName::FuncName(Params) { ... } 定義。
// 類別內宣告
void SetValue(int v);
int GetValue() const;
// 類別外定義 (需作用域解析運算子 ::)
void MyClass::SetValue(int v) { value = v; }
int MyClass::GetValue() const { return value; }
:: 稱為作用域解析運算子,指明函式隸屬哪個類別。成員函式可帶預設參數。
MyClass obj; // 區域/全域/靜態物件
MyClass obj1, obj2; // 多個物件
MyClass* ptr = &obj; // 指向物件的指標
MyClass& ref = obj; // 物件參考 (別名)
物件建立時自動呼叫建構函式,銷毀時自動呼叫解構函式。
| 方式 | 語法 | 條件 | |
|---|---|---|---|
| 物件直接存取 | obj.member | 物件、參考 | |
| 指標存取 | ptr->member | 指標已指向有效物件 |
| 類型 | 建立時機 | 銷毀時機 | 範例 |
|---|---|---|---|
| 區域物件 | 執行到宣告處 | 離開區塊 (} ) | 函式內 MyClass obj; |
| 區域靜態物件 | 首次執行到宣告處 | 程式結束 | 函式內 static MyClass obj; |
| 全域物件 | 程式啟動 (main 前) | 程式結束 | 檔案作用域 MyClass g_obj; |
| 全域靜態物件 | 程式啟動 | 程式結束 | 檔案作用域 static MyClass g_obj; (內部連結) |
MyClass* p = new MyClass(10); // 配置記憶體 + 呼叫建構函式
// ... 使用 p-> ...
delete p; // 呼叫解構函式 + 釋放記憶體
// 陣列
MyClass* arr = new MyClass[10]; // 呼叫 10 次預設建構函式
delete[] arr; // 呼叫 10 次解構函式 + 釋放記憶體
new 失敗拋出 std::bad_alloc (或舊標準傳回 nullptr,視編譯器選項)。new/delete 配對),必須確保不洩漏、不重複釋放、不使用已釋放記憶體。std::unique_ptr, std::shared_ptr) 管理動態物件。
MyClass arr[10]; // 靜態陣列:10 個物件,各呼叫預設建構函式
MyClass arr[3] = { // 列表初始化 (C++11)
MyClass(1), MyClass(2), MyClass(3)
};
// 動態陣列見上節
陣列元素為完整物件,依序建構、逆序解構。
#include <iostream>
#include <string>
using namespace std;
class Student {
string name;
int id;
public:
Student(const string& n, int i) : name(n), id(i) {
cout << "建構: " << name << endl;
}
~Student() {
cout << "解構: " << name << endl;
}
void Print() const {
cout << "學生: " << name << " (ID: " << id << ")" << endl;
}
};
int main() {
Student s1("Alice", 1001); // 區域物件
Student* s2 = new Student("Bob", 1002); // 動態物件
s1.Print();
s2->Print();
delete s2; // 手動釋放
return 0; // s1 此處自動解構
}
輸出順序:建構 Alice → 建構 Bob → 列印 Alice → 列印 Bob → 解構 Bob (delete) → 解構 Alice (main 結束)。
| 概念 | 核心規則 |
|---|---|
| 類別 | 封裝資料與操作、三種存取權限、定義以分號結尾 |
| 物件 | 類別的實例、自動建構/解構、作用域決定生命週期 |
| 成員存取 | obj.member、ptr->member |
| this | 非靜態成員函式隱含參數、指向呼叫物件、不可修改 |
| 動態物件 | new/delete 配對、建議改用智慧指標 |
| 陣列 | 元素為完整物件、依序建構/逆序解構 |