類別:物件的藍圖
class 關鍵字定義類別,內含成員變數與成員函數。類別本身**不佔記憶體**,只是型別聲明;物件是類別的**實例**,佔用實際儲存空間。
基本語法
class Student {
public:
char* name;
int age;
float score;
void say() {
cout << name << " 年齡 " << age << " 成績 " << score << endl;
}
};
- 類別名慣用 **PascalCase**(首字母大寫)。
- 結尾**分號不可省略**(
};)。
public: 使後續成員對外可存取(詳細見存取權限章節)。
建立物件:兩種儲存區、兩種語法
| 方式 | 儲存區 | 語法 | 生命週期 | 記憶體管理 |
| 自動物件 | 堆疊 | Student stu; | 離開作用域自動銷毀 | 編譯器自動 |
| 動態物件 | 堆積 | Student* p = new Student; | 手動 delete p 才銷毀 | 程式設計師負責 |
自動物件(棧上)
int main() {
Student stu; // 建立
stu.name = "小明"; // 成員存取用 .
stu.age = 15;
stu.score = 92.5f;
stu.say();
return 0;
} // stu 自動銷毀
動態物件(堆上)
int main() {
Student* pStu = new Student; // 必須用指標接收,否則記憶體洩漏
pStu->name = "小明"; // 成員存取用 ->
pStu->age = 15;
pStu->score = 92.5f;
pStu->say();
delete pStu; // 釋放記憶體,呼叫析構函數
return 0;
}
關鍵差異:new 回傳位址,物件無名(匿名),**必須用指標持有**;未 delete 造成記憶體洩漏。陣列形式 new Student[10] 需配對 delete[]。
物件陣列
Student classA[30]; // 棧上 30 個 Student
Student* classB = new Student[50]; // 堆上 50 個
// 使用 classA[i].say() 或 classB[i].say()
delete[] classB;
成員存取運算子總結
.:物件/參考 存取成員(stu.name)。
->:指標 存取成員(pStu->name,等價 (*pStu).name)。
類別定義位置
- 通常置於**全域/命名空間作用域**(函數外),供多函數共用。
- 也可置於函數內(區域類別),但極少使用,作用域侷限於該函數。
完整可執行範例
#include <iostream>
using namespace std;
class Student {
public:
char* name;
int age;
float score;
void say() {
cout << name << " 年齡 " << age << " 成績 " << score << endl;
}
};
int main() {
// 自動物件
Student stu;
stu.name = "小明"; stu.age = 15; stu.score = 92.5f;
stu.say();
// 動態物件
Student* p = new Student;
p->name = "李華"; p->age = 16; p->score = 96;
p->say();
delete p;
return 0;
}
總結
class 定義型別,new/自動建立實例。
- 棧上物件:自動管理、作用域綁定、用
. 存取。
- 堆上物件:手動管理、
new/delete 配對、用 -> 存取、必須用指標持有。
- 記住
delete 釋放動態記憶體,養成 RAII 思維(後續章節將介紹智慧指標)。
- 上一篇文章: C++ 類別成員變數與成員函數詳解
- 下一篇文章: C++ 函數重載完整指南
Copyright ©
程式碼之家 All Rights Reserved