1.友元函式的簡單介紹
1.1為什麼要使用友元函式
在實現類之間資料共享時,減少系統開銷,提高效率。如果類a中的函式要訪問類b中的成員(例如:智慧型指標類的實現),那麼類a中該函式要是類b的友元函式。
具體來說:為了使其他類的成員函式直接訪問該類的私有變數。即:允許外面的類或函式去訪問類的私有變數和保護變數,從而使兩個類共享同一函式。
實際上具體大概有下面兩種情況需要使用友元函式:(1)運算子過載的某些場合需要使用友元。(2)兩個類要共享資料的時候。
1.2使用友元函式的優缺點
優點:能夠提高效率,表達簡單、清晰。
缺點:友元函式破環了封裝機制,盡量不使用成員函式,除非不得已的情況下才使用友元函式。
2.友元函式的使用
2.1友元函式的引數:
因為友元函式沒有this指標,則引數要有三種情況:
要訪問非static成員時,需要物件做引數;
要訪問static成員或全域性變數時,則不需要物件做引數;
如果做引數的物件是全域性物件,則不需要物件做引數;
2.2友元函式的位置
因為友元函式是類外的函式,所以它的宣告可以放在類的私有段或公有段且沒有區別。
2.3友元函式的呼叫
可以直接調用友元函式,不需要通過物件或指標
2.4友元函式的分類:
根據這個函式的**不同,可以分為三種方法:
普通函式友元函式:
目的:使普通函式能夠訪問類的友元
語法:宣告: friend + 普通函式宣告
實現位置:可以在類外或類中
實現**:與普通函式相同
呼叫:類似普通函式,直接呼叫
**:
class
integer
;void
print
(const integer& obj)
void
main()
類y的所有成員函式都為類x友元函式—友元類
目的:使用單個宣告使y類的所有函式成為類x的友元,它提供一種類之間合作的一種方式,使類y的物件可以具有類x和類y的功能。
語法:宣告位置:公有私有均可,常寫為私有(把類看成乙個變數)
宣告: friend + 類名(不是物件哦)
**:
class
girl
;class
boy;
void boy::
disp
(girl &x)
//函式disp()為類boy的成員函式,也是類girl的友元函式
class
girl
;
main函式就不寫了和普通呼叫時一樣的。
類y的乙個成員函式為類x的友元函式
目的:使類y的乙個成員函式成為類x的友元,具體而言:在類y的這個成員函式中,借助引數x,可以直接以x的私有變數
語法:宣告位置:宣告在公有中 (本身為函式)
宣告:friend + 成員函式的宣告
呼叫:先定義y的物件y—使用y呼叫自己的成員函式—自己的成員函式中使用了友元機制
**:實現**和2.4.2.3中的實現及其相似只是設定友元的時候變為friend void boy::disp(girl &);
小結:其實一些操作符的過載實現也是要在類外實現的,那麼通常這樣的話,宣告為類的友元是必須滴。
4.友元函式和類的成員函式的區別
4.1 成員函式有this指標,而友元函式沒有this指標。
4.2 友元函式是不能被繼承的,就像父親的朋友未必是兒子的朋友。
注意:1.類中通過使用關鍵字friend 來修飾友元函式,但該函式並不是類的成員函式,其宣告可以放在類的私有部分,也可放在共有部分。友元函式的定義在類體外實現,不需要加類限定。
2.乙個類中的成員函式可以是另外乙個類的友元函式,而且乙個函式可以是多個類友元函式。
3.友元函式可以訪問類中的私有成員和其他資料,但是訪問不可直接使用資料成員,需要通過對物件進行引用。
4.友元函式在呼叫上同一般函式一樣,不必通過對物件進行引用。
例如如下形式:這裡解釋上面的1,3,4要點的使用,加以理解。
#include
#include
using
namespace std;
class
persion
;persion::
persion
(char
*pn)
//建構函式
void persion::
disp()
//友元函式的具體實現:這裡沒有類限定例如 (perion::setweigth)這種形式,這裡可以與上面的disp()做個對比,乙個屬於類的成員,有限定,不屬於類的成員函式,沒有加限定。
void
setweigth
(persion &pn,
int w)
void
main()
關於要點2的使用,我給出一段**案例:
#include
#include
using
namespace std;
class
wheel
;class
car;
car::
car(
char
*pn)
class
wheel
;wheel::
wheel
(int s)
intmain
(int argc,
char
const
*ar**)
void car::
run(wheel &w)
//car類成員函式的實現
另外:
1.c++中引入友元函式,是為在該類中提供乙個對外(除了他自己意外)訪問的視窗;
2.這個友元函式他不屬於該類的成員函式,他是定義在類外的普通函式,只是在類中宣告該函式可以直接訪問類中的private或者protected成員。
3.將資料和處理資料的函式封裝在一起,構成類,實現了資料的隱藏,無疑是物件導向程式設計的一大優點。但是有時候封裝不是絕對的。
4.友元函式提供了不同類或物件的成員函式之間、類的成員函式和一般函式之間進行資料共享的機制。通俗的說,友元關係就是乙個類主動宣告哪些類或函式是它的朋友,進而給它們提供對本類的訪問特性。也就是說,通過友元關係,乙個普通函式或者類的成員函式可以訪問封裝於另外乙個類中的資料。
5.從一定程度上講,友元是對資料隱藏和封裝的破壞,但是為了資料共享,提高程式的效率和可讀性,很多情況下這種小的破壞是必要的。
6.在乙個類中,利用關鍵字friend將其它函式或類宣告為友元。如果友元是一般函式或類的成員函式,稱為友元函式。如果友元是乙個類,則稱為友元類。友元類的所有成員函式都自動稱為友元函式。
C 友元函式 友元類 友元成員函式
眾所周知,c 控制對類物件私有部分的訪問。通常,公有類方法提供唯一的訪問途徑,但是有時候這種限制太嚴格,以至於不適合特定的程式設計問題。在這種情況下,c 提供了另外一種形式的訪問許可權 友元,友元有3種 友元函式 友元類 友元成員函式。通過讓函式成為類的友元 即 友元函式 可以賦予該函式與類的成員函...
友元 友元函式 友元類和友元成員函式 C
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...
友元 友元函式 友元類和友元成員函式 C
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...