"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > C++ में उपयोगकर्ता-परिभाषित कॉपी कंस्ट्रक्टर कब आवश्यक है?

C++ में उपयोगकर्ता-परिभाषित कॉपी कंस्ट्रक्टर कब आवश्यक है?

2024-11-06 को प्रकाशित
ब्राउज़ करें:831

When Is a User-Defined Copy Constructor Essential in C  ?

उपयोगकर्ता-परिभाषित कॉपी कंस्ट्रक्टर की आवश्यकता कब होती है?

कॉपी कंस्ट्रक्टर सी ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के अभिन्न अंग हैं, जो मौजूदा उदाहरणों के आधार पर ऑब्जेक्ट को प्रारंभ करने का साधन प्रदान करते हैं। जबकि कंपाइलर आम तौर पर कक्षाओं के लिए डिफ़ॉल्ट कॉपी कंस्ट्रक्टर उत्पन्न करता है, ऐसे परिदृश्य भी होते हैं जहां अनुकूलन आवश्यक होता है। कस्टम प्रतिलिपि व्यवहार प्राप्त करने के लिए उपयोगकर्ता-परिभाषित प्रतिलिपि निर्माता। यह उन स्थितियों में विशेष रूप से महत्वपूर्ण है जहां सदस्य-वार प्रतिलिपि, जैसा कि डिफ़ॉल्ट कॉपी कंस्ट्रक्टर द्वारा किया जाता है, वांछित आवश्यकताओं को पूरा करने में विफल रहता है।

उदाहरण 1: गतिशील रूप से आवंटित डेटा की गहरी प्रतिलिपि

गतिशील रूप से आवंटित सदस्य चर वाले एक वर्ग पर विचार करें, जैसा कि निम्नलिखित कोड में दिखाया गया है:

वर्ग वर्ग { जनता: क्लास(स्थिरांक चार* str); ~कक्षा(); निजी: चार* संग्रहित; }; कक्षा::वर्ग(स्थिरांक चार* str) { संग्रहित = नया चार[strlen(str) 1]; स्ट्रैपी (संग्रहीत, str); } कक्षा::~कक्षा() { हटाएँ[] संग्रहीत; }

इस उदाहरण में, संग्रहीत सदस्य की सदस्य-वार प्रतिलिपि केवल पॉइंटर की नकल करेगी, वास्तविक वर्ण बफर की नहीं। परिणामस्वरूप, जब एक प्रति नष्ट हो जाती है, तो यह दूसरी प्रति द्वारा आवंटित समान मेमोरी को मुक्त कर देगी, जिससे अपरिभाषित व्यवहार हो जाएगा। इस समस्या को हल करने के लिए, बफर को डुप्लिकेट करने के लिए एक डीप कॉपी कंस्ट्रक्टर को लागू किया जाना चाहिए, यह सुनिश्चित करते हुए कि प्रत्येक कॉपी का अपना स्वतंत्र मेमोरी आवंटन हो:
class Class {
public:
    Class(const char* str);
    ~Class();

private:
    char* stored;
};

Class::Class(const char* str) {
    stored = new char[strlen(str)   1];
    strcpy(stored, str);
}

Class::~Class() {
    delete[] stored;
}
Class::Class(const Class&अन्य) { संग्रहित = नया char[strlen(another.stored) 1]; स्ट्रैपी (संग्रहीत, अन्य.संग्रहीत); } शून्य वर्ग::ऑपरेटर=(स्थिर वर्ग और अन्य) { char* अस्थायी = नया char[strlen(another.stored) 1]; स्ट्रैपी (अस्थायी, अन्य. संग्रहीत); हटाएँ[] संग्रहीत; संग्रहित = तापमान; }

Class::Class(const Class& another) {
    stored = new char[strlen(another.stored)   1];
    strcpy(stored, another.stored);
}

void Class::operator=(const Class& another) {
    char* temp = new char[strlen(another.stored)   1];
    strcpy(temp, another.stored);
    delete[] stored;
    stored = temp;
}

कुछ वर्ग गतिशील रूप से आवंटित वस्तुओं के जीवनकाल को प्रबंधित करने के लिए संदर्भ गिनती को नियोजित कर सकते हैं। ऐसी कक्षाओं की डिफ़ॉल्ट प्रतिलिपि बनाने से गलत संदर्भ गणनाएँ होती हैं। एक कस्टम कॉपी कंस्ट्रक्टर उचित संदर्भ गिनती सुनिश्चित कर सकता है, मेमोरी लीक या समय से पहले ऑब्जेक्ट विनाश को रोक सकता है। -कॉपी करने योग्य सदस्य चर, जैसे फ़ाइल हैंडल या नेटवर्क कनेक्शन। डिफ़ॉल्ट कॉपी कंस्ट्रक्टर ऐसे सदस्यों को संभाल नहीं सकते हैं, कस्टम कॉपी कंस्ट्रक्टरों को कॉपी करने के दौरान गैर-कॉपी करने योग्य सदस्यों को अलग करने जैसे उपयुक्त कार्य करने की आवश्यकता होती है।इन परिदृश्यों को समझकर, प्रोग्रामर उन स्थितियों को प्रभावी ढंग से पहचान सकते हैं जहां उपयोगकर्ता-परिभाषित कॉपी कंस्ट्रक्टर आवश्यक हैं, उनके सी अनुप्रयोगों के भीतर इष्टतम ऑब्जेक्ट आरंभीकरण और सुरक्षित प्रतिलिपि व्यवहार सुनिश्चित करना।

विज्ञप्ति वक्तव्य यह आलेख यहां पुनर्मुद्रित है: 1729673772 यदि कोई उल्लंघन है, तो कृपया इसे हटाने के लिए स्टडी_गोलंग@163.कॉम से संपर्क करें।
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3