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

C++ 友元函數深度解析:跨類訪問私有成員的正確姿勢

     編輯:關於C++

友元函數核心概念

友元函數是 C++ 中打破類封裝性的特殊機制。它允許非成員函數訪問類的 private 和 protected 成員。關鍵特性:

  • 在類內部用 friend 關鍵字聲明
  • 不屬於類的成員,沒有 this 指針
  • 可同時被多個類聲明為友元,實現跨類數據共享

實戰案例:深圳/上海股票統計系統

題目要求:兩個類 shen_stock 和 shang_stock,各自擁有三個私有成員(普通股、ST股、PT股)。需求:

  1. 各自擁有友元函數計算並顯示該市場股票總數
  2. 共享一個友元函數 count() 計算兩市總和

完整代碼實現

#include <iostream>
using namespace std;

// 前向聲明
class shang_stock;

class shen_stock {
    int general, st, pt;
public:
    shen_stock(int g, int s, int p) : general(g), st(s), pt(p) {}
    friend void add_shen(shen_stock &s);        // 深圳專用友元
    friend void count(shen_stock &s, shang_stock &ss); // 共享友元
};

class shang_stock {
    int general, st, pt;
public:
    shang_stock(int g, int s, int p) : general(g), st(s), pt(p) {}
    friend void add_shang(shang_stock &s);      // 上海專用友元
    friend void count(shen_stock &s, shang_stock &ss); // 共享友元
};

// 深圳市場統計
void add_shen(shen_stock &s) {
    cout << "shen_stock total: " << s.general + s.st + s.pt << endl;
}

// 上海市場統計
void add_shang(shang_stock &s) {
    cout << "shang_stock total: " << s.general + s.st + s.pt << endl;
}

// 兩市合計
void count(shen_stock &s, shang_stock &ss) {
    int total = s.general + s.st + s.pt + ss.general + ss.st + ss.pt;
    cout << "Total stocks: " << total << endl;
}

int main() {
    shen_stock sz(100, 20, 5);
    shang_stock sh(80, 15, 3);
    add_shen(sz);
    add_shang(sh);
    count(sz, sh);
    return 0;
}

關鍵注意點

  1. 前向聲明:當友元函數參數涉及尚未定義的類時,必須前向聲明(如 class shang_stock;)
  2. 雙向聲明:共享友元函數需在兩個類中都聲明 friend void count(...)
  3. 無作用域限制:友元函數定義時不加類名作用域(如 shen_stock::)

最佳實踐建議

友元雖然強大,但會破壞封裝性。原則上:

  • 優先考慮公有成員函數或 getter/setter
  • 僅在運算符重載(如 operator<<)、緊密協作的類之間、或極少數性能關鍵場景使用
  • 避免濫用導致代碼耦合度過高
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved