類是 C++ 面向對象程序設計的核心構建塊,實現了數據與操作的封裝、繼承復用與多態擴展。本文系統講解類的定義結構、訪問控制、成員函數特性、this 指針機制、構造/析構/拷貝語義、靜態成員、友元等核心概念,配合代碼示例與內存模型圖解。
class Clock {
public: // 公有接口:外部可訪問
void setTime(int h, int m, int s);
void showTime() const; // 常成員函數
protected: // 保護成員:派生類可訪問
int timezone_;
private: // 私有成員:僅本類內部可訪問
int hour_, minute_, second_;
bool isValid(int h, int m, int s) const; // 內部輔助函數
};
class 默認成員為 private;struct 默認 public。| 訪問位置 | public | protected | private |
|---|---|---|---|
| 類內部 | ✓ | ✓ | ✓ |
| 派生類內部 | ✓ | ✓ | ✗ |
| 類外部 (對象/指針/引用) | ✓ | ✗ | ✗ |
最佳實踐:數據成員盡量 private,提供 public/protected 存取器;實現細節函數 private;派生類需訪問的內部接口 protected。
// 類內定義(隱式 inline)
class A { void foo() { /* ... */ } };
// 類外定義(需作用域限定)
void A::foo() { /* ... */ }
this 指針機制ClassName* const this。obj.func() 實際轉為 ClassName::func(&obj)。member 隱式轉為 this->member。const 成員函數:void foo() const ⇒ this 類型為 const ClassName* const,不可修改非 mutable 成員。| 概念 | 範圍 | 條件 | 關鍵字 |
|---|---|---|---|
| 重載 | 同一作用域 | 參數列表不同 | 無 |
| 覆寫 | 基類/派生類 | 同名、同參數、基類虛函數 | override (C++11) |
| 隱藏 | 基類/派生類 | 同名、參數不同 或 基類非虛 | 無 |
this 指針,僅能訪問靜態成員。ClassName::staticFunc() 或 obj.staticFunc()。Clock(int h, int m, int s) : hour_(h), minute_(m), second_(s) {} —— **優先於函數體執行**,對 const、引用、無默認構造的成員**必須**在列表初始化。Clock() : Clock(0,0,0) {}。explicit 防止隱式轉換:explicit Clock(int h);。~ClassName(),無參數、無返回值、不可重載。virtual**,否則通過基類指針刪除派生對象時僅調用基類析構,導致資源洩漏。| 操作 | 函數簽名 | 默認行為 | 何時自定義 |
|---|---|---|---|
| 拷貝構造 | Class(const Class&) | 逐成員拷貝 | 管理動態資源/句柄 |
| 拷貝賦值 | Class& operator=(const Class&) | 逐成員賦值 | 同上 |
| 移動構造 | Class(Class&&) noexcept | 逐成員移動 | 資源盜取優化 |
| 移動賦值 | Class& operator=(Class&&) noexcept | 逐成員移動賦值 | 同上 |
Rule of Five:若自定義了上述任一,通常需全部顯式聲明(或 =default/=delete)。
friend class B; / friend void func(Class&);
class Outer {
class Inner { /* ... */ }; // 內部類
Inner in_; // 可直接使用
};
// 外部使用:Outer::Inner obj;
內部類是外部類的成員,**不自動擁有外部類對象訪問權**(需傳遞外部對象引用)。
Clock(10, 30, 0).showTime(); // 臨時對象,表達式結束即析構
+------------------+ | 非靜態數據成員 | ← 按聲明順序排列(中間可能有填充對齊) +------------------+ | 虛函數表指針(vptr)| ← 有虛函數時,通常放對象首地址 +------------------+ | 基類子對象 | ← 多繼承時多個基類子對象 +------------------+
vbptr (虛基類表指針),佈局更複雜。sizeof(Class) 包含所有非靜態數據 + 填充 + vptr/vbptr,不包含靜態成員。private,行為 public。explicit 防隱式轉換。virtual,覆寫加 override。=default/=delete/自定義)。const 正確性:只讀函數加 const,參數傳 const T&。