दिलचस्प पोस्ट
मुझे जावा में मानक ट्री आधारित मानचित्र कार्यान्वयन कहां मिल सकता है? मैं एक एसिंक टास्क <T> पद्धति को सिंक्रोनस कैसे चलाऊँ? जावा में कोई थ्रेड रोकना? JS / jQuery में बाध्यकारी तीर कुंजियाँ आर में एक साथ दो हिस्टोग्राम कैसे छापें? Json.NET कैश प्रकार 'serialization जानकारी है? कैसे जावा ऑब्जेक्ट के लिए Firebase डेटा कन्वर्ट करने के लिए …? फ़ाइलें ढूंढें और उन्हें टाल करें (रिक्त स्थान के साथ) आप jQuery में एक तत्व का चयन करें एक विशेष विकल्प कैसे चुनते हैं? हम यह निर्धारित करने के लिए कि क्या यह प्रधानमंत्री है, प्रधानमांक संख्या के वर्गमूल की जांच क्यों की जाती है? स्काला में नाम से कॉल बनाम कॉल करके कॉल करें, स्पष्टीकरण की आवश्यकता है क्या डब्लूपीएफ में संदेशबॉक्सेज़ है? ईएफ कोड में परिकलित कॉलम पहले एक शब्द में सिलेबल्स का पता लगा रहा है समानांतर क्यों है। बहुत तेजी से बढ़ोतरी के लिए तो AsParallel ()। ForAll () हालांकि एमएसडीएन अन्यथा सुझाव देता है?

मुझे पास-बाय-रेफरेंस या पास-बाय-वैल्यू कहां पसंद करना चाहिए?

मुझे किन परिस्थितियों में पास-बाय-रेफरेंस पसंद करना चाहिए? दर्रा-दर-मूल्य?

Solutions Collecting From Web of "मुझे पास-बाय-रेफरेंस या पास-बाय-वैल्यू कहां पसंद करना चाहिए?"

पांच प्रमुख मामलों में आपको पास-बाय-वैल्यू पर पास-बाय-रेफरी का उपयोग करना चाहिए:

  1. अगर आप किसी ऐसे फ़ंक्शन को बुला रहे हैं जिसे अपने तर्कों को संशोधित करने की ज़रूरत है, पास-बाय-संदर्भ का उपयोग करें, इसका प्रभाव प्राप्त करने का एकमात्र तरीका है (मैं पास-बाय-रेफरेंस और पास-बाय-पॉइंटर को इस मामले में एक-दूसरे के साथ व्यवहार करता हूं, हालांकि पास में बाय-पॉइंटर आपको अक्सर स्पष्ट रूप से नल के लिए जांचना होगा)।
  2. यदि आप किसी फ़ंक्शन को कॉल कर रहे हैं जिसे पैरामीटर के रूप में एक बड़ी ऑब्जेक्ट लेने की जरूरत है, तो उस संदर्भ के द्वारा इसे उस ऑब्जेक्ट की एक अनावश्यक प्रतिलिपि बनाने और एक बड़ी दक्षता हिट करने से बचने के लिए पास करें।
  3. यदि आप एक प्रतिलिपि कन्स्ट्रक्टर लिख रहे हैं जो परिभाषा से संदर्भ लेना चाहिए, तो संदर्भ से पास का उपयोग करें।
  4. यदि आप कोई ऐसा कार्य लिख रहे हैं जो बहुरूपक वर्ग पर काम करना चाहता है, तो टुकड़े टुकड़े से बचने के लिए संदर्भ से पास का उपयोग करें या पॉइंटर द्वारा पास करें।
  5. यदि आप किसी फ़ंक्शन लिख रहे हैं जो एक बहुत बड़ी या अपरिवर्तनीय वस्तु वापस कर सकता है, तो संदर्भ से पास का उपयोग करके उत्पादित मान को संगृहीत करने के लिए एक पैरामीटर का उपयोग करने के तरीके के रूप में उपयोग करें।

इसमें कई विचार हैं, जिनमें शामिल हैं:

प्रदर्शन

मूल्य से पारित डेटा को कॉपी करता है, इसलिए मूल्य से बड़ी डेटा संरचना पारित करना प्रदर्शन को रोक सकता है। संदर्भ द्वारा पासिंग केवल डेटा का एक संदर्भ (मूल रूप से पता) पास करता है बड़े डेटा संरचनाओं के लिए, यह प्रदर्शन को बहुत सुधार सकता है। छोटे डेटा संरचनाओं (जैसे एक पूर्णांक) के लिए, संदर्भ द्वारा पारित प्रदर्शन को रोक सकता है।

संशोधन

मूल्य से पारित डेटा को कॉपी करता है, इसलिए यदि लक्ष्य कोड उस प्रति को संशोधित करता है, तो यह मूल को प्रभावित नहीं करेगा। संदर्भ द्वारा पासिंग केवल डेटा का पता गुज़रता है, इसलिए उस संदर्भ के विरुद्ध किए गए संशोधनों को कॉलिंग कोड के "दृश्यमान" होगा।

हाँ।

मूल प्रकार जैसी चीजों के लिए मूल्य से पास करें जो कि छोटे होते हैं, जो उन्हें सीधे पास करते हैं वह कुशल है अन्यथा पास ( const ) संदर्भ से पास का उपयोग करें

कठिन हिस्सा एक ऐसा टेम्प्लेट लिख रहा है जो या तो (जो मामले में, आप आमतौर पर संदर्भ से पास का उपयोग करना चाहते हैं – मान द्वारा एक बड़ी ऑब्जेक्ट पास करने के लिए संभावित दंड संदर्भ से गुजरने के लिए संभावित दंड से बहुत खराब होता है मूल्य से वरीयता दी जाएगी)।

संपादित करें: यह निश्चित रूप से ऐसी स्थिति मान रहा है जहां आवश्यक शब्दों को या तो एक की अनुमति होगी – जाहिर है कि आप बहुरूपिक वस्तुओं की तरह कुछ काम कर रहे हैं, इसमें कोई वास्तविक "वरीयता" शामिल नहीं है, क्योंकि आपको एक सूचक या संदर्भ का उपयोग करना चाहिए सही व्यवहार प्राप्त करें

जैसा कि पहले से आपने आपके प्रश्न का पर्याप्त रूप से अच्छा जवाब दिया है, मैं एक महत्वपूर्ण बिंदु जोड़ना चाहता हूं:

अगर कक्षा में public कॉपी-कन्स्ट्रक्टर नहीं है, तो आपके पास मूल्य से गुजारने का विकल्प नहीं है; आपको संदर्भ से पास करना होगा (या आप संकेतक पारित कर सकते हैं)

निम्न प्रोग्राम संकलित नहीं होगा:

 class A { public: A(){} private: A(const A&) {} }; //source of error : pass by value void f(A ) {} int main() { A a; f(a); return 0; } 

त्रुटि:

prog.cpp: फ़ंक्शन 'int main ()' में:
prog.cpp: 10: त्रुटि: 'ए :: ए (कॉन्स्ट ए और)' निजी है
prog.cpp: 18: त्रुटि: इस संदर्भ में
prog.cpp: 18: त्रुटि: 'void f (A)' का तर्क 1 आरंभ करना

अपने आप को विचारधारा में देखें: http://www.ideone.com/b2WLi

लेकिन एक बार जब आप संदर्भ से फ़ंक्शन पास करते हैं, तो यह ठीक ठीक बनाता है: http://www.ideone.com/i6XXB

आपने अपने प्रश्न को सी और सी ++ दोनों के साथ टैग किया है

इसलिए, मैं सुझाव देता हूं कि आप सी ++ में संदर्भ द्वारा पास का उपयोग करने पर विचार कर रहे हैं जो इस सुविधा का समर्थन करता है और आप इसे सी में उपयोग करने पर विचार नहीं करते जो इस सुविधा का समर्थन नहीं करता है।

संकेतक संदर्भ हैं, सी ++ में "संदर्भ" आमतौर पर कुछ प्रकार के एक पैरामीटर को टैग करने के अभ्यास से संबंधित है।

जो आपको कभी नहीं करना चाहिए यह एकमात्र ऐसा स्थान है जो विभिन्न प्री-डिफ़ाइंड ऑपरेटरों को लागू करने के लिए आवश्यक एक जादू सिंटैक्स के रूप में है। अन्यथा:

  • आपको संदर्भ से मापदंडों को कभी भी पारित नहीं करना चाहिए – पॉइंटर से पास करना, अन्यथा आप कोड समीक्षा को सभी लेकिन असंभव बनाते हैं संदर्भ से पास होने से कॉल की जांच करके यह कहना असंभव हो जाता है कि पैरामीटर को परिवर्तित करने की उम्मीद की जा सकती है।

  • आपको संदर्भ से पैरामीटर में कभी भी नहीं करना चाहिए। फिर, इसका मतलब है कि आप मेटा अनुकूलन कर रहे हैं आपको हमेशा पास-बाय-वैल्यू हमेशा ही करना चाहिए, अन्यथा आप किसी ऑब्जेक्ट के अंदर दिखने, इसके कार्यान्वयन की जांच करने और निर्णय लेने से किसी कारण के लिए पास-बाय-रेफ़रल पसंद करते हैं।

किसी भी सी + + क्लास को सभी प्रतिलिपि और असाइनमेंट कन्स्ट्रस्ट्रक्टर को लागू करना चाहिए और मूल्य के द्वारा पारित होने के लिए जरूरी ओवरलोड चाहिए। अन्यथा, यह प्रोग्राम की कक्षा के क्रियान्वयन के विवरण से, इसका काम नहीं कर रहा है।