內部類不必然全部設為私有,其訪問權限應根據功能職責與封裝需求決定。STL 容器中 Node 與 Iterator 的設計恰好體現了這一原則。
template <typename T>
class list {
private:
struct Node { // 內部節點結構
T data;
Node* prev;
Node* next;
// 構造函數等...
};
Node* head; // 僅容器內部使用
public:
// 對外僅提供操作接口:push_back, push_front 等
};
設計理由:節點是容器內部實現細節,外部無需也不應直接訪問節點指針,否則會破壞鏈表結構完整性。私有化確保數據封裝與不變量維護。
template <typename T>
class list {
private:
struct Node { ... };
public:
class iterator { // 公開的內部類
Node* ptr;
friend class list; // 允許容器訪問私有成員
// 構造、解引用、遞增等操作...
};
iterator begin() { return iterator(head->next); }
iterator end() { return iterator(head); }
};
設計理由:迭代器是容器與外部算法交互的標準接口。若設為私有,外部無法聲明 list<int>::iterator it;,標準算法(如 std::sort、std::find)將無法使用。friend 聲明賦予容器創建迭代器的權限,同時保護節點指針不被外部直接操作。
| 內部類角色 | 建議權限 | 核心原因 |
|---|---|---|
| 實現細節類(如節點、內部數據結構) | private | 隱藏實現、維護不變量、防止誤用 |
| 對外接口類(如迭代器、函數對象、訪問器) | public | 支持標準庫協議、泛型編程、外部擴展 |
| 輔助實現類(僅本類內部使用的工具類) | private | 減少耦合、簡化接口 |
private。public。friend 實現「外部可用、內部可控」的雙重保障。