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

C++ 友元類詳解:打破封裝訪問私有成員

     編輯:C++ 入門

問題背景

默認情況下,類無法訪問另一類的私有成員。即使繼承也不行(private 不可繼承訪問)。

友元類聲明

在類 A 中聲明 friend class B;,則 B 成為 A 的友元,可訪問 A 的所有私有/保護成員(包括構造/析構)。

示例代碼


#include 
class A {
    friend class B; // 關鍵聲明
private:
    int a;
public:
    A() : a(1) {}
};

class B {
public:
    void printA(A &obj) { std::cout << obj.a << std::endl; } // 訪問 A::a
};

int main() {
    A a; B b; b.printA(a); // 輸出 1
    return 0;
}

友元類特性

  • 單向性:A 友元 B ≠ B 友元 A。需雙向聲明。
  • 非傳遞性:A 友元 B,B 友元 C ⇒ A 不自動友元 C。
  • 不破壞封裝本質:友元關係在類定義時聲明,屬於設計時決策,非運行時破解。

友元函數

同理,可聲明全局函數或其它類成員函數為友元:friend void func(A&); 或 friend void B::method(A&);。

最佳實踐建議

  • 極少使用友元。多數情況下,提供公共介面(getter/setter)或重新設計類關係更佳。
  • 適用場景:運算符重載(如 operator<< 需訪問私有流數據)、緊密協作的類對(如容器與迭代器)、單例模式的特定訪問器。
  • 濫用友元會導致耦合度極高,維護困難。

總結

友元是 C++ 為特定場景提供的「後門」,使用時需權衡封裝性與便利性,遵循「最小權限原則」。

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