友元提供了不同類的成員函式之間、類的成員函式與一般函式之間進行資料共享的機制。通過友元,乙個不同函式或另乙個類中的成員函式可以訪問類中的私有成員和保護成員。c++中的友元為封裝隱藏這堵不透明的牆開了乙個小孔,外界可以通過這個小孔窺視內部的秘密。
友元的正確使用能提高程式的執行效率,但同時也破壞了類的封裝性和資料的隱藏性,導致程式可維護性變差。
友元函式:
友元函式是可以直接訪問類的私有成員的非成員函式。它是定義在類外的普通函式,它不屬於任何類,但需要在類的定義中加以宣告,宣告時只需在友元的名稱前加上關鍵字friend,其格式如下:
friend 型別 函式名
(形式引數);
友元函式的宣告可以放在類的私有部分,也可以放在公有部分,它們是沒有區別的,都說明是該類的乙個友元函式。
乙個函式可以是多個類的友元函式,只需要在各個類中分別宣告。
友元函式的呼叫與一般函式的呼叫方式和原理一致。
友元類:
友元類的所有成員函式都是另乙個類的友元函式,都可以訪問另乙個類中的隱藏資訊(包括私有成員和保護成員)。
當希望乙個類可以訪問另乙個類的私有成員時,可以將該類宣告為另一類的友元類。定義友元類的語句格式如下:
friend class 類名;
其中:friend和
class
是關鍵字,類名必須是程式中的乙個已定義過的類。
1: #include
2: using namespace std;
3:
4: class radius
5:
13: ~radius()
14:
16:
17: private:
18: int r;
19: };
20:
21: void show_r(radius &n)
22:
25:
26: class circle
27:
30: ~circle(){}
31: double area(radius a)
32:
36: private:
37: double s;
38: };
39:
40: int main(int argc, char *argv)
41:
被宣告兩個類的友元宣告
如果我們決定乙個函式必須被宣告為兩個類的友元則友元宣告如下
1: class window; // 只宣告
2:
3: class screen
4:
5: ;
12:
13: class window
14:
15: ;
作為乙個類的函式又是另乙個類的友元
如果我們決定該函式必須作為乙個類的成員函式並又是另乙個類的友元,則成員函式宣告和友元宣告如下:
1: class window;
2:
3: class screen
4:
5: ;
16:
17: class window
18:
19: ;
只有當乙個類的定義已經被看到時它的成員函式才能被宣告為另乙個類的友元。這並不總是能夠做到的。
例如如果screen 類必須把
window
類的成員函式宣告為友元,而
window
類必須把
screen
類的成員函式宣告為友元。該怎麼辦呢?在這種情況下可以把整個
window
類宣告為
screen
類的友元。
例如:1: class window;
2:
3: class screen
4:
5: ;
screen 類的非公有成員現在可以被
window
的每個成員函式訪問。
使用友元類時注意:
(1) 友元關係不能被繼承。
(2) 友元關係是單向的,不具有交換性。若類b是類
a的友元,類
a不一定是類
b的友元,要看在類中是否有相應的宣告。
(3) 友元關係不具有傳遞性。若類b是類
a的友元,類c是
b的友元,類
c不一定是類
a的友元,同樣要看類中是否有相應的申明
友元 友元函式 友元類和友元成員函式 C
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...
友元 友元函式 友元類和友元成員函式 C
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...
C 友元 友元函式 友元類和友元成員函式
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...