博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++——友元 friend
阅读量:6572 次
发布时间:2019-06-24

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

人类社会的friend VS C++世界的friend

现实世界中,我们自己很多物品,朋友是可以使用的,但是陌生人就不行。那么money,朋友可以随便拿吗?这要是你和friend的关系深浅而定。人类社会friend多多少少还是会有些限制。而C++中的friend才是真正的friend,class中的money(这里指private data可以随便拿)。用法如下

C++ friend具有如下特性:

  1. friend不是类的成员,但是可以访问class所有成员
  2. friend不受access level控制

friend机制无疑打破了C++一直强调的封装,这种特性还是少用的好。

相同class的各个object互为friends

为啥重载<<常常设计成friend

  老实说,我本身就觉得这种问法很奇怪。难道不设计成class member function,就一定是friend吗?当然不是,你还可以设计成global function啊。当然global function和friend都比class member function要好,为啥?稍后介绍。global function 不如 friend的地方也就是访问private data时,global要通过class“暴露”出来的接口进而访问private data,而friend可以直接拿class 的private data。这在效率上能带来一定的提升。但是在强调封装性的C++中,friend显然是规则破坏者,因此本人更倾向于global 的实现方式。最上面那张图就是global的实现方式。

  再说为啥无论global function 还是 friend 都比 class member function好。代码是写给人看的,无论何时都要记得这一点。我们使用cout的时候都是cout<<selfdef_val,而不是seldef_val<<cout。如果设计成class member function就得采用后面这种“非人类”的调用方式。测试代码如下

#include 
class Complex {private: int real; int img;public: Complex(int _real = 0, int _img = 0) :real(_real), img(_img) {} std::ostream& operator<<(std::ostream& out) { out << "(" << this->real << "," << this->img << ")"; return out; }};#if 0ostream& operator<<(ostream& out, const Complex &c) { out << "(" << c.m_real << "," << c.m_imag << ")"; return out;}#endifint main() { Complex C1(1, 2); C1 << std::cout << std::endl;//cout << c << endl; return 0;}

  

 

转载于:https://www.cnblogs.com/kelamoyujuzhen/p/9444089.html

你可能感兴趣的文章
通过java连接sqlserver数据库教程
查看>>
深入理解display属性
查看>>
ajax跨域问题解决方案(jsonp,cors)
查看>>
poj2533
查看>>
版本总结该怎么写
查看>>
PowerBI/Excel - PowerQuery数据转换系列 - 如何将多行的值串联到一行 - 行列转换
查看>>
BZOJ3343 & 洛谷2801:教主的魔法——题解
查看>>
BZOJ1010:[HNOI2008]玩具装箱——题解
查看>>
SpringMVC中使用forward和redirect进行转发和重定向以及重定向时如何传参详解
查看>>
「小程序JAVA实战」 小程序抽离公用方法进行模块化(12)
查看>>
数据库几种Top子句的使用方法
查看>>
vs.net2010 操作 Excel2003 与 Excel2007
查看>>
用 javascript 脚本,网站判读来访者是手机还是电脑
查看>>
Linux下Crontab定时任务的使用教程 以及 无法执行定时任务的解决方案
查看>>
转载:Asp.Net之Html控件与Web控件的区别及如何正确使用它们.
查看>>
31、PHP会被python取代吗?
查看>>
JavaScript 原型链学习(一)原型对象
查看>>
面向对象3——方法
查看>>
[转] HMM与CRF
查看>>
【Foreign】Melancholy [线段树]
查看>>