友元類:若類 B 被聲明為類 A 的友元類,則 B 的所有成員函數都可以訪問 A 的私有成員和保護成員。
聲明語法:friend class ClassName;
| 特性 | 說明 |
|---|---|
| 單向性 | A 友元 B ⇏ B 友元 A |
| 非傳遞性 | A 友元 B,B 友元 C ⇏ A 友元 C |
| 非繼承性 | 基類的友元關系不自動繼承給派生類 |
| 作用域 | 友元聲明可放在類的 public/protected/private 任意處,效果相同 |
#include
using namespace std;
class Radius {
friend class Circle; // Circle 為友元類
friend void ShowR(Radius&); // 友元函數
private:
int r;
public:
Radius(int x) : r(x) {}
};
class Circle {
public:
void printRadius(const Radius& rad) {
cout << "Radius = " << rad.r << endl; // 訪問私有成員 r
}
};
void ShowR(Radius& rad) {
cout << "ShowR: " << rad.r << endl;
}
int main() {
Radius r(5);
Circle c;
c.printRadius(r); // OK
ShowR(r); // OK
}
ostream& operator<<(ostream&, const MyClass&) 需訪問私有成員,常聲明為友元函數。Builder 類需構建 Product 的私有字段,可聲明為友元類。SingletonHolder 為 Singleton 友元。std::vector 等容器的內部實現類常互為友元。友元類是 C++ 提供的受控封裝突破機制。正確使用能簡化緊密協作類之間的接口設計;濫用會導致代碼脆弱、難維護。理解其單向、非傳遞、非繼承特性,並在架構層面謹慎決策是否引入友元關系。