प्रोग्रामिंग भाषाओं में, फ़ंक्शन को दो तरीकों से लागू किया जा सकता है: जिसे कॉल बाय वैल्यू और कॉल बाय रेफरेंस कहा जाता है।
इस ट्यूटोरियल में आप सीखेंगे,
- मूल्य विधि द्वारा कॉल क्या है?
- संदर्भ विधि द्वारा कॉल क्या है?
- मूल्य विधि द्वारा कॉल का उदाहरण
- संदर्भ विधि द्वारा कॉल का उदाहरण
- वैल्यू बाय कॉल बनाम संदर्भ द्वारा कॉल
- मूल्य विधि द्वारा कॉल का उपयोग करने के लाभ
- संदर्भ विधि द्वारा कॉल का उपयोग करने के लाभ
- मूल्य विधि द्वारा कॉल का उपयोग करने के नुकसान
- संदर्भ विधि द्वारा कॉल का उपयोग करने के नुकसान
मूल्य विधि द्वारा कॉल क्या है?
मूल्य विधि से कॉल उस फ़ंक्शन के औपचारिक पैरामीटर में एक तर्क के मूल्य की प्रतिलिपि बनाता है। इसलिए, मुख्य फ़ंक्शन के पैरामीटर में किए गए परिवर्तन तर्क को प्रभावित नहीं करते हैं।
इस पैरामीटर पासिंग विधि में, वास्तविक मापदंडों के मानों को फ़ंक्शन के औपचारिक मापदंडों में कॉपी किया जाता है, और मापदंडों को विभिन्न मेमोरी स्थानों में संग्रहीत किया जाता है। इसलिए फंक्शंस के अंदर किए गए किसी भी बदलाव को कॉलर के वास्तविक मापदंडों में परिलक्षित नहीं किया जाता है।
कुंजी प्रसार
- कॉल इन वैल्यू मेथड के द्वारा ओरिजनल वैल्यू को संशोधित नहीं किया जाता है, जबकि कॉल इन रेफरेंस विधि से, मूल मूल्य को संशोधित किया जाता है।
- कॉल बाय वैल्यू में, वैरिएबल की एक कॉपी पास की जाती है जबकि कॉल बाय रेफरेंस में, एक वैरिएबल खुद ही पास हो जाता है।
- कॉल बाय वैल्यू में, वास्तविक और औपचारिक तर्क अलग-अलग मेमोरी लोकेशन में बनाए जाएंगे जबकि कॉल बाय रेफरेंस में, वास्तविक और औपचारिक तर्क एक ही मेमोरी लोकेशन में बनाए जाएंगे।
- कॉल बाय वैल्यू प्रोग्रामिंग भाषाओं में डिफ़ॉल्ट तरीका है जैसे C ++, PHP, Visual Basic NET और C # जबकि कॉल बाय रेफरेंस केवल Java लैंग्वेज को सपोर्ट करता है।
- वैल्यू बाय कॉल, वेरिएबल्स को एक सीधी विधि का उपयोग करके पास किया जाता है जबकि कॉल बाय रेफरेंस, पॉइंटर्स के लिए वेरिएबल्स के एड्रेस को स्टोर करना आवश्यक होता है।
संदर्भ विधि द्वारा कॉल क्या है?
कॉल बाय रेफरेंस मेथड एक तर्क के पते को औपचारिक पैरामीटर में कॉपी करता है। इस पद्धति में, फ़ंक्शन कॉल में उपयोग किए जाने वाले वास्तविक तर्क तक पहुंचने के लिए पते का उपयोग किया जाता है। इसका अर्थ है कि पैरामीटर में किए गए परिवर्तन पासिंग तर्क को बदल देते हैं।
इस पद्धति में, मेमोरी आवंटन वास्तविक मापदंडों के समान है। फ़ंक्शन में सभी ऑपरेशन वास्तविक पैरामीटर के पते पर संग्रहीत मूल्य पर किए जाते हैं, और संशोधित मूल्य उसी पते पर संग्रहीत किया जाएगा।
वैल्यू बाय कॉल विधि का उदाहरण
void main() {int a = 10,void increment(int);Cout << "before function calling" << a;increment(a);Cout << "after function calling" << a;getch();void increment(int x) {int x = x + 1;Cout << "value is" << x;}
आउटपुट:
before function calling 10value is 11after function calling 1-0
क्योंकि वेरिएबल घोषित 'a'in main () वर्जन में वेरिएबल' x 'से अलग है ()। इस कार्यक्रम में केवल चर नाम समान हैं, लेकिन उनका मेमोरी पता अलग-अलग है और विभिन्न मेमोरी स्थानों में संग्रहीत है।
संदर्भ विधि द्वारा कॉल का उदाहरण
Public static void(string args[]) {int a = 10;System.out.println("Before call Value of a = ", a);Void increment();System.out.println("After call Value of a = ", a);}Void increment(int x) {int x = x + 1;}
आउटपुट:
Before call Value of a =10After call Value of a =11
क्योंकि वेरिएबल घोषित 'a' इन रेफरेंस / पॉइंटिंग टू वेरिएबल 'a' इन मेन () है। यहां चर नाम अलग है, लेकिन दोनों एक ही मेमोरी एड्रेस स्थानों को इंगित / संदर्भित कर रहे हैं।
वैल्यू बाय कॉल बनाम संदर्भ द्वारा कॉल
मापदंडों | मूल्य से बुलाओ | संदर्भ से कॉल करें |
---|---|---|
परिभाषा | किसी फ़ंक्शन को कॉल करते समय, जब आप चर की प्रतिलिपि बनाकर मान पास करते हैं, तो इसे "कॉल बाय वैल्यूज़" के रूप में जाना जाता है। | एक फ़ंक्शन को कॉल करते समय, प्रोग्रामिंग भाषा में चर के मूल्यों को कॉपी करने के बजाय, चर के पते का उपयोग किया जाता है इसे "कॉल बाय संदर्भ" के रूप में जाना जाता है। |
बहस | इस पद्धति में, चर की एक प्रति पारित की जाती है। | इस पद्धति में, एक चर ही पारित किया जाता है। |
प्रभाव | चर की एक प्रति में किए गए परिवर्तन फ़ंक्शन के बाहर चर के मूल्य को कभी भी संशोधित नहीं करते हैं। | चर में परिवर्तन समारोह के बाहर चर के मूल्य को भी प्रभावित करता है। |
मूल्य में परिवर्तन | आपको वास्तविक चर में कोई भी बदलाव करने की अनुमति नहीं देता है। | आपको फ़ंक्शन कॉल का उपयोग करके चर के मूल्यों में परिवर्तन करने की अनुमति देता है। |
चर का पास होना | चर का मान एक सीधी विधि का उपयोग करके पारित किया जाता है। | वेरिएबल्स के पते को स्टोर करने के लिए पॉइंटर वेरिएबल्स की आवश्यकता होती है। |
मूल्य संशोधन | मूल मान संशोधित नहीं किया गया। | मूल मान संशोधित किया गया है। |
मेमोरी स्थान | वास्तविक और औपचारिक तर्क अलग-अलग मेमोरी लोकेशन में बनाए जाएंगे | वास्तविक और औपचारिक तर्क एक ही मेमोरी लोकेशन में बनाए जाएंगे |
सुरक्षा | वास्तविक तर्क सुरक्षित रहते हैं क्योंकि उन्हें गलती से संशोधित नहीं किया जा सकता है। | वास्तविक तर्क सुरक्षित नहीं हैं। उन्हें गलती से संशोधित किया जा सकता है, इसलिए आपको तर्क संचालन को सावधानीपूर्वक संभालने की आवश्यकता है। |
चूक | C ++ PHP जैसी कई प्रोग्रामिंग भाषाओं में डिफ़ॉल्ट। Visual Basic NET, और C #। | यह JAVA जैसी अधिकांश प्रोग्रामिंग भाषाओं द्वारा समर्थित है, लेकिन डिफ़ॉल्ट रूप से नहीं। |
मूल्य विधि द्वारा कॉल का उपयोग करने के लाभ
मूल्य विधि द्वारा किसी कॉल के पेशेवरों / लाभ:
- विधि मूल चर को परिवर्तित नहीं करती है, इसलिए यह डेटा को संरक्षित कर रही है।
- जब भी किसी फ़ंक्शन को कहा जाता है, तो वास्तविक तर्कों की वास्तविक सामग्री को कभी भी प्रभावित न करें।
- औपचारिक तर्कों के लिए पारित वास्तविक तर्कों का मूल्य, इसलिए औपचारिक तर्क में किए गए कोई भी परिवर्तन वास्तविक मामलों को प्रभावित नहीं करते हैं।
संदर्भ विधि द्वारा कॉल का उपयोग करने के लाभ
संदर्भ विधि द्वारा कॉल का उपयोग करने के पेशेवरों:
- फ़ंक्शन तर्क के मूल्य को बदल सकता है, जो काफी उपयोगी है।
- यह केवल एक मान रखने के लिए डुप्लिकेट डेटा नहीं बनाता है जो आपको मेमोरी स्पेस को बचाने में मदद करता है।
- इस पद्धति में, किए गए तर्क की कोई प्रति नहीं है। इसलिए यह बहुत तेजी से संसाधित होता है।
- गलती से किए गए परिवर्तनों से बचने में आपकी मदद करता है
- कोड पढ़ने वाला व्यक्ति कभी नहीं जानता कि फ़ंक्शन में मूल्य को संशोधित किया जा सकता है।
मूल्य विधि द्वारा कॉल का उपयोग करने के नुकसान
मूल्य पद्धति द्वारा किसी कॉल की प्रमुख सूचनाएँ / कमियाँ यहाँ दी गई हैं:
- वास्तविक मापदंडों में परिवर्तन भी इसी तर्क चर को संशोधित कर सकता है
- इस विधि में, तर्क चर होने चाहिए।
- आप सीधे फ़ंक्शन बॉडी में वैरिएबल नहीं बदल सकते।
- शायद ही कभी तर्क जटिल अभिव्यक्ति हो सकती है
- एक ही चर के लिए दो प्रतियां बनाई गई हैं जो स्मृति कुशल नहीं हैं।
संदर्भ विधि द्वारा कॉल का उपयोग करने के नुकसान
यहाँ, संदर्भ विधि द्वारा कॉल का उपयोग करने की प्रमुख विपक्ष हैं:
- मजबूत गैर-शून्य गारंटी। एक संदर्भ में एक फ़ंक्शन को यह सुनिश्चित करने की आवश्यकता है कि इनपुट गैर-शून्य है। इसलिए, अशक्त जांच की आवश्यकता नहीं है।
- संदर्भ से गुजरना समारोह को सैद्धांतिक रूप से शुद्ध नहीं बनाता है।
- एक जीवन भर की गारंटी संदर्भ के साथ एक बड़ा मुद्दा है। यह विशेष रूप से खतरनाक है जब लैम्ब्डा और मल्टी-थ्रेडेड प्रोग्राम के साथ काम करना।