友元关系
在 C++ 里,有一種特殊的友情關系 -- 友元關系。 不多說,上圖:
好吧,剛剛那張圖如果沒看過,那你就”奧特曼”啦~ 不過,初學C++,沒聽說過友元關系那倒是比較正常。。。。。。 首先嘛,任何事物的存在都會有它存在的理由! 在編程中我們通過 public, protected 和 private 這些訪問級別可以讓程序員控制誰有權使用某個類里的某個方法和屬性。這個強大的方案可以把代碼的實現細節掩藏起來,不讓沒有相應權限的其他代碼訪問到。
可是在某些場合,一個完全無關的類由于某些特殊原因需要訪問到某個 protected 成員,甚至某個 private 成員,那該怎么辦呢? 有些朋友可能會說,那就把所有的東西都聲明成 public 吧。這樣固然可以,但這樣不就把原來我們想方設法要保護的方法或屬性又暴漏了嗎?! 由于這種特殊且尷尬的矛盾存在,C++ 的發明者為此準備了一個解決方案:友元關系。
友元關系是不同類之間的一種特殊關系,這種關系不僅允許友元類訪問對方的 public 方法和屬性,還允許友元訪問對方的 protected 和 private 方法和屬性。(現在大家發覺剛開頭的比喻多么貼切了吧,得瑟一下) 聲明一個友元關系的語法很簡單,只要在類聲明里的某個地方加上一條 friend class ** 就行了。 注:這條語句可以放在任何地方,放在 public, protected, private 段落里都可以。
練習題目:”朋友”之妻不可親, Lovers 類有兩個子類:分別為 Boyfriend 類和Girlfriend 類。 Lovers 類有情人應有的方法 kiss(), ask() 等。 另增加第三者 Others 類作為路人甲代表,Others 類圖謀不軌想要 kiss() Girlfriend 類的對象,我們要幫助他實現愿望!
#include <iostream> #include <string>class Lovers { public:Lovers(std::string theName);void kiss(Lovers *lover);// 指向對象的指針 void ask(Lovers *lover, std::string something);protected:std::string name;friend class Others; // 禍根,交友不慎。。。。。。 };class Boyfriend : public Lovers { public:Boyfriend(std::string theName); };class Girlfriend : public Lovers { public:Girlfriend(std::string theName); };class Others { public:Others(std::string theName);void kiss(Lovers *lover);protected:std::string name; };Lovers::Lovers(std::string theName) {name = theName; }void Lovers::kiss(Lovers *lover) {std::cout << name << "親親我們家的" << lover->name << std::endl; }void Lovers::ask(Lovers *lover, std::string something) {std::cout << "寶貝兒" << lover->name << "幫我" << something << std::endl; }Boyfriend::Boyfriend(std::string theName) : Lovers(theName) { }Girlfriend::Girlfriend(std::string theName) : Lovers(theName) { }Others::Others(std::string theName) {name = theName; }void Others::kiss(Lovers *lover) {std::cout << name << "親一下" << lover->name << std::endl; }int main() {Boyfriend boyfriend("A君");Girlfriend girlfriend("B妞");Others others("路人甲");girlfriend.kiss(&boyfriend);girlfriend.ask(&boyfriend, "洗衣服啦");std::cout << "\n當當當當!傳說中的路人甲登場。。。。。。\n";others.kiss(&girlfriend);return 0; }
B妞親親我們家的A君
寶貝兒A君幫我洗衣服啦當當當當!傳說中的路人甲登場。。。。。。
路人甲親一下B妞
請按任意鍵繼續. . . View Code ?
?
?
?
轉載于:https://www.cnblogs.com/tianqizhi/p/10271710.html
總結
- 上一篇: RTT设备与驱动之PWM
- 下一篇: BZOJ.1558.[JSOI2009]