C++中友元的理解
阿新 • • 發佈:2018-12-27
1.友元成員函式
先上程式碼
#include <iostream>class B;//由於類B的定義在類A之後,所以用到類B的宣告時,使用前向宣告
class A{
private:
void func()
{
std::cout << "A::func()" << std::endl;
}
public:
void call_func_of_B(B &b);//可以使用類B定義指標,引用,物件,因為上文有前向宣告
};
class B{
private:
void func()
{
std::cout << "B::func()" << std::endl;
}
friend void A::call_func_of_B(B &b);//友元宣告將類A的成員函式宣告為類B的友元函式
};
//定義類A成員函式
void A::call_func_of_B(B &b)
{
b.func();
}
//友元函式,將A類中的成員函式申明為B類中的友元函式,則此成員函式不僅擁有A類的所有變數的訪問許可權,而且擁有了B類的的有成員變數的訪問權。
同理,我們也可以將類B的成員函式宣告為類A的友元函式,則此成員函式同樣擁有了兩個類所有成員變數的訪問權。
2.友元類
友元除了前面講過的函式以外,友元還可以是類,即一個類可以作另一個類的友元。當一個類作為另一個類的友元時,這就意味著這個類的所有成員函式都是另一個類的友元函式。
使用友元類時注意:
(1) 友元關係不能被繼承。
(2) 友元關係是單向的,不具有交換性。若類B是類A的友元,類A不一定是類B的友元,要看在類中是否有相應的宣告。
(3) 友元關係不具有傳遞性。若類B是類A的友元,類C是B的友元,類C不一定是類A的友元,同樣要看類中是否有相應的申明
總結起來:
(1)友元關係不可以繼承,但對已有的方法來說訪問許可權不改變。
(2)如果改寫基類的方法則訪問許可權改變
(3)友元關係不具有傳遞性
若類B是類A的友元,類C是B的友元,類C不一定是類A的友元。
#include <iostream>
using namespace std;
class CObj
{
public:
CObj() : mX(0), mY(0) {}
friend class CFriend; //類CFriend 申明為CObj的友元,
private:
void PrintData() const
{
cout << "mX = " << mX << endl
<< "mY = " << mY << endl;
}
int mX;
int mY;
};
class CFriend
{
public:
CFriend(int x, int y)
{
mObj.mX = x; //直接呼叫類CObj的私有資料成員
mObj.mY = y;
}
void ShowData() const
{
mObj.PrintData(); //直接呼叫類CObj的私有成員函式
}
private:
CObj mObj;
};
int main()
{
CFriend one(3, 4);
one.ShowData();
return 0;
}
執行結果:
mX = 3
mY = 4
//如上,在類CObj中,類CFriend 申明為CObj的友元,則在類CFriend中能直接訪問類CObj,中的所有成員,包括成員變,成員函式,私有的也可以。。