我现在正在读Scott的有效的C++书,但是我还是无法理解第23条的内容。他说:
更喜欢非会员的非朋友功能而不是会员功能。这样做可以提高封装、打包灵活性和功能扩展性。
虽然我可以看到在类之外添加外部函数的意义,但我看不到它的先进性。他谈到这些,因为它们正在增加封装。是的,这是正确的,因为非会员的非朋友函数不能访问类中作为私有变量声明的任何成员变量。但是,这就是我不能四处走动的地方。拥有允许对象控制的成员函数在某种程度上是必要的--如果所有数据成员都是公共的,那么如何处理POD呢?老实说,我看不出那里有什么实际用途。哈维宁说,即使我们有非会员的非朋友功能,封装不会改变,因为我们仍然需要!!公开!!成员函数与我们的对象交互。
那么,为什么我--或者其他任何人--更喜欢非会员的非朋友函数而不是成员函数?当然,我们可以编写已经存在的成员函数的包装器,这些成员函数可能按逻辑顺序分组,但仅此而已。我看不出这里有什么封装。
发布于 2014-10-01 17:00:46
梅耶斯没有说要避免成员函数。他说,除非他们需要,否则他们不应该是成员(或朋友)。显然,需要一些可以访问类的私有成员的函数,否则其他代码如何与类交互,对吗?
但是,每个可以访问类的私有成员的函数都耦合到该类的私有实现细节。应该是成员(或朋友)的功能,只有通过访问私有细节才能有效地实现。这些是类的本原函数。非本原函数是在原始函数的基础上有效地实现的函数.使非原始函数成员(或朋友)增加了与私有细节相耦合的代码数量。
此外,在编写能够修改对象的私有成员的函数时,必须更加小心地保留类不变量。
发布于 2014-10-01 16:12:07
迈尔斯在this article中给出了他的推理。这里有一个摘录:
我们现在已经看到,衡量类中封装量的一种合理方法是,计算如果类的实现发生更改,可能会中断的函数数量。在这种情况下,有n个成员函数的类比具有n+1成员函数的类更容易封装。这个观察证明了我更喜欢非会员非朋友函数而不是成员函数的理由:如果函数f可以作为成员函数或非朋友非会员函数来实现,那么使它成为一个成员将减少封装,而使它成为非会员功能则不会。
发布于 2014-10-01 17:09:53
举个小例子:
std::list具有sort成员函数,因为它得益于列表元素的自然移动能力。std::sort自由函数。https://stackoverflow.com/questions/26145639
复制相似问题