友元對於新手不是非常友好,簡單的友元比較好理解,就是我此外部函數可以訪問類內的私有成員,如class A中包含一個友元函數,func(A &a,int b)。但是比較難理解的是類的友元,類A是類B的友元,而類B又是類A的友元,那麼就會感覺很煩躁。很難理解了。但是仔細瞭解友元后,就會發現,其實友元並不可怕,而且可以提高公共接口的靈活性。
比如下面的兩個類電視機Tv和遙控器Remote類,兩個類並不存在包含和繼承關係,當然一種更高明的方法是把電視機和遙控器都當做組件,組成電視系統,這樣兩者就有關係了。但是這裏不考慮這種方式,通過友元的方式來實現兩個類之間的通信關係。
#include <iostream>
using namespace std;
class Remote;
class Tv
{
friend class Remote;
public:
Tv();
~Tv();
void TvOnOrOff();
private:
bool m_bTvOpenStatus;
};
Tv::Tv()
{
m_bTvOpenStatus = false;
}
void Tv::TvOnOrOff()
{
m_bTvOpenStatus = m_bTvOpenStatus == true ? false : true;
}
Tv::~Tv()
{
}
class Remote
{
public:
Remote();
~Remote();
void RemoteOnOrOff(Tv &tv);
private:
};
Remote::Remote()
{
}
Remote::~Remote()
{
}
void Remote::RemoteOnOrOff(Tv &tv)
{
tv.m_bTvOpenStatus = tv.m_bTvOpenStatus == true ? false : true;
}
int main()
{
return 1;
}
//錯誤代碼
class TestErr
{
public:
TestErr();
~TestErr();
void TestErrOnOrOff(Tv &tv);
private:
};
TestErr::TestErr()
{
}
TestErr::~TestErr()
{
}
void TestErr::TestErrOnOrOff(Tv &tv)
{
tv.m_bTvOpenStatus = tv.m_bTvOpenStatus == true ? false : true;
}
可以看出,想作爲友元函數或者友元類也不是沒有什麼要求的,必須要求將類的引用傳入進去,纔可以訪問此類的私有成員。經過這個操作就可以看出友元函數和普通的函數的區別。
如上方的兩者類Tv是Remote的友元,而Remote也是Tv的友元,那麼會不會更復雜那,可能第一次看就會有點懵。但是隻要記住一點,友元類也不是隨意訪問本類的私有成員的,友元類的函數必須有傳入本類的引用纔可以使用私有成員。
嵌套類是指在某個類內部創建的類,嵌套類的訪問權限收到本類的控制,如果是private則就是私有類。