2009-03-20 8 views
20

मैं निर्माता कॉपी समझने के तीन मामलोंसी ++ में प्रतिलिपि बनाने वाले को किसी फ़ंक्शन से ऑब्जेक्ट लौटाया जाता है?

  1. पर बुलाया जब एक वस्तु instantiating और किसी अन्य वस्तु से मूल्यों के साथ यह शुरू कर रहा है।
  2. मूल्य से ऑब्जेक्ट पास करते समय।

3. जब किसी ऑब्जेक्ट को किसी फ़ंक्शन से मूल्य से वापस किया जाता है।

मेरे पास नंबरके साथ प्रश्न है यदि ऑब्जेक्ट मान लौटाए जाने पर कॉपी कन्स्ट्रक्टर को बुलाया जाता है, तो अगर कार्य को स्थानीय रूप से ऑब्जेक्ट घोषित किया जाता है तो यह समस्याएं पैदा नहीं करनी चाहिए।

मेरा मतलब प्रतिलिपि निर्माता एक गहरी प्रतिलिपि से एक है और पैरामीटर

+3

यह गारंटी नहीं है कि प्रतिलिपि बनाने वालों को इन मामलों में बुलाया जाएगा, क्योंकि सी ++ मानक संकलक को कुछ मामलों में कॉपी को अनुकूलित करने की अनुमति देता है - विशेष रूप से [वापसी मूल्य अनुकूलन] (http: // en .wikipedia.org/विकी/Return_value_optimization) – rmp251

+0

@ rmp251 द्वारा उल्लिखित संदर्भ स्पष्ट रूप से इस प्रश्न का उत्तर देता है। –

उत्तर

15

इसे समस्याओं से बचने के लिए बिल्कुल कहा जाता है। परिणामस्वरूप सेवा करने वाली एक नई वस्तु स्थानीय रूप से परिभाषित वस्तु से शुरू की जाती है, फिर स्थानीय रूप से परिभाषित वस्तु नष्ट हो जाती है।

गहरे प्रति उपयोगकर्ता उपयोगकर्ता परिभाषित कन्स्ट्रक्टर के मामले में यह वही है। ऑब्जेक्ट के लिए पहला स्टोरेज आवंटित किया जाता है जो परिणाम के रूप में कार्य करेगा, फिर कॉपी कन्स्ट्रक्टर कहा जाता है। यह स्थानीय रूप से परिभाषित वस्तु तक पहुंचने के लिए पारित संदर्भ का उपयोग करता है और नई वस्तु के लिए आवश्यक है की प्रतिलिपि बनाता है।

0

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

+0

लेकिन क्या होगा यदि कॉपी कन्स्ट्रक्टर पैरामीटर (गहरी प्रतिलिपि) के रूप में संदर्भ लेता है, उस स्थिति में यह पूरी वस्तु की प्रतिलिपि नहीं करेगा, है ना? – Kazoom

+0

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

11

प्रतिलिपि फ़ंक्शन से बाहर निकलने से पहले प्रतिलिपि की जाती है, और तत्काल मौजूदा स्थानीय चर को वापसी मूल्य में प्रतिलिपि बनाता है।

बुलाए गए फ़ंक्शन में मेमोरी तक पहुंच है, रिटर्न वैल्यू पर कब्जा होगा, भले ही वह प्रतिलिपि बनाये जाने पर "स्कोप" न हो, यह अभी भी उपलब्ध है।

+0

मैं समझता हूं कि जब ऑब्जेक्ट वैल्यू वापस किया जा रहा है, तो यह पहले कॉपी कन्स्ट्रक्टर को कॉल करेगा, लेकिन प्रतिलिपि बनाने वाला निर्माता उपयोगकर्ता परिभाषित करता है कि यह पैरामीटर क्लासए (कॉन्स क्लास ए) के रूप में संदर्भ लेता है, उस स्थिति में क्या होगा? क्या होता है यदि आप यूआर तर्क – Kazoom

+0

द्वारा जाने वाले मूल्य के बजाय संदर्भ वापस कर देते हैं यदि फ़ंक्शन को स्थानीय चर के संदर्भ को वापस करने के संदर्भ को संदर्भित करने के रूप में घोषित किया गया है तो ऐसा करने के लिए कोई बड़ा नंबर नहीं है। आप किसी ऑब्जेक्ट का संदर्भ वापस कर देंगे जो फ़ंक्शन रिटर्न पर छोड़ा जाएगा। इस संदर्भ का उपयोग करने से समस्या हो सकती है, क्रश शामिल हैं। – sharptooth

+0

हाँ मैं इसे समझता हूं, इसलिए जब एक प्रतिलिपि बनाने वाला जो पैरामीटर के रूप में संदर्भ ले रहा है उसे मूल्य लौटने पर बुलाया जा रहा है, तो क्या होगा? क्या यह भी क्रैश नहीं होना चाहिए? – Kazoom

4

मेरे सवाल का an answer के अनुसार, प्रति निर्माता भी दो बार कहा जा सकता है: एक बार वापसी 'वस्तु' पर एक स्थानीय वस्तु कॉपी करने के लिए, और एक बार चर इसे करने के लिए सौंपा गया था पर वापसी वस्तु कॉपी करने के लिए।

हालांकि, यह की आवश्यकता नहीं है! संकलक दोनों कॉपी निर्माण को अनुकूलित कर सकते हैं।

+2

मैं आपसे असहमत हूं। कॉपी कन्स्ट्रूटर को लौटने वाली ऑब्जेक्ट पर केवल एक बार बुलाया गया था, जब लौटा ऑब्जेक्ट को किसी अन्य बाहरी स्कोप ऑब्जेक्ट में असाइन किया जाता है, तो असाइनमेंट ऑपरेटर को कॉपी कन्स्ट्रक्टर नहीं कहा जाता है। –

-1

तीन सामान्य मामलों में जहां प्रति निर्माता कहा जाता है के होते हैं:

  1. जब एक वस्तु instantiating और यह (एक ही प्रकार के) किसी अन्य वस्तु से मूल्यों के साथ आरंभ।
  2. मूल्य से ऑब्जेक्ट पास करते समय।
  3. जब किसी ऑब्जेक्ट को किसी फ़ंक्शन से मूल्य से वापस किया जाता है।
संबंधित मुद्दे