1: मूल्य द्वारा तर्क पारित करना
चर की एक प्रति बनाई जाती है और फ़ंक्शन को प्रदान की जाती है जब तर्क मूल्य द्वारा पारित किए जाते हैं . फ़ंक्शन के अंदर वेरिएबल में किए गए सभी संशोधन केवल कॉपी को प्रभावित करते हैं; मूल चर में कुछ भी नहीं बदला है। नतीजतन, मूल्य से गुजर रहा है एक सुरक्षित तरीका है क्योंकि मूल चर के मूल्य को अनजाने में संशोधित करने की कोई संभावना नहीं है।
मूल्य से गुजरना , हालांकि, अप्रभावी हो सकता है, विशेष रूप से बड़े या जटिल डेटा प्रकारों के साथ व्यवहार करते समय। प्रत्येक फ़ंक्शन कॉल के लिए डेटा की एक प्रति की आवश्यकता होती है, जो CPU और मेमोरी संसाधनों को जल्दी से समाप्त कर सकती है। आगे, मूल्य से गुजर रहा है उन कार्यों के लिए उपयोग नहीं किया जा सकता है जो मूल चर के मान को बदलने का लक्ष्य रखते हैं क्योंकि प्रतिलिपि और मूल चर जुड़े नहीं हैं।
2: संदर्भ द्वारा तर्क पारित करना
चर हो सकते हैं संदर्भ द्वारा पारित C++ में भी, जो इन समस्याओं को हल करने में मदद करता है। मूल चर को फ़ंक्शन में कब भेजा जाता है संदर्भ से गुजर रहा है , और फ़ंक्शन के अंदर वेरिएबल में किया गया कोई भी संशोधन मूल वेरिएबल को भी प्रभावित करेगा। इसके कारण, संदर्भ से गुजर रहा है बड़े या जटिल डेटा प्रकारों के लिए काफी अधिक प्रभावी है और प्रतिलिपि बनाने की आवश्यकता से बचा जाता है।
अनपेक्षित संशोधनों को रोकने के लिए, एक फ़ंक्शन को स्पष्ट रूप से कॉन्स्ट के रूप में नामित किया जाना चाहिए। फ़ंक्शन डिक्लेरेशन में कॉन्स्टेबल कीवर्ड जोड़ना, जैसा कि 'इंट कैलकुलेट (कॉन्स्ट इंट एंड ए, कॉन्स्ट इंट एंड बी)' में होता है, इसे पूरा करेगा।
हालाँकि, संदर्भ द्वारा तर्क पारित करना विस्तार पर भी सावधानीपूर्वक ध्यान देने की आवश्यकता है। अनुभवहीन प्रोग्रामर गलतियाँ कर सकते हैं, जैसे अनजाने में साइड इफेक्ट बनाना, डेटा का अनपेक्षित साझाकरण और बाहरी डेटा को ओवरराइड करना।
निम्नलिखित कोड पर विचार करें जो दोनों को प्रदर्शित करता है तर्क पारित करने के तरीके :
#शामिलनेमस्पेस एसटीडी का उपयोग करना ;
खालीपन पासबायवैल्यू ( int यहाँ एक्स ) {
एक्स = 5 ;
अदालत << 'पासबीवैल्यू के अंदर:' << एक्स << endl ;
}
खालीपन पासबाय रेफरेंस ( int यहाँ और एक्स ) {
एक्स = 5 ;
अदालत << 'इनसाइड पासबी रेफरेंस:' << एक्स << endl ;
}
int यहाँ मुख्य ( ) {
int यहाँ संख्या 1 = 2 , num2 = 2 ;
अदालत << 'फ़ंक्शन कॉल से पहले: संख्या 1 =' << संख्या 1 << 'संख्या 2 =' << num2 << endl ;
पासबायवैल्यू ( संख्या 1 ) ;
पासबाय रेफरेंस ( num2 ) ;
अदालत << 'फ़ंक्शन कॉल के बाद: संख्या 1 =' << संख्या 1 << 'संख्या 2 =' << num2 << endl ;
वापस करना 0 ;
}
उपरोक्त कोड में, पहला कार्य, पासबायवैल्यू , मान के आधार पर एक पूर्णांक तर्क प्राप्त करता है। फ़ंक्शन के भीतर, एक नया पूर्णांक चर बनाया जाता है और मान 5 असाइन किया जाता है। मूल पूर्णांक अपरिवर्तित रहता है। दूसरा समारोह, पासबाय रेफरेंस , संदर्भ द्वारा एक पूर्णांक तर्क प्राप्त करता है। इस स्थिति में, फ़ंक्शन सीधे मूल चर में हेरफेर करता है।
उत्पादन
जैसा कि अपेक्षित था, पहली कॉल 5 का उत्पादन करती है, लेकिन मूल चर पर कोई प्रभाव नहीं पड़ता है। इसके विपरीत, दूसरी कॉल संख्या 2 के मान को 5 में बदल देती है, जो अंतिम विवरण के आउटपुट को प्रभावित करती है।
वैल्यू बनाम पास बाय रेफरेंस
1: फ़ंक्शन को कॉल करने का तरीका
के बीच एक अंतर मूल्य से गुजर रहा है और संदर्भ से गुजर रहा है फ़ंक्शन को कैसे कहा जाता है। कब मूल्य से गुजर रहा है , फ़ंक्शन कॉल में वेरिएबल का मान शामिल होना चाहिए, जैसे `गणना (ए, बी)`। कब संदर्भ से गुजर रहा है , फ़ंक्शन कॉल में वेरिएबल का मेमोरी पता शामिल होना चाहिए, जो एंपरसेंड वर्ण द्वारा दर्शाया गया हो, जैसे कि `गणना करें(&a, &b)`।
2: डेटा प्रकार
सामान्य रूप में, मूल्य से गुजर रहा है छोटे या सरल डेटा प्रकारों के साथ काम करते समय या जब फ़ंक्शन मूल चर को संशोधित करने का इरादा नहीं रखता है तो सबसे उपयुक्त होता है। संदर्भ से गुजरना बड़े या जटिल डेटा प्रकारों के लिए अधिक उपयुक्त है, या जब फ़ंक्शन का उद्देश्य मूल चर के मान को संशोधित करना है।
निष्कर्ष
जब पैरामीटर हैं मूल्य से पारित एक समारोह के लिए, चर की एक प्रति बनाई और आपूर्ति की जाती है। द्वारा संदर्भ से गुजर रहा है , मूल चर फ़ंक्शन को भेजा जाता है। सी ++ में, मूल्य या संदर्भ द्वारा तर्क पारित करना एक मौलिक अवधारणा है। सही दृष्टिकोण का चयन विशिष्ट परिस्थितियों पर निर्भर करता है और इसका सावधानीपूर्वक मूल्यांकन किया जाना चाहिए। प्रयोग करने के फायदे संदर्भ आसान उपयोग करने के प्रलोभन के बावजूद दृष्टिकोण अधिक प्रभावी कोड में परिणाम कर सकता है मूल्य से गुजर रहा है तरीका।