友元:假設A中聲明瞭B是我的朋友,則在B內就可以使用了我(A)的一切數據,包括private類型數據。
友元的出現破壞了類的封裝和隱藏性。
C++中的友元分爲:友元函數和友元類
1. 友元函數:
在類中聲明,在類外定義:
class A
{
public: A(int i):m_i(i){}
private:
friend void print(Aa);
int m_i;
};
void print(A a)
{
cout<<a.m_i<<endl;
}
也可以在類中定義:
class A
{
public: A(int i):m_i(i){}
private:
friend void print(Aa)
{
cout<<a.m_i<<endl;
//cout<<m_i<<endl; error
}
int m_i;
};
注意:
1> 友元函數只是普通的外部函數,它不屬於任何類。所以即使在類內定義它也不能直接訪問類中的東西,必須通過對象訪問。
2> 友元函數在類中的位置是任意的。在private和在public是沒有區別的。
2. 友元類
當類A中聲明類B是我的友元時,則在類B內,所有成員函數都是類A的友元函數,也就是說所有成員函數都可以訪問類A的一切資料。(同理通過A的對象訪問)
class A
{
public: A(int i):m_i(i){}
private:
friend class B;
int m_i;
};
class B
{
public:
void print(constA& a)
{
cout<<a.m_i<<endl;
}
};
需要注意的幾點:
(1) 友元關係不能被繼承。
(2) 友元關係是單向的,不具有交換性。若類B是類A的友元,類A不一定是類B的友元,要看在類中是否有相應的聲明。
(3) 友元關係不具有傳遞性。若類B是類A的友元,類C是B的友元,類C不一定是類A的友元,同樣要看類中是否有相應的申明
其實友元就可以翻譯成朋友更好理解。同英語friend。