友元函式 friend

2021-06-22 11:56:30 字數 2093 閱讀 9066

類的外部,也就是通過例項來訪問私有(private)或保護(protected)成員,這是被禁止的。但從實用性來說,的確有時很需要在外部訪問,c++增加了一種稱之為「友元(friend)」函式的申明,將「特權」賦給一些函式(可以是全域性函式,也可以是其它類的成員函式),使之能夠訪問該類的私有和保護成員。

友元函式必須在類裡面申明,而且友元函式一定不是該類的成員函式。因此,這樣的「特權」實際上已經不是完全的物件導向設計了,當然,我們也可以不用它。另外,友元函式的申明在派生類無效,除非派生類中再申明一次,當然型別轉換為基類時,使用沒有任何問題。

一、全域性函式作友元

要使用全域性函式作友元函式,也就是說全域性函式中要使用當前這個類的例項,因此,全域性函式的定義必須放在這個類的後面,否則,編譯時這個類的例項就成了未定義的資料型別了。

#include#includeusing namespacestd;classcaprotected:

string name;voidsetname(string s)public:voidprint()friendvoidfun(ca& a); //申明全域性函式作友元,允許它訪問私有保護成員

};classderive :publicca ; //ca類的派生類voidfun(ca& a)intmain ( )

二、其它類的成員函式作友元

別的類的成員函式作友元,也就是說這2個類相互呼叫,這樣無論誰定義在前在後,編譯時都有衝突。要解決這個問題,只要將類的申明、定義、實裝分開就可以了。請注意例子中的解說。

#include#includeusing namespacestd;

class ca; //事先申明ca類,確保cb類的定義不出錯classcb ;classcaprotected:

string name;voidsetname(string s)public:voidprint()friendvoidcb::test(ca& a); //申明cb類的test()函式作友元,允許它訪問私有保護成員

};voidcb::test(ca& a)intmain ( )

三、運算子過載中使用友元

下面將上一章最後乙個例子稍作修改,操作符過載由類的函式改為全域性函式,也就是說,這個運算子不是這個類的,而是正常使用的操作符。注意過載函式的寫法與上一章略有不同。不過,改為友元方式其實並沒有必要,純粹是為了講解「友元」的用法。

#include#includeusing namespacestd;classrect 

rect(intm1,intn1,intm2,intn2)voidprint()

//rect operator++(); //這是類的運算子的過載friendrectoperator++(rect &ob); //這是全域性運算子的過載

};rectoperator++(rect &ob)intmain ( )

並不是所有操作符都可以定義成「友元」,例如「=」就不能用「友元」方式過載。

友元函式 friend

一 乙個類的成員函式有三個互不相干作用 1.可以通過類的成員方法,訪問它的私有資料。2.該函式的作用域在類中。3.在外部調動該函式必須通過成員訪問符訪問,也就是必須經由乙個物件去啟用 有乙個this指標 二 友元函式 1.友元函式作用域不屬於類的作用域,不是類的成員,也就不是類的方法,不受公有 私有...

friend 友元函式友元類

這篇是引用,具體是引用哪位的博主不查了 僅供自己回顧複習用 friend 型別 函式名 形式引數 友元函式的宣告可以放在類的私有部分,也可以放在公有部分,它們是沒有區別的,都說明是該類的乙個友元函式。乙個函式可以是多個類的友元函式,只需要在各個類中分別宣告。友元函式的呼叫與一般函式的呼叫方式和原理一...

C 之friend友元(友元函式和友元類)

在c 中,類具有封裝性和隱蔽性,類的資料成員一般都定義為私有成員,成員函式一般都定義為公有的,以此提供類與外界的通訊介面。但是,某些成員函式頻繁呼叫時,由於函式引數的傳遞 c 嚴格的型別檢查和安全性檢查將帶來時間的開銷,為了解決這個問題,c 提出了使用友元作為實現這一要求的輔助手段。友元不是類的成員...