कॉपी-एंड-स्वैप मुहावरा
कॉपी-एंड-स्वैप (Copy-and-Swap) C++ में असाइनमेंट ऑपरेटर (operator=) को सुरक्षित और कुशलतापूर्वक लागू करने का एक लोकप्रिय मुहावरा है। यह "स्ट्रॉन्ग एक्सेप्शन सेफ्टी" गारंटी प्रदान करता है: यदि ऑपरेशन के दौरान कोई अपवाद फेंका जाता है, तो ऑब्जेक्ट की स्थिति अपरिवर्तित रहती है।
यह कैसे काम करता है
- कॉपी: स्रोत ऑब्जेक्ट की एक स्थानीय प्रति (कॉपी) कॉपी कंस्ट्रक्टर का उपयोग करके बनाई जाती है।
- स्वैप: वर्तमान ऑब्जेक्ट के डेटा को इस नई बनी प्रति के साथ
swap()फ़ंक्शन का उपयोग करके अदला-बदली किया जाता है। - नष्ट: पुराना डेटा (जो अब अस्थायी ऑब्जेक्ट में है) स्वचालित रूप से नष्ट हो जाता है जब अस्थायी ऑब्जेक्ट स्कोप से बाहर जाता है।
आवश्यक घटक
इस मुहावरे को काम करने के लिए क्लास में तीन चीजें होनी चाहिए:
- एक कॉपी कंस्ट्रक्टर (गहरी कॉपी के लिए)।
- एक डिस्ट्रक्टर (संसाधन मुक्त करने के लिए)।
- एक नॉन-थ्रोइंग swap() फ़ंक्शन (दो ऑब्जेक्ट्स के आंतरिक डेटा को कुशलतापूर्वक स्वैप करने के लिए)।
महत्वपूर्ण नोट
std::swap का उपयोग न करें क्योंकि यह आंतरिक रूप से कॉपी कंस्ट्रक्टर और असाइनमेंट ऑपरेटर का उपयोग करता है, जिससे अनंत रिकर्सन हो सकती है। अपना खुद का swap मेंबर फ़ंक्शन लिखें जो केवल पॉइंटर्स/मेंबर्स को स्वैप करता है।
उदाहरण
class MyClass {
int* data;
size_t size;
public:
// कॉपी कंस्ट्रक्टर
MyClass(const MyClass& other) : data(new int[other.size]), size(other.size) {
std::copy(other.data, other.data + size, data);
}
// Swap फ़ंक्शन (नॉन-थ्रोइंग)
void swap(MyClass& other) noexcept {
std::swap(data, other.data);
std::swap(size, other.size);
}
// असाइनमेंट ऑपरेटर (कॉपी-एंड-स्वैप)
MyClass& operator=(MyClass other) { // पास-बाय-वैल्यू कॉपी बनाता है
swap(other); // *this के साथ स्वैप करता है
return *this; // 'other' (पुराना डेटा) यहाँ नष्ट होता है
}
~MyClass() { delete[] data; }
};