接續基礎語法,本文涵蓋對象數組、對象指針、成員指針、this 指針、const 語義全景、動態對象管理、對象賦值與拷貝區別、靜態成員等核心進階主題。
// 構造函數單參數可用初始化列表
Student stu[3] = { 90, 92, 101 };
// 多參數構造需逐個顯式調用
Student stu2[3] = {
Student(1000, 19, 90),
Student(1001, 20, 85),
Student(1002, 19, 92)
};
Box box;
Box* ptr = &box;
ptr->volume(); // 等價 (*ptr).volume()
| 類型 | 聲明語法 | 賦值/使用示例 |
|---|---|---|
| 數據成員指針 | int Box::* pData; | pData = &Box::width; int w = box.*pData; |
| 成員函數指針 | void (Box::* pFunc)(); | pFunc = &Box::volume; (box.*pFunc)(); |
關鍵點:成員函數指針類型必須匹配參數列表、返回類型、所屬類;指向 public 成員函數用 &Class::func,不可寫成 &obj.func(函數代碼不在對象內存中)。
ClassName* const this,指向調用對象。data 實為 this->data 簡寫。*this 實現鏈式調用/實現運算符重載。const Time t(10, 20, 30); // 必須初始化
// 僅能調用 const 成員函數(構造/析構除外)
void print() const; // 聲明與定義都要加 const
// 體內不可修改非 mutable 成員
// 常對象只能調用常成員函數
const int id;| 聲明 | 含義 |
|---|---|
const int* p / int const* p | 常量指針:指向的值不可改 |
int* const p | 指針常量:指針本身不可改 |
const int* const p | 指向常量的常指針:雙重不可改 |
void func(const int* p):實參可為 int* 或 const int*;函數內不可透過 p 修改值。void func(int* p):實參只能為 int*;函數內可修改值。const Box& ref = box; // 綁定非常量對象,視為只讀
// 僅能調用 const 成員函數
Box* p = new Box(10, 20, 30); // 分配 + 構造,返回地址
// 使用 p->...
delete p; // 析構 + 釋放內存,p 成懸空指針,良習 p = nullptr;
new 失敗拋出 bad_alloc(或 nothrow 版返回 nullptr)。Box* arr = new Box[10]; delete[] arr;(必須配對 [])。| 操作 | 語法 | 本質 | 前置條件 |
|---|---|---|---|
| 賦值 | obj2 = obj1; | 逐成員賦值(預設淺拷貝) | obj2 已存在 |
| 拷貝構造 | Class obj2(obj1); / Class obj2 = obj1; | 創建新對象並初始化 | obj2 不存在 |
陷阱:若類含裸指針,預設賦值/拷貝均為淺拷貝 → 雙重釋放/懸空指針。必須實現深拷貝(拷貝構造 + 賦值運算符)或禁用(= delete)。
static int count;(類內聲明,不分配內存)。int Class::count = 0;(類外,全局/靜態存儲區,僅一份)。Class::count 或 obj.count(不推薦後者,易誤解為實例成員)。static void func();this 指針,只能訪問靜態成員。Class::func()(推薦)或 obj.func()。
