C 友元 簡述

2021-06-03 10:30:48 字數 3097 閱讀 9163

#include "windows.h"

#include "iostream.h"

class fb;

class fa

;void msg(fb & fb); //類的成員函式,其是類fb的友元函式

friend void msg2(fa & fa);

private:

char chmsg[64];

};void msg2(fa & argu)

;friend void fa::msg(fb & fb);

private:

char chcontext[64];

char chmsg[64];

};void fa::msg(fb & argu)

;wsprintf(tchmsgwin, "fb:%s---fb:%s", argu.chmsg, argu.chcontext);

messagebox(null, tchmsgwin, "c++友元", null);

cout<

void main()

友元函式說明如下:

1)必須在類的說明中說明友元函式,說明時以關鍵字friend開頭,後跟友元函式的函式原型,友元函式的說明可以出現在類的任何地方,包括在private和public部分; 但要清晰乙個概念:友元函式不屬於類,只是可以通過引數傳入類物件的引用,進而間接訪問類的私有成員罷了;函式內不能出現類的this指標。

2)注意友元函式不是類的成員函式,所以友元函式的實現和普通函式一樣,在實現時不用"::"指示屬於哪個類,只有成員函式才使用"::"作用域符號,類的成員函式作為其它類的友元函式時,實現時還是要遵守類一般成員函式的規約;

3)友元函式不能直接訪問類的成員,只能訪問物件成員, 類似於約束5)

4)友元函式可以訪問物件的保護、私有成員,但普通函式不行;

5)調用友元函式時,在實際引數中需要指出要訪問的物件,即上例中的「m_fa.msg(m_fb)」要訪問的物件就是 m_fb

6)乙個類的成員函式也可以是另乙個類的友元

7)過載一些操作符時友元函式作用非常明顯

c++提供一種允許外部類和函式訪問類的私有成員和保護成員的輔助方法,即將它們宣告為乙個給定類的友元(或友元函式),使其具有類成員函式的訪問許可權。但友元本身不是類的成員,它不屬於任何類。

友元函式是能訪問類的所有成員的普通函式,乙個函式可以是多個類的友元函式,只需在各個類中分別宣告。

將乙個函式宣告為某個類的友元函式的方法是在該類定義裡提供乙個以關鍵字friend開頭的函式原型,友元函式的定義,可以在類的內部或外部,友元函式雖然是在類內進行宣告,但它不是該類的成員函式,不屬於任何類,在類外定義友元函式時,與普通函式的定義一樣,不應在函式名前用類名加以限制,因此,友元函式不像成員函式那樣在呼叫時使用物件名,友元函式要對類的成員進行訪問,必須在參數列中顯式指明要訪問的物件。

c++不允許將建構函式、析構函式和虛函式宣告為友元函式。

友元函式是可以直接訪問類的私有成員的非成員函式。它是定義在類外的普通函式,它不屬於任何類,但需要在類的定義中加以宣告,宣告時只需在友元的名稱前加上關鍵字friend,其格式如下: friend 型別 函式名(形式引數); 友元函式的宣告可以放在類的私有部分,也可以放在公有部分,它們是沒有區別的,都說明是該類的乙個友元函式。 乙個函式可以是多個類的友元函式,只需要在各個類中分別宣告。 友元函式的呼叫與一般函式的呼叫方式和原理一致。

問題的提出

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

為了解決上述問題,提出一種使用友元的方案。友元是一種定義在類外部的普通函式,但它需要在類體內進行說明,為了與該類的成員函式加以區別,在說明時前面加以關鍵字friend。友元不是成員函式,但是它可以訪問類中的私有成員。友元的作用在於提高程式的執行效率,但是,它破壞了類的封裝性和隱藏性,使得非成員函式可以訪問類的私有成員。

友元可以是乙個函式,該函式被稱為友元函式;友元也可以是乙個類,該類被稱為友元類。

友元函式

友元函式的特點是能夠訪問類中的私有成員的非成員函式。友元函式從語法上看,它與普通函式一樣,即在定義上和呼叫上與普通函式一樣。下面舉一例子說明友元函式的應用。

#include

#include

class point

void getxy();

friend double distance(point &a, point &b);

private:

double x, y;

};void point::getxy()

double distance(point &a, point &b)

void main()

說明:在該程式中的point類中說明了乙個友元函式distance(),它在說明時前邊加friend關鍵字,標識它不是成員函式,而是友元函式。它的定義方法與普通函式定義一樣,而不同於成員函式的定義,因為它不需要指出所屬的類。但是,它可以引用類中的私有成員,函式體中a.x,b.x,a.y,b.y都是類的私有成員,它們是通過物件引用的。在調用友元函式時,也是同普通函式的呼叫一樣,不要像成員函式那樣呼叫。本例中,p1.getxy()和p2.getxy()這是成員函式的呼叫,要用物件來表示。而distance(p1,

p2)是友元函式的呼叫,它直接呼叫,不需要物件表示,它的引數是物件。(該程式的功能是已知兩點座標,求出兩點的距離。)

友元類友元除了前面講過的函式以外,友元還可以是類,即乙個類可以作另乙個類的友元。當乙個類作為另乙個類的友元時,這就意味著這個類的所有成員函式都是另乙個類的友元函式。

1、友元關係不具有傳遞性,如類b是類a的友元類,類c是類b的友元類,這並不意味著類c是類a的友元類;

2、友元關係是單向的,不具有對稱性(交換性),即類b是類a的友元,不能得出類a也是類b的友元,友元關係必須看到顯式的宣告;

3、當希望乙個類可以訪問另乙個類的私有成員時,可以將該類宣告為另乙個類的友元,友元類的所有成員函式都可視為該類的成員函式,能訪問該類的私有成員和保護成員;

4、友元關係不能被繼續;

5、友元類的格式:friend class 類名;

C 友元 簡述

include windows.h include iostream.h class fb class fa void msg fb fb 類的成員函式,其是類fb的友元函式 friend void msg2 fa fa private char chmsg 64 void msg2 fa argu...

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

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

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

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