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

2021-10-02 17:43:11 字數 2710 閱讀 7903

在c++中,類具有封裝性和隱蔽性,類的資料成員一般都定義為私有成員,成員函式一般都定義為公有的,以此提供類與外界的通訊介面。但是,某些成員函式頻繁呼叫時,由於函式引數的傳遞、c++嚴格的型別檢查和安全性檢查將帶來時間的開銷,為了解決這個問題,c++提出了使用友元作為實現這一要求的輔助手段。友元不是類的成員,但它可以訪問類的任何成員(包括私有成員)。宣告為友元的外界物件既可以是另乙個類的成員函式,也可以是不屬於任何類的一般的函式,稱之為友元函式;友元也可以是整個的乙個類,稱之為友元類。

友元函式是可以直接訪問類的私有成員的非成員函式。它是定義在類外的普通函式,它不屬於任何類,但需要在類的定義中加以宣告,宣告時只需在友元的名稱前加上關鍵字friend,其格式如下:

friend 型別 函式名(形式引數);

1、友元函式的定義與成員函式一樣,只是在類中用關鍵字friend予以說明。但友元函式是乙個普通的函式,它不是本類的成員函式,因此在呼叫時不能通過物件呼叫。也沒有this指標。

2、友元函式也可以在類內宣告,在類外定義。

3、友元函式對類成員的訪問與成員函式一樣,可以直接訪問類的任何訪問控制屬性的成員;可通過物件訪問形參、函式體中該類型別物件的所有成員。

4、private、protected、public訪問許可權與友員函式的宣告無關,因此原則上,友元函式宣告可以放在類體中任意部分,但為程式清晰,一般放在類體的後面。

5、使用友元成員的好處是兩個類可以某種方式相互合作、協同工作,共同完成某一任務。

演示1、不屬於任何類的一般的函式宣告為友元:

#

include

"cmath"

#include

"iostream"

using

namespace std;

class

point

void

getxy()

;friend

double

distance

(point &a, point &b)

;protected

:private

:double x, y;};

void

point

::getxy()

double

distance

(point &a, point &b)

//前面不能加作用域point::

intmain

(void

)

說明:在該程式中的point類中說明了乙個友元函式distance(),它在說明時前邊加friend關鍵字,標識它不是成員函式,而是友元函式。它的定義方法與普通函式定義一樣,而不同於成員函式的定義,因為它不需要指出所屬的類。但是,它可以引用類中的私有成員,函式體中的a.x,b.x,a.y,b.y都是類的私有成員,它們是通過物件引用的。在調用友元函式時,也是同普通函式的呼叫一樣,不要像成員函式那樣呼叫。

2、類成員函式宣告為友元示例:

classa;

//注意前向引用宣告

classb;

class

a;

說明:因為你要類成員函式作為友元,你在宣告友元的時候要用類限定符,所以必須先定義包含友元函式的類,但是在定義友元的函式時候,又必須事先定義原始類。通常的做法先定義包含友元函式的類,再定義原始類,這個順序不能亂。

友元除可以是函式外,還可以是類,如果乙個類宣告為另乙個類的友元,則該類稱為另乙個類的友元類。若a類為b類的友元類,則a類的所有成員函式都是b類的友元函式,都可以訪問b類的任何資料成員。 友元類的宣告是在類名之前加上關鍵字friend來實現。

1、友元類演示:

#

include

"iostream"

using

namespace std;

class

circle

;//注意前向引用宣告

class

point

public

:point

(double xx =0,

double yy =0)

void

getxy()

friend

class

circle;}

;class

circle

point get_top()

};intmain

(void

)//執行結果:

//(3.4,5.6)

//(3.4,7.7)

2、友元關係具有以下性質:

a、友元關係是不能傳遞的,b類是a類的友元,c類是b類的友元,c類和a類之間,如果沒有宣告,就沒有任何友元關係,不能進行資料共享。

b、友元關係是單向的,如果宣告b類是a類的友元,b類的成員函式就可以訪問a類的私有和保護資料,但a類的成員函式卻不能訪問b類的私有和保護資料。

c、友元不能被繼承,b是a的友元類,c是b的子類,不能因此得出c是a的友元。

1、友元概念的引入,提高了資料的共享性,加強了函式與函式之間,類與類之間的相互聯絡,大大提高程式的效率,這是友元的優點,但友元也破壞了資料隱蔽和資料封裝,導致程式的可維護性變差,給程式的重用和擴充埋下了深深的隱患,這是友元的缺點。

2、對友元的使用必須慎重,要具體問題具體分析,在提高效率和增加共享之間把握好乙個「度」,在共享和封裝之間進行恰當的折衷平衡。

friend 友元函式友元類

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

友元函式 friend

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

友元函式 friend

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