Copy Constructor
Copy constructor क्या है?
Copy constructor किसी मौजूदा object की copy के रूप में नया object बनाता है। इसका एक विशेष signature है — यह उसी class के दूसरे object का reference लेता है:
class Point {
public:
int x, y;
Point(int a, int b) : x(a), y(b) { }
Point(const Point &p) : x(p.x), y(p.y) { // copy constructor
cout << "Copied\n";
}
};यह कब call होता है?
- एक object को दूसरे से initialise करना:
Point b = a; - Object को function को value से भेजना।
- Function से object को value से return करना।
Compiler का दिया copy
अगर आप कोई न लिखें, compiler एक बनाता है जो हर member को copy करता है। सरल classes (केवल सादी values) के लिए यह बिल्कुल सही है और आपको अपना लिखने की ज़रूरत नहीं।
Shallow copy समस्या
दिक्कत तब आती है जब class एक pointer रखती है। Default copy pointer value को नकल करता है, तो दोनों objects वही memory पर इशारा करते हैं:
class Buffer {
public:
int *data;
Buffer(int v) { data = new int(v); }
~Buffer() { delete data; }
// koi copy constructor nahi → shallow copy
};
// Buffer b2 = b1; → dono same data pointer share karte hain!
// jab dono destruct hote hain → double free (crash)Deep copy लिखना
Deep copy नई memory allocate करता है ताकि हर object अपना data रखे:
class Buffer {
public:
int *data;
Buffer(int v) { data = new int(v); }
Buffer(const Buffer &b) { // deep copy
data = new int(*b.data); // nai memory, value copy
}
~Buffer() { delete data; }
};अब हर Buffer का अपना data है, तो एक को नष्ट करना दूसरे को प्रभावित नहीं करता।
Rule of three
अगर किसी class को custom copy constructor चाहिए, तो लगभग हमेशा उसे custom destructor और copy assignment operator भी चाहिए — rule of three। आधुनिक C++ अक्सर smart pointers इस्तेमाल करके इस सबसे बच जाता है, जो खुद सुरक्षित रूप से copy होते हैं।
आम गलतियाँ
- Pointer रखने वाली class के लिए default shallow copy पर निर्भर रहना।
const ClassName&मेंconstऔर reference भूलना।- Copy constructor लिखना पर मिलता destructor/assignment भूलना (rule of three)।
- बड़े objects को value से भेजना (copies पैदा करना) जब
constreference काफ़ी होता।
एक class लिखें जो dynamically allocated array रखे। इसे deep-copy copy constructor और destructor दें। एक object बनाएँ, उसे copy करें, एक copy बदलें, और पुष्टि करें कि दूसरा अप्रभावित है।
सारांश
- Copy constructor मौजूदा object से नया object बनाता है।
- यह copy-initialisation और value से pass/return पर call होता है।
- Default copy shallow है — pointers रखने वाली classes के लिए असुरक्षित।
- Deep copy लिखें ताकि हर object अपना resource रखे।
- Custom copy constructor का मतलब आमतौर पर rule of three लागू होता है।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
C++ में copy constructor क्या है?
ClassName(const ClassName &other) लिखा जाता है, और तब इस्तेमाल होता है जब कोई object दूसरे से initialise होता है।