【C/C++】友元函數

爲何要使用友元函數?

  • 在實現類之間數據共享時,減小系統開銷,提升效率
  • 若是類A中的函數要訪問類B中的成員(例如:智能指針類的實現),那麼類A中該函數要是類B的友元函數
  • 爲了使其餘類的成員函數直接訪問該類的私有變量。即:容許外面的類或函數去訪問類的私有變量和保護變量,從而使兩個類共享同一函數。此時可以使用友元類

友元函數是全局函數仍是類的成員函數

  • 友元函數既能夠是全局函數也能夠是某個類的成員函數

哪些狀況下使用友元函數

  • 運算符重載的某些場合須要使用友元(由於運算符要訪問類中的成員變量)
  • 兩個類要共享數據的時候。

友元函數的優缺點

  • 優勢:可以提升效率,表達簡單、清晰。
  • 缺點:友元函數破環了封裝機制,咱們應儘可能使用成員函數,除非不得已的狀況下才使用友元函數。

友元函數的參數:

由於友元函數沒有this指針,參數要有三種狀況:函數

  • 要訪問非static成員時,須要對象作參數;
  • 要訪問static成員或全局變量時,則不須要對象作參數;
  • 若是作參數的對象是全局對象,則不須要對象作參數;

在類中什麼位置聲明友元函數?

  • 由於友元函數是類外的函數,因此它的聲明能夠放在類的私有段或公有段且沒有區別。

如何調用友元函數

  • 能夠直接調用友元函數,不須要經過對象或指針

友元函數分爲哪幾種?

  • 普通友元函數
  • 友元類
  • 友元成員函數

說說普通友元函數

  • 目的:使普通函數可以訪問類的私有成員
  • 聲明: friend + 普通函數聲明
  • 位置:能夠在類外或類中
  • 代碼:與普通函數相同
  • 調用:相似普通函數,直接調用
  • 舉例
class INTEGER
{
  friend void Print(const INTEGER& obj);//聲明友元函數
};

void Print(const INTEGER& obj)
{
   //函數體
}
void main()
{
  INTEGER obj;
  Print(obj);//直接調用
}

這裏說的普通函數是指全局函數this


說說友元類

  • 類Y的全部成員函數都爲類X友元函數
  • 舉例
class girl;

class girl{
private:
  char *name;
  int age;
  friend boy; //聲明類boy是類girl的友元
};
class boy{
public:
  void disp(girl &);
};
void boy::disp(girl &x) //函數disp()爲類boy的成員函數,也是類girl的友元函數
{
    //藉助友元,在boy的成員函數disp中,藉助girl的對象,直接訪問girl的私有變量
   cout<<"girl's name is:"<<x.name<<",age:"<<x.age<<endl;
}

簡單說說成員友元函數

  • 類Y的一個成員函數爲類X的友元函數
  • 目的:使類Y的一個成員函數成爲類X的友元,具體而言:在類Y的這個成員函數中,藉助參數X,能夠直接使用X的私有變量
  • 語法:聲明位置:聲明在公有中 (自己爲函數)
  • 聲明:friend + 成員函數的聲明
  • 調用:先定義Y的對象y---使用y調用本身的成員函數---本身的成員函數中使用了友元機制
  • 舉例
    -- 實現代碼和2.4.2.3中的實現及其類似只是設置友元的時候變爲friend void boy::disp(girl &);本身解決嘍……

小結:其實一些操做符的重載實現也是要在類外實現的,那麼一般這樣的話,聲明爲類的友元是必須滴。指針


友元函數和類的成員函數的區別

  • 成員函數有this指針,而友元函數沒有this指針。
  • 友元函數是不能被繼承的,就像父親的朋友未必是兒子的朋友。
相關文章
相關標籤/搜索