डिफ़ॉल्ट चाल निर्माता और asignment संकलक द्वारा उत्पन्न ले वर्ग के प्रत्येक सदस्य के लिए कदम निर्माता/asignment कॉल करेंगे।
अपने वर्ग केवल कच्चे सदस्य हैं, "चार * बफर" उदाहरण के लिए, आप अपने खुद के चाल आपरेशन लिखने के लिए की है।
यदि आपका वर्ग केवल, उदाहरण के लिए "वेक्टर" "सदस्यों कामयाब" है, तो आप वर्ग के लिए डिफ़ॉल्ट चाल संचालन ठीक हो जाएगा, क्योंकि यह प्रतिनिधियों प्रत्येक सदस्य के आपरेशन।
:
यदि आपका वर्ग "प्रबंधित सदस्यों" है "कच्चे सदस्यों", वेक्टर और उदाहरण के लिए int * के साथ मिश्रित, अपने आंदोलन के संचालन कच्चे संसाधनों का मार्गदर्शन चाल करते हैं और प्रबंधित वस्तुओं के लिए कदम आपरेशन फोन करना होगा
class MyObject {
public:
// ...
MyObject(MyObject&& other) : vector1(std::move(other.vector1)) {
// We use vector's move constructor^
// and then move ourself the char* buffer
buffer1 = other.buffer1;
other.buffer1 = nullptr;
}
MyObject& operator=(MyObject&& other) {
// We use vector's move asignment operator
vector1= std::move(other.vector1);
// and then move ourself the char* buffer
std::swap(buffer1,other.buffer1);
return *this;
}
//...
private:
vector<char> vector1;
char * buffer1;
};
std :: move (other.vector1) की आवश्यकता है क्योंकि के अंदर जो अन्य काम करता है। वेक्टर 1 एक अंतराल है। हमें कंपाइलर को बताना होगा कि हम बाद में फ़ंक्शन कोड में वेक्टर 1 मान का उपयोग नहीं करेंगे, इसलिए इसका मूल्य स्थानांतरित किया जा सकता है।
आपको अभी भी एक चालक कन्स्ट्रक्टर होना चाहिए, क्योंकि 'std :: vector' चलने से लाभ हो सकता है। कंपाइलर से उत्पन्न एक (सदस्यवार चाल) काफी अच्छा होना चाहिए। –
मेरा मानना है कि इसे * कॉपी कन्स्ट्रक्टर * कहा जाता है, नहीं * कन्स्ट्रक्टर * ले जाएं। –
@AlexFarber: यदि कोई सदस्य पॉइंटर्स नहीं है (जैसा कि टीसी द्वारा ऊपर उल्लिखित है) डिफ़ॉल्ट प्रति-निर्माता पर्याप्त है। –