कॉपी कंस्ट्रक्टर क्या है?
एक प्रकार का कंस्ट्रक्टर जो समान क्लास के मौजूदा ऑब्जेक्ट से नया ऑब्जेक्ट बनाता और आरंभ करता है। यदि परिभाषित न हो तो कंपाइलर डिफॉल्ट कॉपी कंस्ट्रक्टर बनाता है (शैलो कॉपी)। पॉइंटर सदस्यों या डायनामिक मेमोरी वाली क्लास के लिए डीप कॉपी कंस्ट्रक्टर आवश्यक है।
सिंटैक्स
ClassName(const ClassName &obj)
C++ प्रोग्राम उदाहरण
#include <iostream>
using namespace std;
class Demo {
private:
int num1, num2;
public:
Demo(int n1, int n2) { // पैरामीट्रिक कंस्ट्रक्टर
num1 = n1;
num2 = n2;
}
Demo(const Demo &n) { // कॉपी कंस्ट्रक्टर
num1 = n.num1;
num2 = n.num2;
}
void display() {
cout << "num1 = " << num1 << endl;
cout << "num2 = " << num2 << endl;
}
};
int main() {
Demo obj1(10, 20); // पैरामीट्रिक कंस्ट्रक्टर
Demo obj2 = obj1; // कॉपी कंस्ट्रक्टर कॉल होता है
obj1.display();
obj2.display();
return 0;
}
आउटपुट
num1 = 10 num2 = 20 num1 = 10 num2 = 20
कोड व्याख्या
Demo क्लास
पैरामीट्रिक कंस्ट्रक्टर और कॉपी कंस्ट्रक्टर दोनों परिभाषित हैं। कॉपी कंस्ट्रक्टर स्रोत ऑब्जेक्ट के सदस्यों को नए ऑब्जेक्ट में कॉपी करता है।
मुख्य फ़ंक्शन
obj1 पैरामीट्रिक कंस्ट्रक्टर से बनता है। obj2 = obj1 कॉपी कंस्ट्रक्टर को आमंत्रित करता है (कॉपी इनिशियलाइजेशन)। दोनों ऑब्जेक्ट्स के मान प्रदर्शित किए जाते हैं।
शैलो कॉपी बनाम डीप कॉपी
| पहलू | शैलो कॉपी (डिफॉल्ट) | डीप कॉपी (उपयोगकर्ता-परिभाषित) |
|---|---|---|
| पॉइंटर सदस्य | पता कॉपी करता है | नई मेमोरी आवंटित करके मान कॉपी करता है |
| समस्या | डबल फ्री, डेंगलिंग पॉइंटर | स्वतंत्र ऑब्जेक्ट्स |
| आवश्यकता | सरल डेटा प्रकारों के लिए ठीक | पॉइंटर/डायनामिक मेमोरी के लिए आवश्यक |
कॉपी एलाइडिंग (C++17)
आधुनिक C++ में कॉपी कंस्ट्रक्टर कॉल को अनुकूलित करके हटाया जा सकता है (RVO - Return Value Optimization)।