爲何要使用友元函數?
- 在實現類之間數據共享時,減小系統開銷,提升效率
- 若是類A中的函數要訪問類B中的成員(例如:智能指針類的實現),那麼類A中該函數要是類B的友元函數
- 爲了使其餘類的成員函數直接訪問該類的私有變量。即:容許外面的類或函數去訪問類的私有變量和保護變量,從而使兩個類共享同一函數。此時可以使用友元類
友元函數是全局函數仍是類的成員函數
哪些狀況下使用友元函數
- 運算符重載的某些場合須要使用友元(由於運算符要訪問類中的成員變量)
- 兩個類要共享數據的時候。
友元函數的優缺點
- 優勢:可以提升效率,表達簡單、清晰。
- 缺點:友元函數破環了封裝機制,咱們應儘可能使用成員函數,除非不得已的狀況下才使用友元函數。
友元函數的參數:
由於友元函數沒有this指針,參數要有三種狀況:函數
- 要訪問非static成員時,須要對象作參數;
- 要訪問static成員或全局變量時,則不須要對象作參數;
- 若是作參數的對象是全局對象,則不須要對象作參數;
在類中什麼位置聲明友元函數?
- 由於友元函數是類外的函數,因此它的聲明能夠放在類的私有段或公有段且沒有區別。
如何調用友元函數
友元函數分爲哪幾種?
說說普通友元函數
- 目的:使普通函數可以訪問類的私有成員
- 聲明: friend + 普通函數聲明
- 位置:能夠在類外或類中
- 代碼:與普通函數相同
- 調用:相似普通函數,直接調用
- 舉例
class INTEGER
{
friend void Print(const INTEGER& obj);//聲明友元函數
};
void Print(const INTEGER& obj)
{
//函數體
}
void main()
{
INTEGER obj;
Print(obj);//直接調用
}
這裏說的普通函數是指全局函數this
說說友元類
class girl;
class girl{
private:
char *name;
int age;
friend boy; //聲明類boy是類girl的友元
};
class boy{
public:
void disp(girl &);
};
void boy::disp(girl &x) //函數disp()爲類boy的成員函數,也是類girl的友元函數
{
//藉助友元,在boy的成員函數disp中,藉助girl的對象,直接訪問girl的私有變量
cout<<"girl's name is:"<<x.name<<",age:"<<x.age<<endl;
}
簡單說說成員友元函數
- 類Y的一個成員函數爲類X的友元函數
- 目的:使類Y的一個成員函數成爲類X的友元,具體而言:在類Y的這個成員函數中,藉助參數X,能夠直接使用X的私有變量
- 語法:聲明位置:聲明在公有中 (自己爲函數)
- 聲明:friend + 成員函數的聲明
- 調用:先定義Y的對象y---使用y調用本身的成員函數---本身的成員函數中使用了友元機制
- 舉例
-- 實現代碼和2.4.2.3中的實現及其類似只是設置友元的時候變爲friend void boy::disp(girl &);本身解決嘍……
小結:其實一些操做符的重載實現也是要在類外實現的,那麼一般這樣的話,聲明爲類的友元是必須滴。指針
友元函數和類的成員函數的區別
- 成員函數有this指針,而友元函數沒有this指針。
- 友元函數是不能被繼承的,就像父親的朋友未必是兒子的朋友。