2010-01-30 21 views
7

स्कॉट मेयर्स के प्रभावी सी ++ के पृष्ठ 6 पर, 'कॉपी कन्स्ट्रक्टर' शब्द परिभाषित किया गया है। मैं अपने संदर्भ के रूप में Schiltdt की पुस्तक का उपयोग कर रहा हूं और मुझे कॉपी कन्स्ट्रक्टर का कोई उल्लेख नहीं मिल रहा है। मुझे विचार मिलता है लेकिन क्या यह सी ++ का मानक हिस्सा है? क्या इस तरह के रचनाकारों को कॉल के आधार पर कक्षा उत्तीर्ण की जाएगी?सी ++ में एक कॉपी कन्स्ट्रक्टर क्या है?

+12

ठीक है, कि Schildt की खासियत होगा - पृथ्वी पर क्यों लोग अपनी पुस्तकों में प्रयोग करते हैं? –

+4

कृपया, शीतल की किताबों को नमक के अनाज के बिना न लें। "बुल्सचिल्ड" शब्द के लिए Google और अपने लिए देखें। अधिक गंभीरता से, एसीसीयू पर शिलल्ट की किताबों की समीक्षा पढ़ें; उनमें से ज्यादातर अनुकूल नहीं हैं। –

+1

@Neil: हालांकि मैंने शिलल्ट की किताबों के बारे में भी बुरी बातें सुनी हैं, लेकिन यह विश्वास करना मुश्किल है * यह प्रतिलिपि बनाने वालों के बारे में बात नहीं करता है। –

उत्तर

9

एक प्रति निर्माता निम्नलिखित रूप है।

void foo(example x); 

int main(void) 
{ 
    example x1; //normal ctor 
    example x2 = x1; // copy ctor 
    example x3(x2); // copy ctor 

    foo(x1); // calls the copy ctor to copy the argument for foo 

} 
+2

केवल तभी 'foo' में प्रोटोटाइप' शून्य foo (उदाहरण x) है; '। उदाहरण के लिए, 'शून्य foo (कॉन्स उदाहरण & x);' किसी भी निर्माता को कॉल नहीं करेगा। या 'शून्य foo (int x);' जो एक कंपाइलर त्रुटि नहीं है, तो एक कास्ट ऑपरेटर 'ऑपरेटर int() 'को कॉल कर सकता है। – kennytm

+1

मेरे पास है – DerKuchen

+0

-1 "एक प्रतिलिपि बनाने वाले के पास निम्न प्रपत्र है:" गलत है। कॉपी कन्स्ट्रक्टर के चार संभावित रूप हैं। इसके अलावा कक्षा का उदाहरण वाक्य रचनात्मक रूप से अमान्य है –

14

हां, कॉपी कन्स्ट्रक्टर निश्चित रूप से मानक सी ++ का एक अनिवार्य हिस्सा हैं। उनके बारे में और पढ़ें (और अन्य रचनाकार) here (सी ++ एफएक्यू)।

यदि आपके पास सी ++ पुस्तक है जो प्रतिलिपि बनाने वालों के बारे में नहीं सिखाती है, तो इसे फेंक दें। यह एक बुरी किताब है।

4

विकिपीडिया पर Copy constructor देखें।

class Foo { 
    public: 
    Foo();    // default constructor 
    Foo(const Foo& foo); // copy constructor 

    // ... 
}; 

एक उदाहरण foo को देखते हुए,

Foo bar(foo); 

या

Foo bar = foo; 

साथ प्रतिलिपि निर्माता आह्वान:

मूल विचार प्रतिलिपि कंस्ट्रक्टर्स मौजूदा कॉपी करके नई उदाहरणों का दृष्टांत है मानक टेम्पलेट लाइब्रेरी के कंटेनरों को ऑब्जेक्ट टी की आवश्यकता होती है o प्रतिलिपि योग्य और असाइन करने योग्य हो, इसलिए यदि आप std::vector<YourClass> का उपयोग करना चाहते हैं, तो सुनिश्चित करें कि एक उचित प्रतिलिपि निर्माता और operator= परिभाषित करें यदि संकलक-जेनरेट किए गए डिफ़ॉल्ट समझ में नहीं आते हैं।

class example 
{ 
    example(const example&) 
    { 
     // this is the copy constructor 
    } 
} 

निम्न उदाहरण से पता चलता है, जहां यह कहा जाता है:

0

एली द्वारा पोस्ट किया गया सी ++ एफएक्यू लिंक अच्छा है और gbacon की पोस्ट सही है।

स्पष्ट रूप से अपने प्रश्न के दूसरे भाग का उत्तर देने के लिए: हाँ, जब आप किसी ऑब्जेक्ट आवृत्ति को मूल्य से पास करते हैं तो कॉपी कन्स्ट्रक्टर का उपयोग फ़ंक्शन कॉल के दायरे में ऑब्जेक्ट का स्थानीय उदाहरण बनाने के लिए किया जाएगा। प्रत्येक ऑब्जेक्ट में "डिफॉल्ट कॉपी कन्स्ट्रक्टर" होता है (gbacon इसे "कंपाइलर जेनरेट डिफॉल्ट" के रूप में इंगित करता है) जो कि प्रत्येक ऑब्जेक्ट सदस्य की प्रतिलिपि बनाता है - उदाहरण के लिए, यदि आपके ऑब्जेक्ट इंस्टेंस में पॉइंटर्स या संदर्भ हैं, तो यह वही नहीं हो सकता है।

सी ++ सीखने के लिए अच्छी किताबों के बारे में - मैंने पहली बार इसे लगभग दो दशकों पहले सीखा और इसके बाद से यह एक अच्छा सौदा बदल गया है - मैं ब्रूस एकल के "सोचने वाले सी ++" संस्करण 1 और 2 की सिफारिश करता हूं, यहां मुफ्त में उपलब्ध है (PDF और एचटीएमएल फार्म) में:

http://www.ibiblio.org/pub/docs/books/eckel/

2

कॉपी निर्माता तो निम्न परिदृश्यों में बुलाया जाएगा:

  • जब किसी मौजूदा ऑब्जेक्ट से नई वस्तुओं का निर्माण।

    MyClass Obj1; 
    MyClass Obj2 = Obj1; // Here assigning Obj1 to newly created Obj2 
    

    या

    MyClass Obj1; 
    MyClass Obj2(Obj1); 
    
  • जब मूल्य द्वारा वर्ग वस्तु गुजर।

    void NewClass::TestFunction(MyClass inputObject_i) 
    { 
        // Function body 
    } 
    

    मूल्य से पारित MyClass ऑब्जेक्ट के ऊपर। तो MyClass के कन्स्ट्रक्टर की प्रतिलिपि कॉल करेंगे। कॉपी कन्स्ट्रक्टर कॉलिंग से बचने के संदर्भ में पास करें।

  • जब मूल्य द्वारा वस्तुओं लौटने

    MyClass NewClass::Get() 
    { 
        return ObjMyClass; 
    } 
    

    MyClass से ऊपर कीमत की दृष्टि से लौटे, तो कॉपी MyClass के निर्माता कॉल करेंगे है। कॉपी कन्स्ट्रक्टर कॉलिंग से बचने के संदर्भ में पास करें।

1

कॉपी कन्स्ट्रक्टर सी ++ का एक अनिवार्य हिस्सा है। भले ही कोई सी ++ कंपाइलर डिफॉल्ट कॉपी कन्स्ट्रक्टर प्रदान करता है, अगर हम कक्षा में स्पष्ट रूप से इसे परिभाषित नहीं करते हैं, तो हम निम्नलिखित दो कारणों से कक्षा के लिए कॉपी कन्स्ट्रक्टर लिखते हैं।

  1. यदि कक्षा में कोई गतिशील स्मृति आवंटन है।
  2. यदि हम कक्षा के अंदर सूचक चर का उपयोग करते हैं। (अन्यथा यह में एक उथले प्रति 2 वस्तुओं एक ही स्मृति स्थान को इंगित करेंगे।)

एक गहरी प्रतिलिपि बनाने के लिए, आप एक प्रति निर्माता लिखने और असाइनमेंट ऑपरेटर को ओवरलोड चाहिए, अन्यथा प्रतिलिपि होगा विनाशकारी परिणामों के साथ मूल को इंगित करें।

प्रतिलिपि निर्माता वाक्य रचना नीचे के रूप में लिखा जाएगा:

class Sample{ 

public: 
    Sample (const Sample &sample); 

}; 

int main() 
{ 

    Sample s1; 
    Sample s2 = s1; // Will invoke Copy Constructor. 
    Sample s3(s1);  //This will also invoke copy constructor. 

    return 0; 
} 
संबंधित मुद्दे