Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 友元函数违反封装吗?_C++_Oop_Encapsulation_Friend_Access Modifiers - Fatal编程技术网

C++ 友元函数违反封装吗?

C++ 友元函数违反封装吗?,c++,oop,encapsulation,friend,access-modifiers,C++,Oop,Encapsulation,Friend,Access Modifiers,使用friend函数对我来说似乎有点小麻烦。friend函数是否违反了封装的概念 friend功能的替代方案是什么?与仅使用friend相比,使用简单的helper类/函数以及setter&getter成员函数是否有助于提高封装性 friend函数是否违反了封装的概念 事实上,它没有。首先,请注意它并不比public成员更违反封装。public成员是否违反了封装的概念?显然不是。更重要的是,在许多情况下,friend增加了封装,而不是违反了封装,因为它允许您将private内容维护为privat

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

friend
功能的替代方案是什么?与仅使用
friend
相比,使用简单的helper类/函数以及setter&getter成员函数是否有助于提高封装性

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

事实上,它没有。首先,请注意它并不比
public
成员更违反封装。
public
成员是否违反了封装的概念?显然不是。更重要的是,在许多情况下,
friend
增加了封装,而不是违反了封装,因为它允许您将
private
内容维护为
private
,而不必使用
public
成员公开整个系统的数据,这使得它的整个概念是私人的,肉眼看不见。这与在代码中传递意图相反,当注意到这一点时,应该发出红旗
friend
允许您缓解此问题,因为它使您可以控制哪些人可以访问这些被保留为私人的成员,以便所有人都知道他们是私人成员。您可以使用
friend
来解决设计问题,这样您就可以对某个点的访问进行控制,在该点上,您可以访问
private
部分的代码量根本没有增加

一个简单的helper类/函数以及setter&getter成员函数不应该拯救这个设计缺陷吗

当然,使用helper类肯定可以满足
friend
的一些相同需求,但很多时候都比仅仅使用
friend
麻烦得多。关于函数或getter/setter,我觉得这就像使用公共成员直接公开私有成员一样,其缺点如上所述

。。。或者它不应该被视为糟糕的设计实践吗

作为结束语,试着在这里避免主观问题,比如某些东西是否应该被视为X。让我们坚持事实吧!:)

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


不,它增强了
封装,因为另一种方法是将成员公开

好吧,一个只有getter和setter的简单类是。。。和让这些成员公开没有什么不同。你只是在骗自己。“朋友函数实际上更有助于封装,因为您直接针对可以访问您的成员的人。@GuillaumeRacicot:但是与其他人共享这样的
密钥会不会在以后的代码(尤其是大型项目)中造成混乱-成员函数的数量等(通过快速搜索找到)Scott Meyers写了很多关于成员函数、非成员好友和非成员非好友的文章,以及它们如何影响封装。你可以通过谷歌找到一个公平的数字。随着时间的推移,他的一些思想细节发生了变化。请记住,封装本身并不是一种理想的特性——它是控制和定位更改效果的一种方法,因此有助于实现灵活性(控制更改的能力)和健壮性(在进行更改时不会引入意外缺陷)等特性。如果将封装程度度量为编译器允许访问另一段代码的代码量,则此问题不是基于意见的。