2010-05-07 11 views
7

मैं एक जावा प्रोग्रामर हूं और एक विधि (जावा विधियों) और एक फ़ंक्शन (जैसे सी ++ में) के बीच अंतर को समझने की कोशिश कर रहा हूं। मुझे लगता था कि वे अलग-अलग प्रोग्रामिंग भाषाओं के लिए अलग-अलग नामकरण सम्मेलन समान हैं। लेकिन अब जब मुझे पता है कि वे नहीं हैं, तो मुझे अंतर समझने में परेशानी हो रही है।एक फ़ंक्शन प्रकार की तरह एक स्थिर विधि है?

मुझे पता है कि एक विधि कक्षा के एक उदाहरण से संबंधित है और क्लास डेटा (सदस्य चर) तक पहुंच है, जबकि कोई फ़ंक्शन नहीं है (?)। तो एक स्थिर विधि की तरह एक समारोह की तरह है?

स्पष्टीकरण के लिए here देखें जो मैंने पढ़ा जिससे मुझे यह सोचने का मौका मिला।

+2

मुझे लगता है कि अगर नीचे दिए गए विभिन्न उत्तर ध्वनि के विपरीत हैं तो यह दिखाता है कि यह _subjective_ है, या दूसरे शब्द में सम्मेलन और भाषा का मामला है। – wilhelmtell

उत्तर

4

एक फ़ंक्शन एक प्रोग्राम के भीतर कोड के एक हिस्से के लिए बस एक सामान्य नाम है। शब्द "विधि" फ़ंक्शन के लिए समानार्थी है। तो "subroutines" और "प्रक्रियाओं" आदि हैं

जावा और सी ++ फ़ंक्शंस अधिकांश भाग के लिए बिल्कुल एक ही चीज़ हैं।

शब्द "विधि" का उपयोग उदाहरण के साथ जुड़े सबराउटिन के लिए किया जाता है, जबकि "फ़ंक्शन" का उपयोग वैश्विक/स्थैतिक लोगों के लिए किया जाता है।

लेकिन फिर भी, "विधियों" को संकलक द्वारा उत्पन्न किया गया है जैसे कि वे "कार्य" थे।

पर विचार करें इस सी ++ कोड:

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

सी में सभी "फ़ंक्शंस" इस अर्थ में "शीर्ष स्तर" हैं कि वे एक प्रकार से जुड़े नहीं थे। अगर वे आपके दायरे में थे (उदाहरण के लिए, एक शामिल के माध्यम से), तो आप उन्हें संदर्भित कर सकते हैं और उन्हें लिंक किया जा सकता है।

सी ++ में आप कक्षाएं और स्थान विधियां बना सकते हैं। स्थैतिक के रूप में चिह्नित विधियों को किसी विशेष वर्ग के माध्यम से बुलाया जाता है लेकिन कक्षा के उदाहरण से जुड़े नहीं होते हैं। उस अर्थ में वे कार्यों की तरह हैं। हालांकि, उन्हें कक्षा से जुड़े कुछ विशेषाधिकारों की अनुमति है (उदाहरण के लिए, उन्हें निजी बनाया जा सकता है और निजी स्थिर सदस्यों तक पहुंच सकते हैं)। हालांकि, आप अभी भी सी-स्टाइल फ़ंक्शंस का उपयोग कर सकते हैं, उदाहरण के लिए लाइब्रेरी फ़ंक्शंस के लिए।

जावा में प्रत्येक विधि कक्षा के साथ जुड़ा हुआ है, इसलिए स्थैतिक विधियां हैं लेकिन कोई सी-शैली कार्य नहीं है।

+0

यह समझ में आता है - इसलिए नीचे की रेखा यह है कि विधियों के पास कक्षा (या तो स्थैतिक या नहीं) के साथ संबंध है, जबकि फ़ंक्शन किसी वर्ग से संबद्ध नहीं है (और कक्षा के बाहर भी रह सकता है)। सही बात? – lkm

2

यह कड़ाई से एक शब्दावली अंतर है। कुछ लोग किसी ऑब्जेक्ट या क्लास से संबंधित एक ऑपरेशन पर विचार करते हैं, और एक फ़ंक्शन एक ऑपरेशन जो नहीं करता है। अन्य, सी ++ भीड़ की तरह, उन्हें दोनों कार्यों को कॉल करें लेकिन नि: शुल्क फ़ंक्शंस या गैर-सदस्य फ़ंक्शंस देखें जब फ़ंक्शन किसी वर्ग या ऑब्जेक्ट से संबंधित नहीं है। मैं व्यक्तिगत रूप से दो अलग-अलग उपयोग करता हूं।

सभी में, सी ++ शब्दकोष में जब आप विशिष्ट प्रकार के कार्यों (गैर-सदस्यों, सदस्यों, कोई मूल्य वापस नहीं कर रहे हैं ...) को संदर्भित करना चाहते हैं तो आप संज्ञा समारोह में विशेषण जोड़ते हैं: एक मित्र कार्य, एक शून्य कार्य, एक सदस्य समारोह और इतने पर।

0

आइए इसे वास्तव में सरल रखें, एक फ़ंक्शन जावा स्थैतिक विधि जैसा ही है, हालांकि एक फ़ंक्शन को कक्षा के अस्तित्व की आवश्यकता नहीं होती है, जो इसे यूरी के कोड के शीर्ष स्तर के टुकड़े में बदलता है। इसका एक लाभ यह है कि इसे किसी ऑब्जेक्ट इंस्टेंटेशन को कॉल करने की आवश्यकता नहीं होगी।

0

क्या एक फ़ंक्शन एक स्थिर विधि की तरह है?

तरह। लेकिन मैं कहूंगा कि एक स्थैतिक विधि एक ऐसे फ़ंक्शन की तरह है जो किसी ऑब्जेक्ट पर दास और shackled किया गया है। इस दृष्टिकोण के विस्तार के लिए Execution in the Kingdom of Nouns देखें।

संबंधित मुद्दे