स्पष्ट रूप से परिभाषित प्रति रचनाकार सदस्यों के लिए कॉपी कन्स्ट्रक्टर को कॉल नहीं करते हैं।
जब आप एक निर्माता के शरीर में प्रवेश करते हैं, तो उस वर्ग के प्रत्येक सदस्य को प्रारंभ किया जाएगा। यही है, एक बार जब आप {
पर पहुंच जाते हैं तो आपको गारंटी दी जाती है कि आपके सभी सदस्यों को प्रारंभ किया गया है।
निर्दिष्ट किए बिना, सदस्य डिफ़ॉल्ट रूप से कक्षा में दिखाई देने वाले क्रम में प्रारंभिक होते हैं। (और यदि वे नहीं हो सकते हैं, तो कार्यक्रम खराब हो गया है।) इसलिए यदि आप अपनी खुद की प्रतिलिपि निर्माता को परिभाषित करते हैं, तो अब आप किसी भी सदस्य प्रतिलिपि निर्माता को वांछित के रूप में कॉल करने के लिए तैयार हैं।
यहाँ के साथ चारों ओर एक छोटा सा कार्यक्रम आप कर सकते हैं कहीं कॉपी-पेस्ट और गंदगी है:
#include <iostream>
class Foo {
public:
Foo() {
std::cout << "In Foo::Foo()" << std::endl;
}
Foo(const Foo& rhs) {
std::cout << "In Foo::Foo(const Foo&)" << std::endl;
}
};
class Bar {
public:
Bar() {
std::cout << "In Bar::Bar()" << std::endl;
}
Bar(const Bar& rhs) {
std::cout << "In Bar::Bar(const Bar&)" << std::endl;
}
};
class Baz {
public:
Foo foo;
Bar bar;
Baz() {
std::cout << "In Baz::Baz()" << std::endl;
}
Baz(const Baz& rhs) {
std::cout << "In Baz::Baz(const Baz&)" << std::endl;
}
};
int main() {
Baz baz1;
std::cout << "Copying..." << std::endl;
Baz baz2(baz1);
}
के रूप में-है, इस प्रिंट:
In Foo::Foo()
In Bar::Bar()
In Baz::Baz()
Copying...
In Foo::Foo()
In Bar::Bar()
In Baz::Baz(const Baz&)
ध्यान दें कि यह के सदस्यों डिफ़ॉल्ट-आरंभ है Baz
।
स्पष्ट प्रतिलिपि निर्माता बाहर टिप्पणी करते हुए की तरह द्वारा:
/*
Baz(const Baz& rhs) {
std::cout << "In Baz::Baz(const Baz&)" << std::endl;
}
*/
उत्पादन इस बन जाएगा:
In Foo::Foo()
In Bar::Bar()
In Baz::Baz()
Copying...
In Foo::Foo(const Foo&)
In Bar::Bar(const Bar&)
यह दोनों पर कॉपी-निर्माता कहता है।
और यदि हम reintroduce Baz
के निर्माता कॉपी और स्पष्ट रूप से एक भी सदस्य कॉपी:
Baz(const Baz& rhs) :
foo(rhs.foo)
{
std::cout << "In Baz::Baz(const Baz&)" << std::endl;
}
हम पाते हैं:
In Foo::Foo()
In Bar::Bar()
In Baz::Baz()
Copying...
In Foo::Foo(const Foo&)
In Bar::Bar()
In Baz::Baz(const Baz&)
आप देख एक बार आप स्पष्ट रूप से एक कॉपी-निर्माता घोषणा कर सकते हैं के रूप में आप सभी वर्ग के सदस्यों की प्रतिलिपि बनाने के लिए ज़िम्मेदार हैं; यह अब आपका कन्स्ट्रक्टर है।
यह चालक कन्स्ट्रक्टर समेत सभी रचनाकारों के लिए लागू होता है।
देखें: http://stackoverflow.com/questions/563221/is-there-an-implicit-default-constructor-in-c/563320#563320 –