C 友元函式和友元類學習

2021-10-02 23:54:16 字數 1111 閱讀 1940

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開始,它只能出現在類定義的內部,友...