成员函数与非成员函数?

rlb*_*ond 8 c++ oop

对类操作的函数应该是成员函数还是非成员函数的规则是什么?例如,我有一个使用bools矩阵表示迷宫的类.我正在创建一个名为isConnected的函数,它验证迷宫中的2个点位于同一区域(即可以从A行进到B).

这应该是会员还是非会员?什么是好规则?

Mar*_*som 14

Herb Sutter说"如果合理可能的话,我们想让他们成为非成员的非朋友",而且他比我更聪明.

http://www.gotw.ca/gotw/084.htm

  • 我完全同意......我甚至不知道Sutter推荐这个. (2认同)

jal*_*alf 13

嗯,两者都存在争议.

赞成非成员函数:

  • 它提供更好的封装
  • 它允许更好的代码重用(std :: find可以重用于任何容器类型,因为它是一个自由函数.如果它是一个成员,那么容器必须定义它自己的)
  • 它使很多通用编程技巧变得更容易.(container.begin()如果container是数组则无效.这使得编写处理容器的通用代码变得更加尴尬.但是begin(container)对于任何类型,甚至像数组这样的内置代码都可以有效.它还可以通过合成使mixins变得更加清晰,因为它不需要用户通过成员"点"自己来获取你想要操作的mixin对象.

赞成制作会员功能的是:

  • 这很熟悉.Java和C#需要这个,在很多程序员看来,成员函数是OOP的同义词.

而且......就是这样.(但是这个论点不应该被低估.代码可读性很重要,如果人们发现阅读成员版本更容易,那么这是一个有利的论据.它只是不会产生更好的代码.从严格的"更好的代码"从观点来看,应尽可能优先选择非成员.


Mr *_*ooz 11

何时使其成为成员函数:

  • 当函数与类逻辑耦合时(如迷宫连接示例)
  • 当函数需要访问私有或受保护的成员时,最好使其成为成员而不是朋友.

何时使其成为独立功能

  • 当它是一个通用函数,可以被模板化以自然地在其他类上工作(查看<algorithms>标题以获得良好示例)

  • 为什么?这些指导原则的基本原理是什么? (4认同)

Ste*_*ini 5

在这种情况下,我会选择成员函数。我遵循的规则是,如果一个函数必须访问实例当前状态内部的某些东西,那么它应该是类的“领域”的一部分。在这种情况下,A 和 B 的连通性取决于对象实例的状态。

当然,您最终可能会拥有一个责任过多的类。在这种情况下,保持简单的因素开始发挥作用,您应该考虑您的班级是否试图做太多事情。然后,拥有一个单独的类(例如,在您的情况下,一个 ConnectednessEvaluator)会很方便,它的具体作用是保存可以遍历并作用于您的迷宫实例的算法。