2011-12-12 11 views
7

मानक प्रति रचनाकारों और असाइनमेंट ऑपरेटरों के लिए, मैं हमेशा उन्हें लागू करने के बारे में सोचता हूं या delete अस्तित्व से चूक को अंजाम देता हूं, अगर मेरी कक्षा एक विनाशक लागू करती है।एक चालक कन्स्ट्रक्टर और एक चाल ऑपरेटर को लागू करने के बारे में मुझे किस स्थितियों के बारे में सोचना चाहिए?

नई चाल निर्माता और कदम ऑपरेटर के लिए, के बारे में क्या है या नहीं एक कार्यान्वयन के लिए आवश्यक है लगता है के लिए सही रास्ता क्या है?

पूर्व C++ 0x से एक प्रणाली संक्रमण का पहला पास के रूप में, मैं सिर्फ delete डिफ़ॉल्ट चाल निर्माता और कदम ऑपरेटर या मैं उन्हें अकेला छोड़ देना चाहिए सकता है?

उत्तर

10

आप इसके बारे में चिंता करने के लिए नहीं हैं, इस अर्थ में कि जब आप उपयोगकर्ता को विनाशक घोषित करते हैं (या 12.8/9 में सूचीबद्ध कुछ भी), जो डिफ़ॉल्ट चालक कन्स्ट्रक्टर को उत्पन्न होने से अवरुद्ध करता है। तो प्रतियों के साथ समान जोखिम नहीं है, कि डिफ़ॉल्ट गलत है।

तो, जैसा कि पहला पास उन्हें अकेला छोड़ देता है। आपके मौजूदा कोड में ऐसे स्थान हो सकते हैं जहां सी ++ 11 मूव सेमेन्टिक्स एक चाल की अनुमति दें, जबकि सी ++ 03 एक प्रतिलिपि को निर्देशित करता है। आपकी कक्षा की प्रतिलिपि जारी रहेगी, और यदि इससे सी ++ 03 में कोई प्रदर्शन समस्या नहीं हुई है तो मैं तुरंत किसी भी कारण से नहीं सोच सकता कि यह सी ++ 11 में क्यों होगा। यदि यह C++ 03 में प्रदर्शन समस्याओं का कारण बनता है, तो आपके पास अपने कोड में एक बग को ठीक करने का अवसर होता है जिसे आप पहले कभी नहीं मिला था, लेकिन यह एक अवसर है, दायित्व नहीं ;-)

यदि आप बाद में चाल निर्माण और असाइनमेंट को कार्यान्वित करें, उन्हें स्थानांतरित किया जाएगा, और विशेष रूप से आप ऐसा करना चाहेंगे यदि आपको लगता है कि आपकी कक्षा के सी ++ 11 क्लाइंट प्रतियों से बचने के लिए "स्वैपटाइजेशन" का उपयोग करने की संभावना कम हैं, तो आपके पास पास होने की अधिक संभावना है सी ++ 03 क्लाइंट की तुलना में मूल्य, आदि द्वारा टाइप करें।

सी ++ 11 में नई कक्षाएं लिखते समय, आपको उसी मानदंड के तहत कदम पर विचार करने और लागू करने की आवश्यकता है जिसे आपनेसी ++ 03 में लागू किया था। एक वर्ग जिसे कॉपी किया जा सकता है "movable" की सी ++ 11 अवधारणा को लागू करता है, (सी ++ 03 में प्रतिलिपि बनाई जा सकने वाली कक्षा के रूप में std में डिफ़ॉल्ट कार्यान्वयन के माध्यम से बदला जा सकता है), क्योंकि "चलने योग्य" नहीं है कहें कि स्रोत किस राज्य में छोड़ा गया है - विशेष रूप से इसे अपरिवर्तित होने की अनुमति है। तो एक प्रति एक चाल के रूप में मान्य है, यह केवल एक कुशल व्यक्ति नहीं है, और कई कक्षाओं के लिए आप पाएंगे कि "अच्छा" चाल या स्वैप के विपरीत, एक प्रति फेंक सकती है।

आपको लगता है कि आपको अपने वर्गों के लिए एक विध्वंसक (इसलिए कोई डिफ़ॉल्ट चाल कन्स्ट्रक्टर नहीं है) में आपके वर्गों के लिए कदम लागू करना होगा, और आपके पास एक डेटा सदस्य भी है जो चलने योग्य नहीं है लेकिन कॉपी करने योग्य नहीं है (इसलिए कोई डिफ़ॉल्ट प्रतिलिपि नहीं है या तो)। वह तब होता है जब आंदोलन महत्वपूर्ण रूप से प्रदर्शन के साथ-साथ महत्वपूर्ण हो जाता है।

0

चूंकि उन्हें ऑप्टिमाइज़ेशन के रूप में उपयोग किया जाता है, इसलिए ऑप्टिमाइज़ेशन आपकी कक्षा पर लागू होने पर उन्हें लागू करना चाहिए। यदि आप आंतरिक संसाधन को "चोरी" कर सकते हैं तो आपकी कक्षा एक अस्थायी वस्तु से हो रही है जो नष्ट होने वाली है। std :: vector एक आदर्श उदाहरण है, जहां चालक कन्स्ट्रक्टर केवल अस्थायी ऑब्जेक्ट को छोड़कर आंतरिक तत्वों को पॉइंटर्स असाइन करता है (प्रभावी रूप से तत्वों को चुरा रहा है)।

4

सी ++ 11 के साथ, आपको लाइब्रेरी के तरीके के कारण, आपको शायद ही कभी विनाशक या प्रतिलिपि प्रदान करने की आवश्यकता होती है। कंपाइलर प्रदान किए गए सदस्यों को हमेशा बहुत अच्छा लगता है (बशर्ते वे सही ढंग से कार्यान्वित किए जाएं: एमएसवीसी आपको हाथ से बहुत से चलने वाले अर्थशास्त्र को लागू करने के लिए मजबूर करता है, जो बहुत परेशान है)।

मामले में आप एक कस्टम नाशक लागू करने के लिए, निम्नलिखित दृष्टिकोण का उपयोग किया है:

  • एक चाल निर्माता को लागू करें, और एक असाइनमेंट ऑपरेटर मूल्य से ले रही है (प्रति का उपयोग कर & स्वैप: ध्यान दें कि आप के बाद से std::swap उपयोग नहीं कर सकते यह असाइनमेंट का उपयोग करता है। आपको खुद को एक निजी स्वैप प्रदान करना होगा)। अपवाद गारंटी पर ध्यान दें (std::move_if_noexcept देखें)।
  • यदि आवश्यक हो तो, एक प्रतिलिपि निर्माता को लागू करें। अन्यथा, इसे हटा दें। सावधान रहें कि गैर डिफ़ॉल्ट प्रति semantics शायद ही कभी समझ में आता है।

इसके अलावा, एक आभासी विनाशक एक कस्टम विनाशक के रूप में गिना जाता है: आभासी विनाशक घोषित करते समय कॉपी + चाल semantics प्रदान या हटा दें।

संबंधित मुद्दे