舉例說明C++友元類的作用
阿新 • • 發佈:2019-01-13
如下所示例,class A與class B並沒有繼承關係,但是我們想讓A直接訪問B的私有變數,則可以將class B作為class A的友元。
#include <iostream> using namespace std; class A { class B { private: int a; int b; friend class A; }; B b; public: void init_b() { b.a=1; b.b=2; cout << b.a << endl; cout << b.b << endl; } }; int main() { A a; a.init_b(); return 0; }
再來舉一個更加形象的例子,來源於別人的部落格
https://www.cnblogs.com/renzhuang/articles/6592024.html
假設我們要設計一個模擬電視機和遙控器的程式。大家都之道,遙控機類和電視機類是不相包含的,而且,遙控器可以操作電視機,但是電視機無法操作遙控器,這就比較符合友元的特性了。即我們把遙控器類說明成電視機類的友元。下面是這個例子的具體程式碼: 複製程式碼 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類中的私有成員。