2010-10-10 13 views
51

मैं इस http://en.wikipedia.org/wiki/C%2B%2B0x#Modification_to_the_definition_of_plain_old_dataसी ++ में एक गैर-तुच्छ कन्स्ट्रक्टर क्या है?

यह तुच्छ डिफ़ॉल्ट निर्माता, तुच्छ प्रतिलिपि निर्माता का उल्लेख है, कॉपी असाइनमेंट ऑपरेटर, तुच्छ नाशक पढ़ रहा था। तुच्छ क्या है और तुच्छ नहीं है?

उत्तर

60

सरल शब्दों में एक "तुच्छ" विशेष सदस्य समारोह का शाब्दिक अर्थ है एक सदस्य समारोह जो इसकी नौकरी को बहुत सरल तरीके से करता है। "सरल तरीके" का अर्थ विभिन्न प्रकार के विशेष सदस्य कार्यों के लिए अलग-अलग चीज है।

एक डिफ़ॉल्ट कन्स्ट्रक्टर और विनाशक के लिए "तुच्छ" होने का अर्थ शाब्दिक रूप से "कुछ भी नहीं करना" है। कॉपी-कन्स्ट्रक्टर और कॉपी-असाइनमेंट ऑपरेटर के लिए, "तुच्छ" होने का अर्थ शाब्दिक रूप से "सरल कच्चे मेमोरी प्रतिलिपि के बराबर होना" (जैसे memcpy के साथ प्रतिलिपि)।

यदि आप स्वयं को एक कन्स्ट्रक्टर परिभाषित करते हैं, तो इसे गैर-तुच्छ माना जाता है, भले ही यह कुछ भी नहीं करता है, इसलिए एक छोटे कन्स्ट्रक्टर को संकलक द्वारा निहित रूप से परिभाषित किया जाना चाहिए।

उपर्युक्त आवश्यकताओं को पूरा करने के लिए एक विशेष सदस्य कार्य के लिए, कक्षा में एक बहुत ही सरल संरचना होनी चाहिए, किसी वस्तु को बनाया या नष्ट होने पर, या किसी छिपी हुई अतिरिक्त आंतरिक कुशलता के दौरान किसी छिपी हुई प्रारंभिक आवश्यकता की आवश्यकता नहीं होनी चाहिए कॉपी किया जा रहा है।

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

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

स्पष्ट कारणों से, यह आवश्यकता रिकर्सिव है: कक्षा के सभी उपनिवेश (आधार और गैर स्थैतिक सदस्यों) में भी छोटे कन्स्ट्रक्टर होना चाहिए।

+1

कुछ भी नहीं ... फिर एक प्रति असाइनमेंट ऑपरेटर क्या है? ;) –

+0

इसके अलावा मुझे एक नॉट्रिचर सीटर जैसे (रेक्ट आर) {एल = आर ....} –

+2

@ एसिडज़ॉम्बी 24: मैंने सदस्य कार्यों को कॉपी करने के लिए कुछ सुधार किए हैं। आपकी दूसरी टिप्पणी मुझे स्पष्ट नहीं है। कोई भी उपयोगकर्ता परिभाषित कन्स्ट्रक्टर गैर-तुच्छ है, इसलिए एक बार जब आप इसे परिभाषित कर लेंगे, तो कक्षा अब एक पीओडी नहीं है। – AnT

22

एक वर्ग एक के एक निर्माता trivial है यदि निम्न सत्य हैं:

  • यह परोक्ष परिभाषित किया गया है (संकलक संश्लेषित)
  • एक कोई आभासी कार्य करता है और कोई आभासी आधार वर्ग
  • सभी है एक के प्रत्यक्ष आधार वर्ग तुच्छ कंस्ट्रक्टर्स
  • एक के सभी nonstatic डेटा सदस्यों की श्रेणियां होती हैं तुच्छ कंस्ट्रक्टर्स
है
+1

क्षमा करें अगर यह गूंगा लगता है, लेकिन क्या यह विनाशकों पर भी लागू होता है? – Bateman

16

वहाँ सही जवाब पहले से ही हैं, लेकिन यहां मानक (जो मैं जब मैं इस पोस्ट में आए लिए देख रहा था) से उद्धरण है:

(§12.1/5) एक डिफ़ॉल्ट निर्माता तुच्छ है यदि यह उपयोगकर्ता द्वारा प्रदान नहीं किया गया है और यदि:
- इसकी कक्षा में कोई वर्चुअल फ़ंक्शन नहीं है (10.3) और कोई वर्चुअल बेस क्लासेस (10।1), और
- अपने वर्ग का कोई गैर स्थैतिक डेटा सदस्य एक ब्रेस या बराबर-प्रारंभकर्ता है, और
- अपने वर्ग के सभी प्रत्यक्ष आधार वर्ग तुच्छ डिफ़ॉल्ट कंस्ट्रक्टर्स है, और
- सभी के लिए कक्षा के प्रकार (या सरणी) के वर्ग के गैर स्थैतिक डेटा सदस्य, प्रत्येक ऐसे वर्ग में एक छोटा डिफ़ॉल्ट कन्स्ट्रक्टर होता है।

यह सी ++ 11 से है। सी ++ 03 में दूसरी वस्तु की कमी है और वाक्यांश का उपयोग के बजाय घोषित के बजाय घोषित किया गया है। यह अन्यथा समान है।

ध्यान दें कि यह विनिर्देश केवल छोटे डिफॉल्ट कन्स्ट्रक्टर को कवर करता है। शब्द trivial शब्द का प्रयोग विभिन्न संदर्भों में भी किया जा सकता है, उदा। रचनाकारों की प्रतिलिपि बनाएँ।

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