關於C 中的friend友元函式的總結

2021-09-02 19:10:23 字數 3553 閱讀 7670

1.1為什麼要使用友元函式

在實現類之間資料共享時,減少系統開銷,提高效率。如果類a中的函式要訪問類b中的成員(例如:智慧型指標類的實現),那麼類a中該函式要是類b的友元函式。

具體來說:為了使其他類的成員函式直接訪問該類的私有變數。即:允許外面的類或函式去訪問類的私有變數和保護變數,從而使兩個類共享同一函式。

實際上具體大概有下面兩種情況需要使用友元函式:(1)運算子過載的某些場合需要使用友元。(2)兩個類要共享資料的時候。

1.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.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

*argv)

void car:

:run

(wheel &w)

//car類成員函式的實現

另外:

c++中引入友元函式,是為在該類中提供乙個對外(除了他自己意外)訪問的視窗;

這個友元函式他不屬於該類的成員函式,他是定義在類外的普通函式,只是在類中宣告該函式可以直接訪問類中的private或者protected成員。

將資料和處理資料的函式封裝在一起,構成類,實現了資料的隱藏,無疑是物件導向程式設計的一大優點。但是有時候封裝不是絕對的。

友元函式提供了不同類或物件的成員函式之間、類的成員函式和一般函式之間進行資料共享的機制。通俗的說,友元關係就是乙個類主動宣告哪些類或函式是它的朋友,進而給它們提供對本類的訪問特性。也就是說,通過友元關係,乙個普通函式或者類的成員函式可以訪問封裝於另外乙個類中的資料。

從一定程度上講,友元是對資料隱藏和封裝的破壞,但是為了資料共享,提高程式的效率和可讀性,很多情況下這種小的破壞是必要的。

在乙個類中,利用關鍵字friend將其它函式或類宣告為友元。如果友元是一般函式或類的成員函式,稱為友元函式。如果友元是乙個類,則稱為友元類。友元類的所有成員函式都自動稱為友元函式。

更多參考 一、二、三

C 中的友元函式friend

class int 友元函式的定義 void print const int obj int obj print obj 直接調用友元函式,不需要使用物件或者指標!下面例項是友元類的使用,詳細見下面的例項 class box 成員函式的定義 void box setwidth double wid ...

友元函式 friend

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

友元函式 friend

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