C 中的友元

2021-09-26 04:38:53 字數 2048 閱讀 8514

您知道,c++控制對類物件私有部分的訪問。通常,公有類方法提供唯一的訪問途徑,但是有時候這種限制太嚴格,以致於不適合特定的程式設計問題。在這種情況下,c++提供了另外一種形式的訪問許可權:友元。友元有3種:

通過讓函式成為類的友元,可以賦予該函式與類的成員函式相同的訪問許可權。下面介紹友元函式。

在前面的time類示例中,過載的乘法運算子與其他兩種過載運算子的差別在於,它使用了兩種不同的型別。也就是說,加法和減法運算子都結合兩個 time 值,而乘法運算子將乙個 time 值與乙個 double值結合在一起。這限制了該運算子的使用方式。記住,左側的運算元是呼叫物件。也就是說,下面的語句:

a = b *

2.75

;

將被轉換為下面的成員函式呼叫

a = b.

operator*(

2.75

);

但下面的語句又如何呢?

a =

2.75

* b;

從概念上說,2.75 * b應與b *2.75相同,但第乙個表示式不對應於成員函式,因為2.75不是time型別的物件。記住,左側的運算元應是呼叫物件,但2.75不是物件。因此,編譯器不能使用成員函式呼叫來替換該表示式。

有一種解決方式是使用非成員函式,非成員函式不是由物件呼叫的,它使用的所有值(包括物件)都是顯式引數。這樣,編譯器能夠將下面的表示式:

a =

2.75

* b;

與下面的非成員函式呼叫匹配:

a =

operator*(

2.75

, b)

;

該函式的原型如下:

time operator*(

double m,

const time & t)

使用非成員函式可以按所需的順序獲得運算元(先是 double,然後是 time),但引發了乙個新問題:非成員函式不能直接訪問類的私有資料,至少常規非成員函式不能訪問。然而,有一類特殊的非成員函式可以訪問類的私有成員,它們被稱為友元函式。

建立友元函式的第一步是將其原型放在類宣告中,並在原型宣告前加上關鍵字friend:

friend time operator*(

double m,

const time & t)

該原型意味著下面兩點:

雖然operator*( )函式是在類宣告中宣告的,但它不是成員函式,因此不能使用成員運算子來呼叫;

雖然operator*( )函式不是成員函式,但它與成員函式的訪問許可權相同。

第二步是編寫函式定義。因為它不是成員函式,所以不要使用 time::限定符。另外,不要在定義中使用關鍵字friend,定義應該如下:

time operator*(

double m,

const time & t)

有了上述宣告和定義後,下面的語句:

a =

2.75

* b;

將轉換為如下語句,從而呼叫剛才定義的非成員友元函式:

總之,類的友元函式是非成員函式,其訪問許可權與成員函式相同。

乍一看,您可能會認為友元違反了oop資料隱藏的原則,因為友元機制允許非成員函式訪問私有資料。然而,這個觀點太片面了。相反,應將友元函式看作類的擴充套件介面的組成部分。只有類宣告可以決定哪乙個函式是友元,因此類宣告仍然控制了哪些函式可以訪問私有資料。總之,類方法和友元只是表達類介面的兩種不同機制。

暫時沒有

C 中的 友元函式 友元類

1.友元函式的簡單介紹 1.1為什麼要使用友元函式 在實現類之間資料共享時,減少系統開銷,提高效率。如果類a中的函式要訪問類b中的成員 例如 智慧型指標類的實現 那麼類a中該函式要是類b的友元函式。具體來說 為了 使其他類的成員函式直接訪問該類的私有變數。即 允許外面的類或函式去訪問類的私有變數和保...

C 中的友元函式和友元

在c 中類具有封裝的隱蔽性,由於語言特性,只有成員函式才能訪問私有成員,非成員函式只能訪問類中的公有成員,可是有時候我們需要非成員函式呼叫私有成員,這個時候要是將私有成員定義為公有的又會破壞c 的封裝,為了解決上述問題,我們提出了友元的概念 友元分為友元函式和友元類,友元函式就是非成員函式可是當我們...

C 中的友元

乙個類的私有成員除了它的成員函式之外是不能被其他類或函式所訪問的。為了能構使其他類或函式能訪問類的私有成員,我們可以使其他類或函式成為該類的友元。如果想把乙個類或函式作為該類的友元,則只需在在該類或函式的宣告前加個friend,注意帶有friend的宣告必須在類的內部 如前言所述,要想將乙個函式宣告...