=======================什么是友元類=======================
當一個類B成為了另外一個類A的“朋友”時,那么類A的私有和保護的數據成員就可以被類B訪問。我們就把類B叫做類A的友元。
=======================友元類能做什么=======================
友元類可以通過自己的方法來訪問把它當做朋友的那個類的所有成員。但是我們應該注意的是,我們把類B設置成了類A的友元類,但是這並不會是類A成為類B的友元。說白了就是:甲願意把甲的秘密告訴乙,但是乙不見得願意把乙自己的秘密告訴甲。
=======================友元類的聲明方法和其用法=======================
聲明友元類的方法其實很簡單,只要我們在類A的成員列表中寫下如下語句:
friend
class
B;
|
這樣一來,類B就被聲明成了類A的友元。注意,類B雖然是類A的友元,但是兩者之間不存在繼承關系。這也就是說,友元類和原來那個類之間並沒有什么繼承關系,也不存在包含或者是被包含的關系,友元類和我上一篇博文《談談:C++類的“包含”機制》中的包含是完全不一樣的!
=======================友元類的一個具體例子=======================
在這里,我們引用一個我從網上收集到的例子來說明友元類的作用:假設我們要設計一個模擬電視機和遙控器的程序。大家都之道,遙控機類和電視機類是不相包含的,而且,遙控器可以操作電視機,但是電視機無法操作遙控器,這就比較符合友元的特性了。即我們把遙控器類說明成電視機類的友元。下面是這個例子的具體代碼:
1 #include <iostream> 2 using namespace std; 3 class TV 4 { 5 public: 6 friend class Tele; 7 TV():on_off(off),volume(20),channel(3),mode(tv){} 8 private: 9 enum{on,off}; 10 enum{tv,av}; 11 enum{minve,maxve=100}; 12 enum{mincl,maxcl=60}; 13 bool on_off; 14 int volume; 15 int channel; 16 int mode; 17 }; 18 class Tele 19 { 20 public: 21 void OnOFF(TV&t){t.on_off=(t.on_off==t.on)?t.off:t.on;} 22 void SetMode(TV&t){t.mode=(t.mode==t.tv)?t.av:t.tv;} 23 bool VolumeUp(TV&t); 24 bool VolumeDown(TV&t); 25 bool ChannelUp(TV&t); 26 bool ChannelDown(TV&t); 27 void show(TV&t)const; 28 }; 29 bool Tele::VolumeUp(TV&t) 30 { 31 if (t.volume<t.maxve) 32 { 33 t.volume++; 34 return true; 35 } 36 else 37 { 38 return false; 39 } 40 } 41 bool Tele::VolumeDown(TV&t) 42 { 43 if (t.volume>t.minve) 44 { 45 t.volume--; 46 return true; 47 } 48 else 49 { 50 return false; 51 } 52 } 53 bool Tele::ChannelUp(TV&t) 54 { 55 if (t.channel<t.maxcl) 56 { 57 t.channel++; 58 return true; 59 } 60 else 61 { 62 return false; 63 } 64 } 65 bool Tele::ChannelDown(TV&t) 66 { 67 if (t.channel>t.mincl) 68 { 69 t.channel--; 70 return true; 71 } 72 else 73 { 74 return false; 75 } 76 } 77 void Tele::show(TV&t)const 78 { 79 if (t.on_off==t.on) 80 { 81 cout<<"電視現在"<<(t.on_off==t.on?"開啟":"關閉")<<endl; 82 cout<<"音量大小為:"<<t.volume<<endl; 83 cout<<"信號接收模式為:"<<(t.mode==t.av?"AV":"TV")<<endl; 84 cout<<"頻道為:"<<t.channel<<endl; 85 86 } 87 else 88 { 89 cout<<"電視現在"<<(t.on_off==t.on?"開啟":"關閉")<<endl; 90 } 91 92 } 93 int main() 94 { 95 Tele t1; 96 TV t2; 97 t1.show(t2); 98 t1.OnOFF(t2); 99 t1.show(t2); 100 cout<<"調大聲音"<<endl; 101 t1.VolumeUp(t2); 102 cout<<"頻道+1"<<endl; 103 t1.ChannelUp(t2); 104 cout<<"轉換模式"<<endl; 105 t1.SetMode(t2); 106 t1.show(t2); 107 return 0; 108 }
我們在程序的第6行定義了一個TV電視機類的友元類Tele。那么程序中就可以來調用TV類中的私有成員。下面,是該程序的輸出:
好了,這就是友元類了。關於友元類,我反正是這樣認為的,因為友元類有可能會破壞數據的安全性,我們還是少用為好啊!在這里我只是記錄一下它的用法。