在封装中C++类数据成员大多情况是private属性;但是如果接口采用多参数实现肯定影响程序效率;然而这时候如果外界需要频繁访问这些私有成员,就不得不需要一个既安全又理想的“后门”——友元关系;

C++中提供三种友元关系的实现方式,友元函数、友元成员函数、友元类。

友元函数:既将一个普通的函数在一个类中说明为一个friend属性;其定义(大多数会访问该类的成员)应在类后;

友元成员函数:既然是成员函数,那么肯定这个函数属于某个类,对了就是因为这个函数是另外一个类的成员函数,有时候因为我们想用一个类通过一个接口去访问另外一个类的信息,然而这个信息只能是被它授权的类才能访问;那么也需要用friend去实现;这个概念只是在声明的时候稍有变化;

友元类:友元类声明会将整个类说明成为另一个类的友元关系;和之前两种的区别是集体和个人的区别;友元类的所有成员函数都可以是另一个类的友元函数;

值得注意的是友元关系是单向的,有点像我们恋爱中出现的单相思 O(∩_∩)O,单向关系就是说如果A被说明成B的友元关系,那么只能说A是B的友元,并不代表B是A的友元;其次在多数情况下友元关系的函数都会访问它被说明中类的成员,这时候应该将函数定义在类的后面;

下面给一个简单的例程代码;

#include <iostream>using namespace std;class B;class A{private:int x;public:A();void display(B &);
};class C;class B{private:int y;int z;public:B();B(int, int);friend void A::display(B &);//友元成员函数friend void display(B &);//友元函数friend class C;//友元类
};class C{private:int sum;void calc(B &);public:C();void display(B &);
};//必须在友元关系的类后进行定义
void display(B &v)//友元函数
{cout << v.y << " " << v.z << endl;
}A::A()
{this->x = 0;
}void A::display(B &v)//友元成员函数
{this->x = v.y + v.z;cout << this->x << endl;
}B::B()
{this->y = 0;this->z = 0;
}B::B(int y, int z)
{this->y = y;this->z = z;
}C::C()
{sum = 0;
}void C::display(B &v)
{this->calc(v);cout << sum << " = " << v.y << " + " << v.z << endl;
}void C::calc(B &v)
{sum = v.y + v.z;
}int main()
{A a;B b(2, 3);display(b);a.display(b);C c;c.display(b);return 0;
}

浅谈C++中的友元关系相关推荐

  1. 浅谈javascript中原型(prototype)、构造函数、对象实例及三者之间的关系

    转自:http://www.cnblogs.com/zhangwei412827/archive/2012/12/14/2816263.html 浅谈javascript中原型(prototype). ...

  2. mybatis与php,浅谈mybatis中的#和$的区别

    浅谈mybatis中的#和$的区别 发布于 2016-07-30 11:14:47 | 236 次阅读 | 评论: 0 | 来源: 网友投递 MyBatis 基于Java的持久层框架MyBatis 本 ...

  3. python中 是什么类型_浅谈python中的变量默认是什么类型

    浅谈python中的变量默认是什么类型 1.type(变量名),输出的结果就是变量的类型: 例如 >>> type(6) 2.在Python里面变量在声明时,不需要指定变量的类型,变 ...

  4. 浅谈Linux中ldconfig和ldd的用法

    ldd 查看程序依赖库 ldd 作用:用来查看程式运行所需的共享库,常用来解决程式因缺少某个库文件而不能运行的一些问题. 示例:查看test程序运行所依赖的库: /opt/app/todeav1/te ...

  5. python文件路径拼接多出斜杠_浅谈python中拼接路径os.path.join斜杠的问题

    浅谈python中拼接路径os.path.join斜杠的问题 调试程序的过程中,发现通过os.path.join拼接的路径出现了反斜杠 directory1='/opt/apps/upgradePac ...

  6. 【网摘】 浅谈HTTP中GET与POST的区别

    文章出处:http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html 浅谈HTTP中Get与Post的区别 Http定义了与服务器交互的不 ...

  7. 计算机与昆虫关系的论文,浅谈昆虫与人类的关系.doc

    浅谈昆虫与人类的关系.doc 浅谈昆虫与人类的关系 班级:生物科学师范 姓名:李杰 学号:2012221107110076 摘要:昆虫为全世界增添光彩,让声音更加多样化,然而随着人类活动的增加,昆虫的 ...

  8. 简述相关与回归分析的关系_浅谈相关分析与回归分析的关系

    浅谈相关分析与回归分析的关系 郝依寒 [期刊名称] <数字通信世界> [年 ( 卷 ), 期] 2018(000)004 [摘要] 本文以回归分析及回归分析的应用为对象做出简要论述 , 通 ...

  9. 浅谈Android中的MVP与动态代理的结合

    浅谈Android中的MVP与动态代理的结合 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 在Android开发平台上接触MVP足足算起来大概已经有一个年头左右.从最开始到现在经 ...

最新文章

  1. idea(2)快捷键
  2. Linux-什么是二进制包,源码包,RPM包,软件仓库
  3. 周末--------粉红色的回忆
  4. can t connect to mysql server on ‘localhost‘解决方法
  5. mysql8创建用户并授权_新版mysql8.0.12添加用户并设置权限避免踩坑!
  6. python专业名词_python 术语
  7. C#中的泛型和泛型集合
  8. android插件化-获取apkplug框架已安装插件-03
  9. LeetCode 258. 各位相加
  10. java递归遍历目录文件
  11. jsp页面ajax用法,在jsp中使用jquery的ajax
  12. 【Modbus】 RTU CRC校验码计算方法
  13. 免费股票量化交易软件有哪些?
  14. BOM有效日期的设置
  15. 3PAR存储双活LUN扩容方法
  16. 如何给服务器IIS配置文件夹配置everyone权限
  17. iOS设计 - 一款APP从设计稿到切图过程概述
  18. 现在开房都不需要在前台办理入住了?刺激
  19. Linux发行版本及常用国产系统+系统优化
  20. C++ STL之命名空间、函数模板、类模板

热门文章

  1. 美国软件开发公司Apttus 获8800万美元风投,因市场不确定性暂缓上市
  2. Selenium3.X 与 Javascript (Nodejs)
  3. 自顶向下的语法分析(修改)
  4. onclick事件中加href
  5. SQLServer性能优化一则小实例(2010-07-21)
  6. 上传jar到nexus的thirdparty第三方库
  7. [WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口
  8. ArcCore重构-Platform_Types.h实现辨析
  9. Elasticsearch: 权威指南 » 聚合 » Doc Values and Fielddata » 聚合与分析
  10. 说说web缓存-强缓存、协商缓存