友元函式 友元類 友元成員函式

2021-08-19 19:00:28 字數 1667 閱讀 5761

一般來說,類內的私有資料是對外不可見的,但在有些情況下,我們需要在類外對該類的私有資料進行訪問,這就需要用到一種新技術——友元(friend),即在宣告前新增關鍵字friend

友元關係是單向的,即如果a是b的友元,但b不一定是a的友元;

友元關係無傳遞性,即如果a是b的友元,b是c的友元,但a不一定是c的友元。

友元函式是指某些非類成員函式,但可以訪問類內的私有資料。

#include 

using

namespace

std;

class a

friend

void show( const a& t ); //新增friend定義友元函式

};

/* 友元函式在類外宣告時不加friend */

void show( const a& t )

int main(void)

/*執行結果:

data = 1

*/

友元類是指若需要在類b中直接訪問類a的私有資料,因此將b作為a的友元(在a中宣告friend class b;)。

友元類中的成員函式、私有資料都可以在另乙個類中被使用(即類b中可以直接使用類a的私有資料等)

class tv ;

tv( int s = off ) : state(s) {}

void onoff()

};class remote

};

友元成員函式是指類中的乙個成員函式被定義為友元函式。

與友元類不同的是,只有友元成員函式可以在另乙個中被使用,其餘函式都不可以。

#include 

using

namespace

std;

class b; //前向宣告

class a

void print( b & b );

};/* 示例位置1 */

class b

void print()

friend

void a::print( b & b ); //友元成員函式

};/* 被定義為友元成員函式的函式必須在類外(另乙個使用該函式的類後面)定義 */

void a::print( b & b )

int main()

/*輸出結果:

b = 6

*/

需要注意的是:

(1)類的前向宣告。由於在a中的print函式需要使用b,如果不進行b的前向宣告,編譯器就不知道b是乙個類,會報錯。

(2)類的排列順序。在類b中會用到a的方法print(),因此需要先定義a,再定義b。

(3)友元成員函式的定義位置。友元成員函式不能使用內聯**,類中只能有函式宣告。函式定義需要放到類之後,在類外進行定義,而且必須放到另乙個類定義的後面。(對上面**來說,若將a::print()的定義放在類b定義之前——示例位置1處,也會報錯,提示類b未完成)

對於友元的位置在何處生明,可以簡單記為friend在哪,哪個就可以被外面直接訪問。(friend在類a,a就可以被其他特定位置訪問)

友元函式 友元類 友元成員函式

注意友元成員函式定義的3個步驟 include include include using namespace std class a class c class a class b void c display const a a 3.最後定義display,此時才可以使用a的私有成員 void ...

友元函式 友元類 友元成員函式

有些情況下,允許非成員函式訪問類中的私有成員,但又阻止一般的訪問,這種情況,就需要用到友元。使用friend宣告友元,友元的定義只能在類的內部 有些情況下,全域性函式需要訪問類中的私有成員,這種函式叫友元函式 如 客人可以訪問客廳,但一般客人不可以去主人臥室,關係較好的朋友才能訪問私有的臥室,這時就...

友元函式,友元類,友元成員函式

一 友元函式 class a1private int i void k a1 a 上面這段 當中,由於函式k想訪問類a1的成員變數i,但是由於i是private屬性,所以編譯不能通過。解決辦法 class a1friend void k a1 a private int i void k a1 a ...