友元是一種定義在類外部的普通函式或類,需要在類體內進行說明,為了與該類的成員函式加以區別,在說明時前面加以關鍵字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開始,它只能出現在類定義的內部,友...