2010-11-27 28 views
10

करने के लिए कोई कॉल दिया कोडप्रतिलिपि निर्माता

struct ABC 
{ 
    ABC() 
    { 
     std::cout<<" Calling from default constructor"; 
    } 

    ABC(const ABC &copy) 
    { 
     std::cout<<"Calling from copy constructor"; 
    } 
}; 

int main() 
{ 
    ABC abc = ABC(); 
} 

पर विचार करें मैं दो प्रश्न


क्यू 1) प्रतिलिपि निर्माता पैरामीटर घोषणा से स्थिरांक निकाल रहा है त्रुटि देता है। क्यूं कर?

प्रश्न 2) कॉन्स कीवर्ड जोड़ने के बाद मुझे कॉपी कन्स्ट्रक्टर को कॉल नहीं दिखाई देता है। क्यूं कर? कॉपी कन्स्ट्रक्टर को कॉल नहीं किया जाता है तो क्यों आवश्यक है?


TIA

+0

मैं क्यू 3 जोड़ूंगा) उस लाइन को 'एबीसी एबीसी (एबीसी()) में बदलने के बाद कुछ भी क्यों प्रदर्शित नहीं होता है; '? – Kos

+2

उत्तर (क्यू 3) [यहां] (http://stackoverflow.com/questions/4283576/constructor-invocation-mechanism/4283589#4283589)। क्यू 1 और क्यू 2 के जवाब [यहां] (http://stackoverflow.com/questions/4286301/why-isnt-the-copy-constructor-called-here/4286330#4286330) –

+0

@P्रासून: क्यू 1 का लिंक में उत्तर नहीं दिया गया है आपने पोस्ट किया – ybungalobill

उत्तर

5
  1. आप स्थिरांक की जरूरत है, क्योंकि आप एक अस्थायी एबीसी() जो स्थिरांक है साथ एबीसी प्रारंभ करने का प्रयास करें। इसलिए यदि कन्स्ट्रक्टर का आधार नहीं है तो संकलक को कोड को अस्वीकार कर देना चाहिए।

  2. इसे बनाने के बाद कोड मानक शिकायत है और संकलक इसे संकलित कर सकता है। हालांकि मानक में कहा गया है कि इस मामले में प्रतिलिपि को अनुकूलित करने की अनुमति है, इसलिए यह कॉपी कन्स्ट्रक्टर को कॉल हटा देता है।

+0

@ybungalobill: कंपाइलर सभी परिदृश्यों में कॉपी कन्स्ट्रक्टर उत्पन्न नहीं करता है, भले ही आप स्पष्ट रूप से एक लिखने वाले व्यक्ति को नहीं लिखते बिल्कुल हस्ताक्षर। मैं नियमों को याद नहीं कर सकता, लेकिन वे हमेशा उत्पन्न नहीं होते हैं। – Puppy

+0

@DeadMG: किसने कहा कि वे हमेशा उत्पन्न होते हैं? वास्तव में? कनेक्शन क्या है? वे उत्पन्न नहीं होते हैं जब उन्हें उत्पन्न नहीं किया जा सकता है (जैसे कि जब आपके पास बेस क्लास या कॉपी कन्स्ट्रक्टर आदि के सदस्य हैं ...)। इस उदाहरण में कॉपी कन्स्ट्रक्टर उत्पन्न होता है। – ybungalobill

+2

आप डिफ़ॉल्ट प्रतिलिपि कन्स्ट्रक्टर के बारे में गलत हैं: "कक्षा 'एक्स' के लिए एक गैर-टेम्पलेट कन्स्ट्रक्टर एक प्रतिलिपि बनाने वाला है यदि इसका पहला पैरामीटर' एक्स एंड ',' कॉन्स एक्स ',' अस्थिर एक्स 'या' कॉन्स अस्थिर एक्स & ', और या तो कोई अन्य पैरामीटर नहीं हैं या अन्य सभी पैरामीटर में डिफ़ॉल्ट तर्क हैं" – UncleBens

1

आप भी असाइनमेंट ऑपरेटर निर्धारित करते हैं तो आप देखेंगे कि भी नहीं है कि एक कहा जाता हो जाता है:, संकलक ABC abc; में ABC abc = ABC(); का अनुकूलन के बाद से वे एक ही अर्थ विज्ञान मिल गया है।

अन्य संदेह के बारे में, जी ++ कॉपी कन्स्ट्रक्टर पैरामीटर को गैर-कॉन्स के रूप में घोषित करने की शिकायत नहीं करता है (-Wall -W -std=c++98 के साथ भी नहीं)। वैसे भी इस बारे में मानक की जांच नहीं की।

+0

होगा 'आप' - ', लेकिन एक चीज़ भी नहीं बदलती है। लेकिन वास्तव में आश्चर्य की बात नहीं है - कुछ मामलों में केवल गैर-कॉन्स ऑब्जेक्ट्स के लिए प्रतिलिपि बनाने की अनुमति क्यों नहीं है? या कॉन्स और गैर-कॉन्स के लिए अलग-अलग प्रति रचनाकार? उल्लेख करने के लिए – Kos

2

कॉन्स आवश्यक है क्योंकि आपको किसी अस्थायी संदर्भ में अस्थायी बांधने की अनुमति नहीं है। भले ही संकलक कॉपी कन्स्ट्रक्टर को अनुकूलित करता है, जो बाद के चरण तक नहीं है।

सी ++ 0x मानक रैवल्यू संदर्भों के अतिरिक्त इसे संबोधित कर रहा है। जो आप कॉपी से एक गैर स्थिरांक को स्थिरांक पैरामीटर ड्रॉप करने ...

ABC(ABC&& copy) 

हालांकि आप अभी भी नियमित संदर्भ प्रतिलिपि निर्माता चाहेगा ...

+0

+1; इसे "चालक कन्स्ट्रक्टर" कहा जाता है, मुझे लगता है? – Kos

+0

@kos: अक्सर बार हां, लेकिन कुछ भी नहीं कहता है कि इसे चलने वाले अर्थशास्त्र का पालन करना है (यानी मूल वस्तु को डिफ़ॉल्ट निर्मित स्थिति में छोड़ दें), इसलिए यदि आप केवल अस्थायी के लिए प्रतिलिपि बनाना चाहते हैं, तो यह भी अच्छी तरह से काम करता है। – diverscuba23

3

क्यू 1) निकाल रहा है स्थिरांक की अनुमति होगी कन्स्ट्रक्टर पैरामीटर घोषणा त्रुटि देता है। क्यूं कर?

ABC abc = ABC(); 

ABC abc((ABC())); 

जब से तुम प्रतिलिपि निर्माता के लिए एक अस्थायी से गुजर रहे हैं, यह केवल स्थिरांक संदर्भ, नहीं गैर स्थिरांक संदर्भ के लिए बाध्य कर सकते हैं के बराबर है।

एक प्रतिलिपि गैर-कॉन्स संदर्भ (उदाहरण std::auto_ptr) ले सकती है, लेकिन इसका मतलब है कि उनका उपयोग अधिक प्रतिबंधित है।

Q2) स्थिरांक कीवर्ड मैं प्रतिलिपि निर्माता के लिए एक कॉल को देखने न जोड़ने के बाद। क्यूं कर? प्रतिलिपि बनाने वाले को कॉल नहीं किया जाता है तो आवश्यक क्यों है?

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

हालांकि, अगर कन्स्ट्रक्टर की प्रतिलिपि बनाने के लिए कॉल को अनुकूलित किया गया है, तो संकलक को यह जांचना होगा कि कोड लिखित के रूप में मान्य होगा - जैसे प्रतिलिपि निर्माण को अनुकूलित नहीं किया गया था।

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