关于C++中的友元

友元可以实现在类外定义,但是能提供跟类内的成员一样的访问权限,它能访问类中的所有成员即使是private的(不过要注意继承的情况,父类的private是不能访问的,不过子类的成员也是不能访问父类的private的,所以可以认为友元的权限跟类自身的成员访问权限一样)。

C++中的友元可分为三类:友元函数,友元类,类的成员函数是另一类的友元函数;

友元的作用是实现类之间的数据共享,减小系统开销,提高效率;一般应用友元的场景有这两种:

1)某些运算符的重载;(友元重载运算符,通常用在运算符的左右操作数不相同的情况,比如说流运算符<<和>>,因为友元函数不能获取this指针!不能用友元函数重载的运算符有:[],(),->,=);

2)两个类之间要共享数据时;

某些人说友元的缺点是破坏了封装性。不过我不这么看,我认为封装所强调的不是隐藏,而是控制开放!从这个层面讲,public所提供的是控制哪些成员开放,而friend所提供的是控制对谁开放!而至于将哪些成员设置为public,哪些对象设置为friend,这就是类的作者需要斟酌的事情了!

要注意,友元函数与成员函数的区别是友元函数是没有this指针的,所以需要以对象作为参数;另外就是友元关系是不能继承的,即父类的友元,不能是子类的友元;



友元并没有破坏封装。将何人设成友元,或者说允许谁来访问本类的私有成员,完全是由本类的作者决定的,如同将哪些成员设成公共成员一样。public控制开放哪些成员,friend控制开放的目标,是控制的两种表现形式,并不是对立的,所以从概念上讲并没有破坏封装。


所谓“封装”,并不是说把所有的东西都包起来不给别人看,而是指有控制的允许一些人看到一些东西,强调的是“控制”,而不是“隐藏”。有“隐藏”必有“开放”,否则就谈不上封装了,关键在于作者能不能控制这种开放。有的语言不能控制,就说它不具有“封装”特性,有的语言能够控制,就说它具有“封装”特性。

C++的“封装”特性是指其能够“控制开放”,友元只是细化这种控制,并没有失去控制,所以并没有破坏“封装”。类似还有protected,只允许特定目标访问特定成员,也是对“封装”的细化,都在类的作者的控制之下。

最初曾考虑过将friend进一步细化到控制单独的成员,也就是说同时控制开放成员与目标,不过语法上太别扭了,所以现在friend作用于所有成员,public作用于所有目标。

猜你喜欢

转载自blog.csdn.net/Dr_Neo/article/details/52493735