友元关系
在 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妞
请按任意键继续. . .