采用類的機制后實現(xiàn)了數(shù)據(jù)的隱藏與封裝,類的數(shù)據(jù)成員一般定義為私有成員弹砚,成員函數(shù)一般定義為公有的拙绊,依此提供類與外界間的通信接口向图。但是,有時需要定義一些函數(shù)标沪,這些函數(shù)不是類的一部分榄攀,但又需要頻繁地訪問類的數(shù)據(jù)成員,這時可以將這些函數(shù)定義為該函數(shù)的友元函數(shù)谨娜。除了友元函數(shù)外航攒,還有友元類,兩者統(tǒng)稱為友元趴梢。友元的作用是提高了程序的運行效率(即減少了類型檢查和安全性檢查等都需要時間開銷)漠畜,但它破壞了類的封裝性和隱藏性,使得非成員函數(shù)可以訪問類的私有成員坞靶。
友元函數(shù):
友元函數(shù)是可以直接訪問類的私有成員的非成員函數(shù)憔狞。它是定義在類外的普通函數(shù),它不屬于任何類彰阴,但需要在類的定義中加以聲明瘾敢,聲明時只需在友元的名稱前加上關鍵字friend,其格式如下:
friend 類型 函數(shù)名(形式參數(shù));
友元函數(shù)的聲明可以放在類的私有部分尿这,也可以放在公有部分簇抵,它們是沒有區(qū)別的,都說明是該類的一個友元函數(shù)射众。
一個函數(shù)可以是多個類的友元函數(shù)碟摆,只需要在各個類中分別聲明。
友元函數(shù)的調(diào)用與一般函數(shù)的調(diào)用方式和原理一致叨橱。
友元類:
友元類的所有成員函數(shù)都是另一個類的友元函數(shù)典蜕,都可以訪問另一個類中的隱藏信息(包括私有成員和保護成員)断盛。當希望一個類可以存取另一個類的私有成員時,可以將該類聲明為另一類的友元類愉舔。定義友元類的語句格式如下:
friend class 類名;
其中:friend和class是關鍵字钢猛,類名必須是程序中的一個已定義過的類。
例如轩缤,以下語句說明類B是類A的友元類:
class A
{
…
public:
friend class B;
…
};
經(jīng)過以上說明后命迈,類B的所有成員函數(shù)都是類A的友元函數(shù),能存取類A的私有成員和保護成員典奉。
使用友元類時注意:
- 友元關系不能被繼承躺翻。
- 友元關系是單向的,不具有交換性卫玖。
若類B是類A的友元,類A不一定是類B的友元踊淳,要看在類中是否有相應的聲明假瞬。 - 友元關系不具有傳遞性。
若類B是類A的友元迂尝,類C是B的友元脱茉,類C不一定是類A的友元,同樣要看類中是否有相應的申明