2012-05-28 14 views
5

C++ में एक डिफ़ॉल्ट असाइनमेंट ऑपरेटर संश्लेषित नहीं करता है, तो यदि किसी क्लास में संदर्भ डेटा सदस्य होता है तो डिफ़ॉल्ट असाइनमेंट ऑपरेटर को कंपाइलर द्वारा संश्लेषित नहीं किया जाता है। क्यूं कर?यदि किसी क्लास में संदर्भ डेटा सदस्य

+0

उस संदर्भ को किस संदर्भ में शुरू किया जाएगा? – Mat

+9

आप एक संदर्भ _reassign_ नहीं कर सकते हैं। बस असाइन करना संदर्भित ऑब्जेक्ट को संशोधित करेगा, जो शायद आप नहीं चाहते हैं। –

उत्तर

6

सी ++ में, यदि एक वर्ग के लिए एक संदर्भ डेटा सदस्य है डिफ़ॉल्ट असाइनमेंट ऑपरेटर संकलक द्वारा संश्लेषित नहीं है। क्यूं कर?

क्या एक प्रतिलिपि काम करते में परिभाषित किया गया है चाहिए:

सी ++ 03 स्टैंडर्ड 12.8/13:

प्रत्येक subobject तरीके अपने प्रकार के लिए उपयुक्त में असाइन किया गया है:

  • यदि उपरोक्त वर्ग प्रकार का है, कक्षा के लिए कॉपी असाइनमेंट ऑपरेटर प्रयोग किया जाता है (जैसे कि स्पष्ट योग्यता के द्वारा; यानी, अधिक व्युत्पन्न कक्षाओं में किसी भी संभावित आभासी ओवरराइडिंग कार्यों को अनदेखा करना);

  • यदि उपरोक्त एक सरणी है, तो प्रत्येक तत्व को तत्व प्रकार के लिए उचित तरीके से असाइन किया गया है;

  • यदि उपरोक्त स्केलर प्रकार का है, तो अंतर्निहित असाइनमेंट ऑपरेटर का उपयोग किया जाता है।

संक्षेप में यह संकेत मिलता है कि सदस्य में से प्रत्येक के लिए एक उचित तरीके से
जो प्रश्न उठाता में सौंपा जाना चाहिए,
क्या एक संदर्भ सदस्य का काम के लिए व्यवहार किया जाना चाहिए क्लास में?
संदर्भों के बारे में निम्नलिखित पर विचार करें:

  1. संदर्भ स्वाभाविक गैर आबंटित कर रहे हैं, वे एक ही referrant जिक्र रखने के लिए जो वे प्रारंभ किया गया [रेफरी 1]
  2. #1 के संदर्भ में संदर्भ को निर्दिष्ट करने से संदर्भ को पुन: असाइन नहीं किया जाता है, यह रेफरेन्ट का मान बदलता है जो गैर-सहज ज्ञान युक्त व्यवहार है।

यहां लागू करने के लिए कोई डिफ़ॉल्ट सही व्यवहार नहीं है बल्कि एक परिस्थिति वाला एक है। इसलिए सी ++ मानक अनिवार्य है कि वर्ग के डिजाइनर इस व्यवहार को निर्धारित करने के लिए सबसे अच्छी स्थिति में हैं और इसलिए निर्णय कि डिफ़ॉल्ट असाइनमेंट ऑपरेटर को नहीं करना चाहिए यदि किसी वर्ग के संदर्भ डेटा सदस्य हैं तो कंपाइलर द्वारा संश्लेषित किया जाए।
सी ++ 03 स्टैंडर्ड 12.8/12:

यह निर्णय में निर्दिष्ट किया जाता

जब अपने वर्ग प्रकार का ऑब्जेक्ट एक मूल्य असाइन किया गया है

एक परोक्ष-घोषित प्रति असाइनमेंट ऑपरेटर परोक्ष परिभाषित किया गया है इसके वर्ग के प्रकार या कक्षा के प्रकार से प्राप्त वर्ग प्रकार का मूल्य। एक कार्यक्रम बीमार बनाई है अगर वर्ग है जिसके लिए एक प्रति असाइनमेंट ऑपरेटर परोक्ष परिभाषित किया गया है है:
.......
- संदर्भ प्रकार का एक nonstatic डेटा सदस्य, या
.......


[रेफरी 1]
सी ++ 03 स्टैंडर्ड 8.5.3/2:

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

3

सदस्य-केवल मंच पर चर्चा को देखा। चूंकि उत्तर अधिकांश प्रोग्रामर के लिए प्रसिद्ध नहीं है, इसलिए उत्तर पोस्ट करना और इसे यहां साझा करना चाहते हैं।

सी ++ से मानक प्रारूप N3337 §12.8.23:

दसवीं कक्षा के लिए एक डिफॉल्ट की कॉपी/कदम असाइनमेंट ऑपरेटर के रूप में नष्ट करता है, तो एक्स है परिभाषित किया गया है:

  • एक गैर के साथ एक संस्करण सदस्य -trivial इसी असाइनमेंट ऑपरेटर और एक्स एक संघ की तरह वर्ग, या
  • (या उसके सरणी) स्थिरांक गैर वर्ग प्रकार का एक गैर स्थैतिक डेटा सदस्य, या
  • एक गैर stati है संदर्भ प्रकार के सी डेटा सदस्य, या
  • कक्षा प्रकार एम (या उसके सरणी) का एक गैर स्थैतिक डेटा सदस्य नहीं है जो प्रतिलिपि/स्थानांतरित हो सकता है क्योंकि अधिभार संकल्प (13.3), जैसा कि एम के संबंधित असाइनमेंट ऑपरेटर पर लागू होता है, परिणाम एक अस्पष्टता या एक समारोह है कि हटा दिया गया है या डिफॉल्ट की असाइनमेंट ऑपरेटर से दुर्गम, या
  • साथ सीधा या आभासी आधार वर्ग बी की प्रतिलिपि नहीं बनाई जा सकती है/ले जाया गया में क्योंकि अधिभार संकल्प (13.3), के रूप में बी की इसी असाइनमेंट ऑपरेटर के लिए आवेदन किया , में एक अस्पष्टता या एक फ़ंक्शन जिसे हटाया गया है या डिफॉल्ट असाइनमेंट ऑपरेटर, या
  • से अनुपलब्ध है चालन असाइनमेंट ऑपरेटर के लिए
  • , एक गैर स्थैतिक डेटा सदस्य या प्रत्यक्ष आधार वर्ग एक प्रकार के साथ जिसमें एक चाल असाइनमेंट ऑपरेटर नहीं है और यह कॉपी करने योग्य नहीं है, या कोई प्रत्यक्ष या अप्रत्यक्ष वर्चुअल बेस क्लास नहीं है।
+1

यह बहुत अच्छा है कि आपने मानक से उद्धरण पोस्ट किया है, लेकिन * कारण * को समझना अधिक महत्वपूर्ण है: कि असाइनमेंट ऑपरेटर को एलएचएस ऑब्जेक्ट के संदर्भ सदस्य को एक नया मान असाइन करना होगा, लेकिन संदर्भ पुनः- सौंपा गया (वे निहित रूप से स्थिर हैं)। – HighCommander4

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