採 用類的機制後實現了數據的隱藏與封裝,類的數據成員通常定義爲私有成員,成員函數通常定義爲公有的,依此提供類與外界間的通訊接口。可是,有時須要定義一 些函數,這些函數不是類的一部分,但又須要頻繁地訪問類的數據成員,這時能夠將這些函數定義爲該函數的友元函數。除了友元函數外,還有友元類,二者統稱爲 友元。友元的做用是提升了程序的運行效率(即減小了類型檢查和安全性檢查等都須要時間開銷),但它破壞了類的封裝性和隱藏性,使得非成員函數能夠訪問類的 私有成員。
友元函數 :
友元函數是能夠直接訪問類的私有成員的非成員函數。它是定義在類外的普通函數,它不屬於任何類,但須要在類的定義中加以聲明,聲明時只需在友元的名稱前加上關鍵字friend,其格式以下:
friend 類型 函數名(形式參數);
友元函數的聲明能夠放在類的私有部分,也能夠放在公有部分,它們是沒有區別的,都說明是該類的一個友元函數。
一個函數能夠是多個類的友元函數,只須要在各個類中分別聲明。
友元函數的調用與通常函數的調用方式和原理一致。 安全
友元類 :
友元類的全部成員函數都是另外一個類的友元函數,均可以訪問另外一個類中的隱藏信息(包括私有成員和保護成員)。
當但願一個類能夠存取另外一個類的私有成員時,能夠將該類聲明爲另外一類的友元類。定義友元類的語句格式以下:
friend class 類名;
其中:friend和class是關鍵字,類名必須是程序中的一個已定義過的類。
例如,如下語句說明類B是類A的友元類:
class A
{
…
public:
friend class B;
…
};
通過以上說明後,類B的全部成員函數都是類A的友元函數,能存取類A的私有成員和保護成員。
使用友元類時注意:
(1) 友元關係不能被繼承。
(2) 友元關係是單向的,不具備交換性。若類B是類A的友元,類A不必定是類B的友元,要看在類中是否有相應的聲明。
(3) 友元關係不具備傳遞性。若類B是類A的友元,類C是B的友元,類C不必定是類A的友元,一樣要看類中是否有相應的申明函數