友元可以實現在類外定義,但是能提供跟類內的成員一樣的訪問許可權,它能訪問類中的所有成員即使是private的(不過要注意繼承的情況,父類的private是不能訪問的,不過子類的成員也是不能訪問父類的private的,所以可以認為友元的許可權跟類自身的成員訪問許可權一樣)。
c++中的友元可分為三類:友元函式,友元類,類的成員函式是另一類的友元函式;
友元的作用是實現類之間的資料共享,減小系統開銷,提高效率;一般應用友元的場景有這兩種:
1)某些運算子的過載;(友元過載運算子,通常用在運算子的左右運算元不相同的情況,比如說流運算子《和》,因為友元函式不能獲取this指標!不能用友元函式過載的運算子有:[],(),->,=);
2)兩個類之間要共享資料時;
某些人說友元的缺點是破壞了封裝性。不過我不這麼看,我認為封裝所強調的不是隱藏,而是控制開放!從這個層面講,public所提供的是控制哪些成員開放,而friend所提供的是控制對誰開放!而至於將哪些成員設定為public,哪些物件設定為friend,這就是類的作者需要斟酌的事情了!
要注意,友元函式與成員函式的區別是友元函式是沒有this指標的,所以需要以物件作為引數;另外就是友元關係是不能繼承的,即父類的友元,不能是子類的友元;
友元並沒有破壞封裝。將何人設成友元,或者說允許誰來訪問本類的私有成員,完全是由本類的作者決定的,如同將哪些成員設成公共成員一樣。public控制開放哪些成員,friend控制開放的目標,是控制的兩種表現形式,並不是對立的,所以從概念上講並沒有破壞封裝。
所謂「封裝」,並不是說把所有的東西都包起來不給別人看,而是指有控制的允許一些人看到一些東西,強調的是「控制」,而不是「隱藏」。有「隱藏」必有「開放」,否則就談不上封裝了,關鍵在於作者能不能控制這種開放。有的語言不能控制,就說它不具有「封裝」特性,有的語言能夠控制,就說它具有「封裝」特性。
c++的「封裝」特性是指其能夠「控制開放」,友元只是細化這種控制,並沒有失去控制,所以並沒有破壞「封裝」。類似還有protected,只允許特定目標訪問特定成員,也是對「封裝」的細化,都在類的作者的控制之下。
最初曾考慮過將friend進一步細化到控制單獨的成員,也就是說同時控制開放成員與目標,不過語法上太彆扭了,所以現在friend作用於所有成員,public作用於所有目標。
C 中的 友元函式 友元類
1.友元函式的簡單介紹 1.1為什麼要使用友元函式 在實現類之間資料共享時,減少系統開銷,提高效率。如果類a中的函式要訪問類b中的成員 例如 智慧型指標類的實現 那麼類a中該函式要是類b的友元函式。具體來說 為了 使其他類的成員函式直接訪問該類的私有變數。即 允許外面的類或函式去訪問類的私有變數和保...
C 中的友元函式和友元
在c 中類具有封裝的隱蔽性,由於語言特性,只有成員函式才能訪問私有成員,非成員函式只能訪問類中的公有成員,可是有時候我們需要非成員函式呼叫私有成員,這個時候要是將私有成員定義為公有的又會破壞c 的封裝,為了解決上述問題,我們提出了友元的概念 友元分為友元函式和友元類,友元函式就是非成員函式可是當我們...
C 中的友元
乙個類的私有成員除了它的成員函式之外是不能被其他類或函式所訪問的。為了能構使其他類或函式能訪問類的私有成員,我們可以使其他類或函式成為該類的友元。如果想把乙個類或函式作為該類的友元,則只需在在該類或函式的宣告前加個friend,注意帶有friend的宣告必須在類的內部 如前言所述,要想將乙個函式宣告...