=======================什麼是友元類=======================
當一個類B成爲了另外一個類A的“朋友”時,那麼類A的私有和保護的數據成員就可以被類B訪問。我們就把類B叫做類A的友元。
=======================友元類能做什麼=======================
友元類可以通過自己的方法來訪問把它當做朋友的那個類的所有成員。但是我們應該注意的是,我們把類B設置成了類A的友元類,但是這並不會是類A成爲類B的友元。說白了就是:甲願意把甲的祕密告訴乙,但是乙不見得願意把乙自己的祕密告訴甲。
=======================友元類的聲明方法和其用法=======================
聲明友元類的方法其實很簡單,只要我們在類A的成員列表中寫下如下語句:
friend class B; |
這樣一來,類B就被聲明成了類A的友元。注意,類B雖然是類A的友元,但是兩者之間不存在繼承關係。這也就是說,友元類和原來那個類之間並沒有什麼繼承關係,也不存在包含或者是被包含的關係,友元類和我上一篇博文《談談:C++類的“包含”機制》中的包含是完全不一樣的!
=======================友元類的一個具體例子=======================
在這裏,我們引用一個我從網上收集到的例子來說明友元類的作用:假設我們要設計一個模擬電視機和遙控器的程序。大家都之道,遙控機類和電視機類是不相包含的,而且,遙控器可以操作電視機,但是電視機無法操作遙控器,這就比較符合友元的特性了。即我們把遙控器類說明成電視機類的友元。下面是這個例子的具體代碼:
#include
<iostream> using namespace std; class TV
{ public : friend class Tele; TV():on_off(off),volume(20),channel(3),mode(tv){} private :
enum {on,off}; enum {tv,av}; enum {minve,maxve=100}; enum {mincl,maxcl=60}; bool on_off; int volume; int channel; int mode; }; class Tele { public : void OnOFF(TV&t){t.on_off=(t.on_off==t.on)?t.off:t.on;} void SetMode(TV&t){t.mode=(t.mode==t.tv)?t.av:t.tv;} bool VolumeUp(TV&t); bool VolumeDown(TV&t); bool ChannelUp(TV&t); bool ChannelDown(TV&t); void show(TV&t) const ;
}; bool Tele::VolumeUp(TV&t) { if (t.volume<t.maxve) { t.volume++; return true ; }
else { return false ; } } bool Tele::VolumeDown(TV&t) { if (t.volume>t.minve) { t.volume--; return true ; }
else { return false ; } } bool Tele::ChannelUp(TV&t) { if (t.channel<t.maxcl) { t.channel++; return true ; }
else { return false ; } } bool Tele::ChannelDown(TV&t) { if (t.channel>t.mincl) { t.channel--; return true ; }
else { return false ; } } void Tele::show(TV&t) const { if (t.on_off==t.on) { cout<< "電視現在" <<(t.on_off==t.on? "開啓" : "關閉" )<<endl; cout<< "音量大小爲:" <<t.volume<<endl; cout<< "信號接收模式爲:" <<(t.mode==t.av? "AV" : "TV" )<<endl; cout<< "頻道爲:" <<t.channel<<endl; }
else { cout<< "電視現在" <<(t.on_off==t.on? "開啓" : "關閉" )<<endl; } } int main() { Tele
t1; TV
t2; t1.show(t2); t1.OnOFF(t2); t1.show(t2); cout<< "調大聲音" <<endl; t1.VolumeUp(t2); cout<< "頻道+1" <<endl; t1.ChannelUp(t2); cout<< "轉換模式" <<endl; t1.SetMode(t2); t1.show(t2); return 0; } |
我們在程序的第6行定義了一個TV電視機類的友元類Tele。那麼程序中就可以來調用TV類中的私有成員。下面,是該程序的輸出: