5

जब आप अपनी कक्षा में सीक्टर, डीटीओआर या ओप = जोड़ते हैं तो मुझे अंगूठे का सी ++ नियम पता है, आपको अन्य परिस्थितियों में कक्षा को सही तरीके से काम करने के लिए अन्य दो भी जोड़ना होगा।कन्स्ट्रक्टर, विनाशक और असाइनमेंट ऑपरेटर कॉपी करें। जब हमें उन सभी की आवश्यकता नहीं होती है?

क्या कोई ऐसा मामला है जब आपको तीनों को प्रदान करने की आवश्यकता नहीं है, उनमें से केवल एक या दो?

सी ++ आपको उन सभी को जोड़ने की आवश्यकता क्यों नहीं है यदि आप उनमें से किसी एक को अपनी कक्षा में जोड़ते हैं?

EDIT1:

जब आप न केवल उनमें से कुछ की जरूरत नहीं है, लेकिन आप उन्हें ताकि आप उन्हें निजी या संरक्षित करना चाहते हैं, नहीं करना चाहती उदाहरण का उल्लेख किया। लेकिन आपको अभी भी खाली निकायों के साथ भी अपने कोड में लिखना होगा।

खाली शरीर के साथ वर्चुअल विनाशक जोड़कर कक्षा क्लालीमोर्फिक बनाते समय मेरे लिए एकमात्र वैध कारण नहीं है। लेकिन जैसे ही आप विनाशक के शरीर में कुछ लिखते हैं, आपको कोक्टर और op = के शरीर में कुछ लिखने पर विचार करना चाहिए।

मैं उदाहरणों की तलाश में हूं जब आपको सभी 3 विधियों को लिखने की आवश्यकता नहीं है और आप अपनी कक्षा में बग पैदा किए बिना उनमें से कुछ को छोड़ सकते हैं भले ही कोई नौसिखिया आपकी कक्षा का उपयोग कर रहे हों। :)

उत्तर

3

पर्यवेक्षित कक्षाएं (जो लोग अपने जीवनकाल को किसी अन्य वर्ग में रिपोर्ट करते हैं) सभी रचनाकारों और विनाशक की आवश्यकता होती है, लेकिन op =। सी ++ को उनकी आवश्यकता नहीं है क्योंकि यह पूरी तरह से अनावश्यक होगा- हम, प्रोग्रामर, सर्वश्रेष्ठ जानते हैं।

इसके अतिरिक्त, आप विनाशक चाहते हैं लेकिन अन्य दो नहीं यदि आपके पास एक गैर-प्रतिलिपि योग्य वर्ग है।

+0

+1 गैर-प्रतिलिपि प्रकारों का उल्लेख करने के लिए। –

+0

यदि आप वास्तव में एक प्रकार का गैर-प्रतिलिपि बनाना चाहते हैं, तो आप अभी भी निजी या संरक्षित के रूप में cctor और op = लिखना चाहेंगे। – Calmarius

5

एक मामला जिसमें आप प्रतिलिपि का उपयोग करना चाहते हैं, एक कॉपी कन्स्ट्रक्टर या असाइनमेंट ऑपरेटर के बिना एक पॉलिमॉर्फिक क्लास विकसित करते समय, यदि आप बेस क्लास पॉइंटर के माध्यम से डेलोकेशन की अनुमति देने के लिए virtual विनाशक चाहते हैं। ये वर्ग अक्सर "वर्चुअल क्लोन" मुहावरे को सुविधाजनक बनाने के लिए कॉपी कन्स्ट्रक्टर का समर्थन करेंगे। हालांकि, उनके पास शायद ही कभी असाइनमेंट ऑपरेटर होते हैं, क्योंकि पॉलिमॉर्फिक कक्षाएं आमतौर पर पॉइंटर्स के माध्यम से ढेर-आवंटित और संदर्भित होती हैं, इस मामले में प्रत्यक्ष असाइनमेंट लगभग हमेशा स्लाइसिंग की ओर जाता है।

+1

मैं इसे स्लाइसिंग से बचाने के लिए जोड़ दूंगा, आप कॉपी कॉपी कन्स्ट्रक्टर को बेहतर बनाएंगे। –

+0

polimorphic कक्षाओं के लिए आप op = निजी या संरक्षित भी कर सकते हैं। – Calmarius

1

यदि आपको अपनी कक्षा में पॉइंटर्स या एसएचएच की तरह है तो आपको उन्हें सभी लिखना होगा ताकि प्रतिलिपि कोक्टर या सेशन में कोई उथली प्रतिलिपि न हो और डीटीआर में कोई स्मृति रिसाव न हो।

यह एक ऐसा मामला है जहां आपको उन्हें सभी लिखना चाहिए, अन्य मामले अन्य उत्तरों में मौजूद हैं।

सी ++ को उन सभी की आवश्यकता नहीं है क्योंकि यह डिफ़ॉल्ट रूप से लिखता है, और क्योंकि वे अपमानजनक नहीं हो सकते हैं।

+0

प्रश्न उन मामलों को प्रदर्शित करना था जहां वे आवश्यक नहीं हैं। –

1

आम तौर पर, जब आप एक्सेस अधिकारों को बदलना चाहते हैं, या विनाशक के मामले में, इसे वर्चुअल बनाएं। एक निजी प्रतिलिपि निर्माता या असाइनमेंट ऑपरेटर घोषित करना इन परिचालनों पर प्रतिबंध लगाने का एक शास्त्रीय तरीका है, भले ही आपको विनाशक की आवश्यकता न हो; किसी भी समय आप कक्षा से प्राप्त करना चाहते हैं, विनाशक आभासी (या संरक्षित) होना चाहिए; और यदि आप गतिशील रूप से आवंटित उदाहरणों के अलावा कुछ भी प्रतिबंधित करना चाहते हैं, तो क्लासिक मुहावरे विनाशक को निजी घोषित करना है, और फ़ंक्शन को नष्ट करना है जो ऑब्जेक्ट से छुटकारा पाने के लिए delete this करता है।

अंत में, संकलक उत्पन्न संस्करण इनलाइन हैं, और आप इन कार्यों में से किसी एक को इनलाइन होने से रोकने के लिए चाहते हैं। ( छोटी मेमोरी के दिनों में, यह अक्सर एक विचार था।)