c++ - What does compiler do when returning an object -
मेरे पास DATA नाम का निम्न वर्ग है।
enum DATATYPE {DATATYPE_CONSTANT = 0, DATATYPE_NUMBER , DATATYPE_STRING, DATATYPE_MATRIX, DATATYPE_OBJECT}; Struct DATA // चर {DATA (DATATYPE प्रकार, int पंक्ति = 0, इंट col = 0) के लिए एक डाटा कंटेनर {m_str = 0; m_number = 0; m_DataType = प्रकार; अगर (प्रकार == DATATYPE_NUMBER) m_number = नया डबल; यदि (प्रकार == DATATYPE_STRING) m_str = नया स्ट्रिंग (""); Cout & lt; & lt; "कंस्ट्रक्टर में" & lt; & lt; endl; // if (प्रकार == DATATYPE_MATRIX) m_matrix = नया मैट्रिक्स Xd (पंक्ति, रंग); } ~ डेटा () {if (m_str) m_str- & gt; स्पष्ट (); अगर (m_number) {हटाएँ m_number; M_number = 0;} std :: cout & lt; & lt; "इन डिस्ट्रिक्टर" & lt; & lt; std :: endl; // if (m_matrix) {हटाएँ} m_matrix; M_matrix = 0;}} डेटा (const डेटा और अन्य) {m_number = other.m_number; m_str = other.m_str; m_DataType = other.m_DataType; Cout & lt; & lt; "कॉपी निर्माता में" & lt; & lt; endl; } आंकड़े & amp; ऑपरेटर = (कंट डेटा और अन्य) {m_number = other.m_number; m_str = other.m_str; m_DataType = other.m_DataType; Cout & lt; & lt; "ऑपरेटर =" & lt; & lt; endl; वापसी * यह; } DATATYPE GetType () {वापसी m_DataType; } डबल * GetNumber () {वापसी m_number; } शून्य सेटनंबर (कॉन्स्ट डबल एंड वैल) {* m_number = val;} स्ट्रिंग * GetString () {return m_str; } निजी: DATATYPE m_DataType; स्ट्रिंग * m_str; // मैट्रिक्स xd * m_matrix; डबल * m_number; }; और मेरे पास निम्नलिखित टेस्ट है:
डाटा गेटडाटा (); Int main () {cout & lt; & lt; "GetData कॉल से पहले" & lt; & lt; endl; आंकड़े = गेटडाटा (); // डेटा डाट 2 = डेटा; अदालत के & lt; & lt; * (dat.GetNumber ()) के & lt; & lt; endl; Cout & lt; & lt; "प्राप्त डेटा कॉल के बाद" & lt; & lt; endl; Cout & lt; & lt; "मुख्य निकल" & lt; & lt; endl; वापसी 0; } डेटा गेटडाटा () {cout & lt; & lt; "में जाओ डेटा" & lt; & lt; endl; डेटा रेट (DATATYPE_NUMBER); डबल डी = 5; ret.SetNumber (घ); Cout & lt; & lt; "गेटडाटा निकल" & lt; & lt; endl; रिटर्न रिट; } परीक्षण चलाने के बाद आउटपुट है:
GetData कॉल से पहले
डेटा प्राप्त करें
डेटा कॉल प्राप्त करने के बाद
बाहर निकलने वाला मुख्य
डिस्ट्रक्टर में
मेरे पास निम्न प्रश्न हैं:
-
जब मैं कॉल करता हूं डेटा = गेटडाटा (); प्रतिलिपि निर्माता और न ही समान ऑपरेटर कैसे डेटा ऑब्जेक्ट का निर्माण होता है Getaata ? -
से डेटा संरचना के लिए, या सामान्य कुल डेटा प्रकारों में लौटने पर, क्या यह हमेशा सदन चर को new के साथ प्रारंभ करने का एक अच्छा विचार है? सदस्य चर का क्या होता है जब मैं आरंभ करता हूँ DATA * d = new DATA (DATATYPE_NUMBER) ? क्या स्मृति लीक के लिए इसे और अधिक त्रुटि मिलती है?
प्रश्न 1 जब मैं कॉल करता हूं डेटा डाट = गेटडाटा (); यह न तो कन्स्ट्रक्टर बनाता है, कन्वर्टर कन्स्ट्रक्टर और न ही समान ऑपरेटर। कैसे डेटा ऑब्जेक्ट का निर्माण होता है GetData ? उत्तर से लौटते समय ठीक उसी प्रकार से संकलक क्या करता है जो कि रिटर्न वैल्यू ऑप्टिमाइज़ेशन (आरवीओ) नामक कुछ का परिणाम है । आप उनके बारे में अधिक पढ़ सकते हैं। जी ++ में, आप फ्लैग -fno-elide-constructors का उपयोग करके आरवीओ अक्षम कर सकते हैं। यदि आप अपने कोड के साथ ऐसा करते हैं, तो आपको प्रतिलिपि निर्माता से संदेश दिखाई देंगे। प्रश्न 2 डेटा संरचना, या सामान्य कुल डेटा प्रकारों में, क्या यह हमेशा नए के साथ सदस्य चर को प्रारंभ करने के लिए एक अच्छा विचार है? सदस्य चर का क्या होता है जब मैं आरंभ करता हूँ DATA * d = new DATA (DATATYPE_NUMBER) ? उत्तर इसमें तीन प्रश्न हैं।
उत्तर 2.1 उस प्रश्न का उत्तर "आपके आवेदन पर निर्भर करता है" कुछ के लिए, सदस्य डेटा के रूप में होने वाली वस्तुओं को समझना पड़ता है, जबकि दूसरों के लिए, ऑब्जेक्ट के पॉइंटर्स को समझना पड़ता है जब आप ऑब्जेक्ट्स पर पॉइंटर्स का प्रयोग करते हैं, तो आपको उस का पालन करना होगा, जो कि बन गया है।
उत्तर 2.2 सदस्य वेरिएबल इनिशियलाइज किए जाते हैं जैसे वे करेंगे आपने इस्तेमाल किया था:
डेटा d = डेटा (DATATYPE_NUMBER); डायनामिक मेमोरी का उपयोग करने के लाभ हैं, लेकिन इसके नीचे की ओर भी है। किसी भी समय आप गतिशील स्मृति आवंटन का उपयोग करते हैं, तो आप अधिक त्रुटि प्रवण कोड में प्रवेश कर रहे हैं। आपको अपने संभावित दुष्प्रभावों के बारे में चिंता करने की आवश्यकता है: - डेंगलिंग पॉइंटर।
- खोए संकेत।
- आवंटित किए गए स्मृति से एक्सेस करना।
Comments
Post a Comment