友元函数是不是违反封装? [关闭]

Posted

技术标签:

【中文标题】友元函数是不是违反封装? [关闭]【英文标题】:Do friend functions violate encapsulation? [closed]友元函数是否违反封装? [关闭] 【发布时间】:2019-02-13 21:31:58 【问题描述】:

friend 函数的使用对我来说似乎有点小技巧。 friend函数是否违反了封装的概念?

friend 函数的替代方法是什么?与仅使用 friend 相比,使用简单的帮助类/函数以及 settergetter 成员函数是否有助于增加封装?

【问题讨论】:

嗯,一个只有一个 getter 和一个 setter 的简单类......与公开这些成员没有什么不同。你只是在对自己撒谎。朋友函数实际上更有助于封装,因为您直接定位谁可以访问您的成员。 @GuillaumeRacicot:但是与其他人共享这样的secret keys 会在以后的代码(尤其是大项目)中造成混乱 - 成员函数的常量等 When should you use 'friend' in C++?(通过快速搜索找到)可能会有所帮助。 Scott Meyers 写了许多关于成员函数、非成员朋友和非成员非朋友的文章 - 以及它们如何影响封装。你可以用谷歌找到一个公平的数字。随着时间的推移,他的一些思想细节发生了变化。请记住,封装本身并不是一个真正理想的属性 - 它是控制和本地化更改效果的一种方式,因此有助于提高灵活性(控制更改的能力)和稳健性(在进行更改时不会引入意外缺陷)等属性)。 如果您将封装程度衡量为编译器允许访问另一段代码的代码量,则此问题不是基于意见的。 【参考方案1】:

friend 函数是否违反了封装的概念?

事实上,没有。首先,请注意它并没有比public 成员更多地违反封装。 public 成员是否违反了封装的概念?显然不是。更重要的是,在许多情况下friend 增加了封装而不是违反它,因为它允许您将private 的东西维护为private,而不必使用public 成员在系统范围内公开数据,这使得它的整个概念是private 隐藏在肉眼之外。这与在您的代码中传递意图相反,并且应该在注意到时引发红旗。 friend 允许您缓解此问题,因为它可以让您准确控制谁可以访问这些被保留的成员 private 让每个人都知道他们是谁。 The C++ FAQ raises one example,您可以在其中使用 friend 来解决设计问题,这样您就可以控制对访问的访问,而根本没有增加访问代码的数量到private 部分。

难道不是一个简单的帮助类/函数以及 setter 和 getter 成员函数可以挽救这个设计缺陷吗?

嗯,使用辅助类肯定可以满足friend 所做的一些相同需求,但很多时候比仅使用friend 更加麻烦。关于函数或 getter/setter,我觉得这就像使用 public 成员直接暴露 private 成员,其缺点如上所述。

...还是不应该将其视为糟糕的设计实践?

作为结束说明,请尽量避免在这里提出主观问题,例如是否应该将某事视为 X。让我们坚持事实! :)

【讨论】:

【参考方案2】:

友元函数是否违反了封装的概念

不,它增强封装,因为另一种方法是使成员public

【讨论】:

以上是关于友元函数是不是违反封装? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

友元函数友元类.

Java里有没有友元函数这回事

类和对象(16)—— 友元

C++学习摘要之六:友元函数与友元类

什么是友元?

5.友元运算符重载