友元在類中的使用
阿新 • • 發佈:2018-07-03
實現 而是 pub 友元類 調用 訪問 define .... 很多 友元在類中的使用一般分為兩種:
(1) 友元類
(2) 友元函數
(1) 友元類
(2) 友元函數
關於友元類:
友元類的使用和聲明極為簡單,只需在需要訪問的類中加上friend class Classname 即可 。這樣被聲明的友元類即可訪問聲明處的類的所有成員,
同時聲明的位置不限只需要在類中即可。
// Tv 是一個類,而Remote則是Tv的遙控器,很顯然Remote需要使用Tv // 中的數據進行操作,此時可聲明為友元類。 #ifndef TV_H_ #define TV_H_ class Tv{ private: int state ; int volume ; int maxchannel ; int channel ; int mode ; int input ; public: class friend Remote ; // 聲明友元類 ,Remote類可以直接訪問Tv類的成員 // 在類中任何地方聲明皆可 statements ; };
關於友元函數:
實際上在大多數情況下,類中的數據交互只在幾個函數間,太多的數據交互反而增加了錯誤的可能;所以在只有少量的數據交互時,不需要聲明友元類,使用友元函數就可以了。
(1) 友元函數作為類的成員
還是以之前的Tv與Remote為例:
如果說很多關於Tv本身的操作都被封裝成了函數,外部的Remote類只需要
調用其函數就可以改變Tv的狀態,且只有少部分數據需要同外界的類直接
交互。那麽,這時最好的方式就是使用為類成員的友元函數。
class Tv { private: int state ; int volume ; int maxchannel ; int channel ; int mode ; int input ; public: friend void Remote::set_channel(Tv & tv , int c) ; // 聲明友元函數,這個函數是Remote類的成員 // 在聲明後Remote類可以直接通過set_channel函數進行操作 // 而不需要使用友元類 statements of funcs in the Tv class ; }
但註意這裏會遇到一個聲明順序的問題!
由於在tv類中有著remote類的一個具體實現的函數聲明,故而關於
remote類的聲明需要放在tv類的前面!同時tv類需要預聲明:
class Tv ;
class Remote { ...... } ;
class Tv{ ...... } ;
(2) 友元函數作為普通函數
在部分情況下,數據間的共享或者同步,不是發生在類間的,
而是通過使用外部的函數進行。那麽則是需要使用,普通函數作為
友元函數。
在需要同步或共享的類的類中聲明普通函數的友元,在普通函數實現
數據的同步與共享,猶如一個第三方的接口。
友元在類中的使用