物件導向程式設計中,友誼函數(friend function)是一個指定類別(class)的「朋友」,該函數被允許存取該類別中private、protected、public的資料成員。普通的函數並不能存取private和protected的資料成員,然而宣告一個函數成為一個類別的友誼函數則被允許存取private以及protected的資料成員。

友誼函數的宣告可以放在類別宣告的任何地方,不受存取限定關鍵字private、protected、public的限制。一個相似的概念是友誼類別英語friend class

友誼關鍵字應該謹慎使用。如果一個擁有private或者protected成員的類別,宣告過多的友誼函數,可能會降低封裝性的價值,也可能對整個設計框架產生影響。

應用

編輯

當一個函數需要存取兩個不同類型對象的私有資料成員的時候,可以使用友誼函數。有兩種使用的方式:

  • 該函數作為全域函數,在兩個類別中被宣告為友誼函數
  • 作為一個類別中的成員函數,在另一個類別中被宣告為友誼函數
#include <iostream>
using namespace std;

class Bezaa; // Forward declaration of class Bezaa in order for example to compile.
class Aazaa
{
private:
    int a;
public:
    Aazaa() { a = 0; }
    void show(Aazaa& x, Bezaa& y);
    friend void ::show(Aazaa& x, Bezaa& y); // declaration of global friend
};

class Bezaa
{
private:
    int b;
public:

    Bezaa() { b = 6; }
    friend void  ::show(Aazaa& x, Bezaa& y); // declaration of global friend
    friend void Aazaa::show(Aazaa& x, Bezaa& y); // declaration of friend from other class 
};

// Definition of a member function of Aazaa; this member is a friend of Bezaa
void Aazaa::show(Aazaa& x, Bezaa& y)
{
  cout << "Show via function member of Aazaa" << endl;
  cout << "Aazaa::a = " << x.a << endl;
  cout << "Bezaa::b = " << y.b << endl;
}

// Friend for Aazaa and Bezaa, definition of global function
void show(Aazaa& x, Bezaa& y)
{
  cout << "Show via global function" << endl;
  cout << "Aazaa::a = " << x.a << endl;
  cout << "Bezaa::b = " << y.b << endl;
}

int main()
{
   Aazaa a;
   Bezaa b;

   show(a,b);
   a.show(a,b);
}

參考文獻

編輯
  • 《The C++ Programming Language》 by Bjarne Stroustrup

外部連結

編輯