2010-05-07 81 views
7

我是一名java程序员,并试图理解方法(java方法)和函数(如C++)之间的区别。我曾经认为它们是相同的,只是不同的编程语言的命名约定。但现在我知道他们不是,我无法理解这种差异。我知道一个方法涉及到一个类的实例,并且可以访问类数据(成员变量),而函数不会(?)。那么是一种类似于静态方法的函数?是一种类似于静态方法的函数吗?

请参阅here的解释我读了这让我想到了这一点。

+2

我认为如果下面的各种答案听起来相矛盾,只是表明这是_subjective_,或者换句话说就是约定和语言。 – wilhelmtell 2010-05-07 04:31:10

回答

4

函数只是程序内部分代码的通用名称。 “方法”一词是功能的同义词。 “子程序”和“程序”等也是如此。

Java和C++函数大部分完全一样。

“方法”一词倾向于用于与实例相关联的子例程,而“函数”倾向于用于全局/静态的子例程。

但即使如此,“方法”由编译器生成,就好像它们是“函数”一样。

考虑此C++代码:

class Foo 
{ 
public: 
    void DoFoo(int param) 
    { 
     printf("%d, %d\n", param, member); 
    } 
private: 
    int member; 
}; 

int main() 
{ 
    Foo f; 
    f.DoFoo(42); 
    return 0; 
} 

编译器生成的代码的东西等效于此:

struct Foo 
{ 
    int member; 
}; 

void Foo_DoFoo(Foo* this, int param) 
{ 
    printf("%d, %d\n", param, this->member); 
} 

int main() 
{ 
    Foo f; 
    Foo_DoFoo(&f, 42); 
    return 0; 
} 

因此,“方法”和“功能”之间的区别仅仅是一种惯例。

1

在C语言中,所有“功能”都是“顶级”,因为它们与类型无关。如果他们在你的范围内(例如,通过包含),你可以参考他们,他们可以被链接。

在C++中,您可以创建类并将方法放入其中。标记为静态的方法通过特定的类来调用,但不与类的实例关联。从这个意义上说,他们就像功能。然而,他们被允许与该类关联的一些权限(例如,他们可以被设置为私有权并且可以访问私有静态成员)。但是,您仍然可以使用C风格的函数,例如用于库函数。

在Java中,每个方法都与一个类相关联,所以有静态方法但没有C风格的函数。

+0

这是有道理的 - 因此底线是方法与类(静态或不是)关联,而函数不与类关联(并且可以在类之外生活)。正确? – lkm 2010-05-07 03:00:18

2

这完全是一个词汇差异。有些人认为一种方法是属于一个对象或类的一种操作,一种功能是一种操作,它不会。其他人,如C++人群,将它们称为两个函数,但是当函数不属于类或对象时,请参阅免费函数非成员函数。我亲自使用这两个互换。总之,用C++术语来说,当你想引用特定种类的函数(非成员,成员,不返回任何值...)时,你需要给名词函数添加一个形容词:一个朋友函数,一个void函数,一个成员函数等等。

0

让我们把它变得非常简单一个函数与Java静态方法相同,但是一个函数不需要一个类来存在,这就像Uri在顶级代码段中所说的那样。 其中一个优点是它不需要调用对象实例化。

0

是一种类似于静态方法的函数吗?

的种类。但我宁愿说,静态方法就像一个被奴役并束缚于对象的函数。有关这一观点的详细说明,请参阅Execution in the Kingdom of Nouns