類的外部,也就是通過例項來訪問私有(private)或保護(protected)成員,這是被禁止的。但從實用性來說,的確有時很需要在外部訪問,c++增加了一種稱之為「友元(friend)」函式的申明,將「特權」賦給一些函式(可以是全域性函式,也可以是其它類的成員函式),使之能夠訪問該類的私有和保護成員。
友元函式必須在類裡面申明,而且友元函式一定不是該類的成員函式。因此,這樣的「特權」實際上已經不是完全的物件導向設計了,當然,我們也可以不用它。另外,友元函式的申明在派生類無效,除非派生類中再申明一次,當然型別轉換為基類時,使用沒有任何問題。
一、全域性函式作友元
要使用全域性函式作友元函式,也就是說全域性函式中要使用當前這個類的例項,因此,全域性函式的定義必須放在這個類的後面,否則,編譯時這個類的例項就成了未定義的資料型別了。
二、其它類的成員函式作友元#include
#include
using namespace
std;class
caprotected
:string name;
void
setname(string s)public
:void
print()friendvoid
fun(ca& a); //申明全域性函式作友元,允許它訪問私有保護成員};
class
derive :public
ca ; //ca類的派生類void
fun(ca& a)int
main ( )
別的類的成員函式作友元,也就是說這2個類相互呼叫,這樣無論誰定義在前在後,編譯時都有衝突。要解決這個問題,只要將類的申明、定義、實裝分開就可以了。請注意例子中的解說。
三、運算子過載中使用友元#include
#include
using namespace
std;class ca; //事先申明ca類,確保cb類的定義不出錯
class
cb ;class
caprotected
:string name;
void
setname(string s)public
:void
print()friendvoid
cb::test(ca& a); //申明cb類的test()函式作友元,允許它訪問私有保護成員};
void
cb::test(ca& a)int
main ( )
下面將上一章最後乙個例子稍作修改,操作符過載由類的函式改為全域性函式,也就是說,這個運算子不是這個類的,而是正常使用的操作符。注意過載函式的寫法與上一章略有不同。不過,改為友元方式其實並沒有必要,純粹是為了講解「友元」的用法。
並不是所有操作符都可以定義成「友元」,例如「=」就不能用「友元」方式過載。#include
#include
using namespace
std;class
rectrect(
int
m1,int
n1,int
m2,int
n2)void
print()//rect operator++(); //這是類的運算子的過載
friend
rectoperator
++(rect &ob); //這是全域性運算子的過載};rect
operator
++(rect &ob)int
main ( )
友元函式 friend
一 乙個類的成員函式有三個互不相干作用 1.可以通過類的成員方法,訪問它的私有資料。2.該函式的作用域在類中。3.在外部調動該函式必須通過成員訪問符訪問,也就是必須經由乙個物件去啟用 有乙個this指標 二 友元函式 1.友元函式作用域不屬於類的作用域,不是類的成員,也就不是類的方法,不受公有 私有...
friend 友元函式友元類
這篇是引用,具體是引用哪位的博主不查了 僅供自己回顧複習用 friend 型別 函式名 形式引數 友元函式的宣告可以放在類的私有部分,也可以放在公有部分,它們是沒有區別的,都說明是該類的乙個友元函式。乙個函式可以是多個類的友元函式,只需要在各個類中分別宣告。友元函式的呼叫與一般函式的呼叫方式和原理一...
C 之friend友元(友元函式和友元類)
在c 中,類具有封裝性和隱蔽性,類的資料成員一般都定義為私有成員,成員函式一般都定義為公有的,以此提供類與外界的通訊介面。但是,某些成員函式頻繁呼叫時,由於函式引數的傳遞 c 嚴格的型別檢查和安全性檢查將帶來時間的開銷,為了解決這個問題,c 提出了使用友元作為實現這一要求的輔助手段。友元不是類的成員...