我們知道類具有封裝和資訊隱藏的特性。只有類的成員函式才能訪問類的私有成員,程式中的其他函式是無法訪問私有成員的。非成員函式可以訪問類中的公有成員。有時候我們又需要其他非成員函式訪問類的成員,並且對於該成員我們不希望它是公有的(有可能這是危險的操作,我們希望它只針對某些操作可見),如果將它定義為公有的明顯不符合我們的期望並且破壞了隱藏的特性。另外,應該看到在某些情況下,特別是在對某些成員函式多次呼叫時,由於引數傳遞,型別檢查和安全性檢查等都需要時間開銷,而影響程式的執行效率。
為了解決上述問題,提出一種使用友元的方案。友元是一種定義在類外部的普通函式或類,但它需要在類體內進行說明,為了與該類的成員函式加以區別,在說明時前面加以關鍵字friend。友元不是成員函式,但是它可以訪問類中的私有成員。友元的作用在於提高程式的執行效率,但是,它破壞了類的封裝性和隱藏性,使得非成員函式可以訪問類的私有成員。不過,類的訪問許可權確實在某些應用場合顯得有些呆板,從而容忍了友元這一特別語法現象。
友元的作用:友元提供了不同類的成員函式之間、類的成員函式與一般函式之間進行資料共享的機制。通過友元,乙個不同函式或另乙個類中的成員函式可以訪問類中的私有成員和保護成員。c++中的友元為封裝隱藏這堵不透明的牆開了乙個小孔,外界可以通過這個小孔窺視內部的秘密。
友元的特點:友元的正確使用能提高程式的執行效率,但同時也破壞了類的封裝性和資料的隱藏性,導致程式可維護性變差。
友元的分類:類可以把乙個普通函式定義成友元,也可以把其他類定義成友元,還可以把類的成員函式定義成友元。
下面,我們會具體了解友元的使用場景。我們以手機中常見的功能——便簽做為例子來說明,在這裡只是為了說明使用友元的情況,可能和實際有出路(我們並沒有給出具體的實現,只是借這個例子說明情況)。
假設,我們的便簽的管理上有乙個專門的類cnotemng,它負責管理所有的記錄。
#ifndef __note_mng_h__
#define __note_mng_h__
#include #include #include "note.h"
class cnotemng
;void displaynotesum(void)
#endif //#ifndef __note_mng_h__
我們能從類似資源管理器的軟體中看的便簽的統計。為此,我們的例子cnotemng將統計便簽數量的普通函式定義為友元。這就是類可以把乙個普通函式定義成友元。
具體的一條記錄的實現可能類似下面的實現:
#ifndef __note_h__
#define __note_h__
#include class cnode
;#endif //#ifndef __note_h__
我們希望cnotemng能實現乙個功能,該功能能清除掉所有的便簽記錄,為此我們在cnote中增加乙個介面,可能實現為清除磁碟上的記錄。並且我們希望這個介面被保護起來,為此我們宣告為私有的。但我們為了在cnotemng中的clearallnote()能使用這個私有介面,為此我們類成員函式定義為友元。這就是類可以把其他類的成員函式定義成友元。
如果我們還需要增加一項功能,該功能是,根據標題,建立日期,內容進行檢索,並顯示檢索到的記錄(我們可能需要遍歷所有的記錄,並進行比較,這樣就需要操作到具體類cnode的私有成員)。為此,我們就需要在類cnode中定義cnotemng為友元類。這就是類可以把其他類定義為友元類。
#ifndef __note_mng_h__
#define __note_mng_h__
#include #include #include #include "note.h"
class cnotemng
;void displaynotesum(void)
#endif //#ifndef __note_mng_h__
#ifndef __note_h__
#define __note_h__
#include class cnode
;#endif //#ifndef __note_h__
C 之「友元類」學習筆記
什麼是友元類 當乙個類b成為了另外乙個類a的 朋友 時,那麼類a的私有和保護的資料成員就可以被類b訪問。我們就把類b叫做類a的友元。友元類能做什麼 友元類可以通過自己的方法來訪問把它當做朋友的那個類的所有成員。但是我們應該注意的是,我們把類b設定成了類a的友元類,但是這並不會是類a成為類b的友元。說...
C 之「友元類」學習筆記
什麼是友元類 當乙個類b成為了另外乙個類a的 朋友 時,那麼類a的私有和保護的資料成員就可以被類b訪問。我們就把類b叫做類a的友元。友元類能做什麼 友元類可以通過自己的方法來訪問把它當做朋友的那個類的所有成員。但是我們應該注意的是,我們把類b設定成了類a的友元類,但是這並不會是類a成為類b的友元。說...
C 之「友元類」學習筆記
什麼是友元類 當乙個類b成為了另外乙個類a的 朋友 時,那麼類a的私有和保護的資料成員就可以被類b訪問。我們就把類b叫做類a的友元。友元類能做什麼 友元類可以通過自己的方法來訪問把它當做朋友的那個類的所有成員。但是我們應該注意的是,我們把類b設定成了類a的友元類,但是這並不會是類a成為類b的友元。說...