首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 友元類詳解:打破封裝的受控訪問機制

     編輯:關於C++

概念定義

友元類:若類 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
}

友元類 vs 友元函數

  • 友元函數:單個函數獲得訪問權,粒度細。
  • 友元類:整個類的所有成員函數獲得訪問權,粒度粗,適用於緊密協作的類對(如容器與迭代器、智能指針與控制塊)。

經典應用場景

  1. 運算符重載:ostream& operator<<(ostream&, const MyClass&) 需訪問私有成員,常聲明為友元函數。
  2. 建造者模式:Builder 類需構建 Product 的私有字段,可聲明為友元類。
  3. 單例模式:某些實現中,SingletonHolder 為 Singleton 友元。
  4. 標準庫:std::vector 等容器的內部實現類常互為友元。

最佳實踐與警示

  • 慎用:友元破壞封裝性,增加耦合。能用公有接口解決的堅決不用友元。
  • 最小權限原則:優先用友元函數而非友元類,除非確實需要整個類訪問。
  • 文檔化:在類註釋中說明為何需要友元,方便維護。

總結

友元類是 C++ 提供的受控封裝突破機制。正確使用能簡化緊密協作類之間的接口設計;濫用會導致代碼脆弱、難維護。理解其單向、非傳遞、非繼承特性,並在架構層面謹慎決策是否引入友元關系。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved