代码之家  ›  专栏  ›  技术社区  ›  rlbond

成员函数与非成员函数?

  •  8
  • rlbond  · 技术社区  · 15 年前

    在类上操作的函数应该是成员函数,而不是非成员函数,您的规则是什么? 例如,我有一个类,它用一个布尔矩阵表示一个迷宫。我正在创建一个名为isconnected的函数,它验证迷宫中的两个点是否在同一区域(即可以从A到B移动)。

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

    6 回复  |  直到 15 年前
        1
  •  11
  •   Mr Fooz    15 年前

    何时使其成为成员函数:

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

    何时使其成为独立函数

    • 当它是一个通用函数,可以模板化以自然地在其他类上工作时(请查看<algorithms>头中的示例)
        2
  •  14
  •   Mark Ransom    15 年前

    赫伯·萨特说:“如果可能的话,我们想让他们成为非会员的非朋友”,他比我聪明。

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

        3
  •  13
  •   Mr Fooz    13 年前

    好吧,两者都有论据。

    有利于非成员函数:

    • 它提供 better encapsulation
    • 它允许更好的代码重用(std::find可以重用于 任何 容器类型,因为它是一个自由函数。如果它是一个成员,那么容器就必须定义它自己的成员)
    • 它使许多通用编程技巧变得更容易。( container.begin() 如果无效,则为 container 是一个数组。这使得在容器上编写通用代码更加困难。但是 begin(container) 可以使任何类型都有效,甚至是内置的类型,如数组)。它还可以通过组合使混音变得更干净,因为它不需要用户通过成员“点”自己来到达要操作的混音对象。

    有利于使事物成为成员函数的是:

    • 这是熟悉的。Java与C语言 要求 在许多程序员看来,成员函数是OOP的同义词。

    还有…就是这样。 (但这一论点不应被低估。代码可读性很重要,如果人们发现更容易阅读成员版本,这是一个有利于它的有力论据。它只是不能产生更好的代码。从一个严格的“更好的代码”的角度来看,如果可能的话,应该优先选择非成员。

        4
  •  4
  •   Stefano Borini    15 年前

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

    当然,你最终可能会得到一个职责太多的班级。在这种情况下,keep it-simple(保持简单)因素起作用,您应该考虑您的类是否试图做太多。这样就可以方便地拥有一个单独的类(比如,在您的例子中,一个连接的nessEvaluator),它的特定角色是保存可以遍历并对迷宫实例执行操作的算法。

        5
  •  3
  •   dirkgently    15 年前

    我总是提到 FAQ 13.9 . 这不是一门精确的科学,而是一门基于判断力的科学。

    当您需要访问类内部构件时,您应该使用一个成员,这过于简单化了。值得注意的例子是流插入/提取操作符( >> << 分别)和二进制 + .

    在你的例子中, isConnected 是一种测试对象状态的方法,即检查员和成员的理想候选人。

        6
  •  0
  •   T.E.D.    15 年前

    我唯一倾向于做非成员函数的东西是只从成员函数内部调用的东西(不需要在类外部可见),并且可以在类的公共成员和/或少量参数上运行良好。