博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
友元关系
阅读量:4637 次
发布时间:2019-06-09

本文共 2272 字,大约阅读时间需要 7 分钟。

  在 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 
#include
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

你可能感兴趣的文章
React接入Sentry.js
查看>>
ssh自动分发密匙脚本样板
查看>>
转 小辉_Ray CORS(跨域资源共享)
查看>>
Linux安装postgresql
查看>>
MyBatis启动:MapperStatement创建
查看>>
【kindeditor】KindEditor获取多个textarea文本框的值并判断非空
查看>>
【 全干货 】5 分钟带你看懂 Docker !
查看>>
[转]优化Flash性能
查看>>
popStar手机游戏机机对战程序
查看>>
Java Web项目结构
查看>>
lambda表达式树
查看>>
OpenCV YUV 与 RGB的互转(草稿)
查看>>
二次注入原理及防御
查看>>
会话记住已登录功能
查看>>
Linux内核分析——可执行程序的装载
查看>>
儿子和女儿——解释器和编译器的区别与联系
查看>>
第一阶段冲刺3
查看>>
父类引用指向子类对象
查看>>
网页如何实现下载功能
查看>>
IT男专用表白程序
查看>>