C 友元函式 友元類

2021-10-18 22:03:06 字數 1509 閱讀 1670

友元是一種定義在類外部的普通函式或類,需要在類體內進行說明,為了與該類的成員函式加以區別,在說明時前面加以關鍵字friend。

友元提出的原因:

類具有封裝和資訊隱藏的特性。只有類的成員函式才能訪問類的私有成員,程式中的其他函式是無法訪問私有成員的。非成員函式可以訪問類中的公有成員,但是如果將資料成員都定義為公有的,這又破壞了隱藏的特性。另外,在某些情況下,特別是在對某些成員函式多次呼叫時,由於引數傳遞,型別檢查和安全性檢查等都需要時間開銷,而影響程式的執行效率。

友元函式不是成員函式,但是它可以訪問類中的私有成員。友元的作用在於提高程式的執行效率,但是破壞了類的封裝性和隱藏性,使得非成員函式可以訪問類的私有成員。不過,類的訪問許可權確實在某些應用場合顯得有些呆板,從而容忍了友元這一特別語法現象。

在定義乙個類的時候,可以把一些函式(包括全域性函式和其他類的成員函式)宣告為「友元」,這樣那些函式就成為該類的友元函式,在友元函式內部就可以訪問該類物件的私有成員了。友元函式在語法上與普通函式一樣,即在定義上和呼叫上與普通函式一樣。

函式宣告為友元函式的寫法:

將其他類的成員函式宣告為友元的寫法如下:

以**為例體會友元函式的使用:

#include

#include

using

namespace std;

class

position

;void

show()

friend

double

distance

(position a, position b)

;private

:double _x, _y;};

double

distance

(position a, position b)

intmain

(void

)

乙個類 a 可以將另乙個類 b 宣告為自己的友元,類 b 的所有成員函式就都可以訪問類 a 物件的所有成員。在類定義中宣告友元類的寫法如下:

#include

class

hospital

void

registration()

private

:int _price;

// 黃牛****

friend

class

scalper

;//宣告 scalper 為友元類};

class

scalper};

intmain()

程式執行結果:

第 12 行將 scalper 宣告為 hospital 的友元類。第 12行使得 scalper 類的所有成員函式都能訪問 hospital 物件的私有成員。如果沒有第 12 行,第 20 行對私有成員 price 的訪問就會導致編譯錯誤。

友元類注意事項:

友元關係不能被繼承。

友元 友元函式 友元類和友元成員函式 C

有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...

友元 友元函式 友元類和友元成員函式 C

有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...

C 友元 友元函式 友元類和友元成員函式

有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...