C++深入理解(10)------友元詳解(讀書筆記)

        友元對於新手不是非常友好,簡單的友元比較好理解,就是我此外部函數可以訪問類內的私有成員,如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則就是私有類。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章