有人能简单解释OOP环境中的方法与函数吗?


当前回答

简单的记忆方式:

作用→ 免费(免费意味着它可以在任何地方,不需要在对象或类中)方法→ 成员(对象或类的成员)

其他回答

“method”是“function”的面向对象词。这几乎就是它的全部(即,没有真正的区别)。

不幸的是,我认为这里的很多答案都在延续或推进一种观点,即存在一些复杂而有意义的差异。

真的-没有那么多,只是对同一件事用不同的词。

[后期添加]


事实上,正如BrianNeal在对这个问题的评论中指出的那样,C++标准在引用成员函数时从不使用“方法”一词。有些人可能认为这表明C++并不是真正的面向对象语言;然而,我更倾向于将其作为一种迹象,即一群相当聪明的人并不认为有特别强烈的理由使用不同的术语。

类是一些数据和函数的集合,可以选择使用构造函数。

在创建该特定类的实例(副本、复制)时,构造函数初始化该类并返回一个对象。

现在类成为对象(没有构造函数)&函数在对象上下文中称为方法。

所以基本上

类<==new==>对象

函数<==new==>方法

在java中,构造函数的名称通常与类名相同,但实际上,构造函数类似于实例块和静态块,但具有用户定义的返回类型(即class类型)

而类可以具有静态块、实例块、构造函数、函数对象通常只有数据和方法。

在C++中,有时使用方法来反映类的成员函数的概念。然而,最近我在《C++编程语言第四版》一书中发现了一个声明,第586页“派生类”

虚函数有时称为方法。

这有点令人困惑,但他说,有时,C++创建者倾向于将方法视为可以在对象上调用的函数,并且可以表现为多态。

它们通常是可互换的,但方法通常指类内的子例程,函数通常指类外的子例程。例如,在Ruby中:

# function
def putSqr(a)
   puts a ** 2
end


class Math2
   # method
   def putSqr(a)
      puts a ** 2
   end
end

在Java中,所有内容(包和导入语句除外)都必须在类中,人们几乎总是将它们称为“方法”。

函数是一个数学概念。例如:

f(x,y) = sin(x) + cos(y)

表示函数f()将返回第一个参数的sin加上第二个参数的余弦。这只是数学。碰巧sin()和cos()也是函数。函数有另一个属性:对具有相同参数的函数的所有调用都应返回相同的结果。

另一方面,方法是与面向对象语言中的对象相关的函数。它有一个隐式参数:被作用的对象(及其状态)。

因此,如果对象Z具有方法g(x),则可能会看到以下内容:

Z.g(x) = sin(x) + cos(Z.y)

在这种情况下,传入参数x,与前面的函数示例相同。然而,cos()的参数是位于对象Z内部的值。Z和位于对象Z内的数据(Z.y)是Z的g()方法的隐式参数。