c++中的友元為封裝隱藏這堵不透明的牆開了乙個小孔,外界可以通過這個小孔窺視內部的秘密。
友元的正確使用能提高程式的執行效率,但同時也破壞了類的封裝性和資料的隱藏性,導致程式可維護性變差。
友元函式需要在類的定義中加以宣告,宣告時只需在友元的名稱前加上關鍵字friend,其格式如下:
friend 型別 函式名(形式引數);
注意事項:
友元函式是可以直接訪問類的私有成員的非成員函式。它是定義在類外的普通函式,它不屬於任何類
友元函式的宣告可以放在類的私有部分,也可以放在公有部分,它們是沒有區別的,都說明是該類的乙個友元函式
乙個函式可以是多個類的友元函式,只需要在各個類中分別宣告
友元函式的呼叫與一般函式的呼叫方式和原理一致。
乙個類 a 可以將另乙個類 b 宣告為自己的友元,類 b 的所有成員函式就都可以訪問類 a 物件的私有成員。
class ccar
;class cdriver
};int main()
第 5 行將 cdriver 宣告為 ccar 的友元類。這條語句本來就是在宣告 cdriver 是乙個類,所以 ccar 類定義前面就不用宣告 cdriver 類了。第 5 行使得 cdriver 類的所有成員函式都能訪問 ccar 物件的私有成員。如果沒有第 5 行,第 13 行對 mycar 私有成員 price 的訪問就會導致編譯錯誤。
一般來說,類 a 將類 b 宣告為友元類,則類 b 最好從邏輯上和類 a 有比較接近的關係。例如上面的例子,cdriver 代表司機,ccar 代表車,司機擁有車,所以 cdriver 類和 ccar 類從邏輯上來講關係比較密切,把 cdriver 類宣告為 ccar 類的友元比較合理。
注意事項:
(1)友元關係不能被繼承。
(2) 友元關係是單向的,不具有交換性。若類b是類a的友元,類a不一定是類b的友元,要看在類中是否有相應的宣告。
(3) 友元關係不具有傳遞性。若類b是類a的友元,類c是b的友元,類c不一定是類a的友元,同樣要看類中是否有相應的申明
友元 友元函式 友元類和友元成員函式 C
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...
友元 友元函式 友元類和友元成員函式 C
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...
C 友元 友元函式 友元類和友元成員函式
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...