2010-05-07 76 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