यह निर्धारित करने के नियम क्या हैं कि कोई विशेष static_cast कक्षा के कन्स्ट्रक्टर को कॉल करेगा या नहीं? सी शैली/कार्यात्मक शैली के बारे में कैसे?कब करते हैं नए प्रकार के निर्माता को कॉल करते हैं?
उत्तर
किसी भी समय एक नई वस्तु बनाई जाती है, एक निर्माता को बुलाया जाता है। static_cast
हमेशा एक नई, अस्थायी वस्तु (लेकिन जेम्स मैकनेलिस द्वारा टिप्पणी देखें) या तो तत्काल, या किसी उपयोगकर्ता परिभाषित रूपांतरण के लिए कॉल के माध्यम से परिणाम देता है। (लेकिन आदेश इच्छित प्रकार की एक ऑब्जेक्ट प्रदान करने के लिए में, उपयोगकर्ता परिभाषित रूपांतरण ऑपरेटर एक निर्माता फोन करना होगा।)
जब लक्ष्य एक वर्ग प्रकार, सी शैली डाले और कार्यात्मक शैली डाले है एक तर्क के साथ, परिभाषा के अनुसार, static_cast
जैसा ही है। यदि कार्यात्मक शैली कास्ट शून्य या तर्क से अधिक है, तो यह तुरंत निर्माता को कॉल करेगा; इस मामले में उपयोगकर्ता परिभाषित रूपांतरण ऑपरेटरों पर विचार नहीं किया जाता है। (और एक कर सकते थे सवाल यह एक "जैसे रूपांतरण" बुलाने की पसंद।)
रिकॉर्ड, एक मामले में जहां एक उपयोगकर्ता परिभाषित रूपांतरण ऑपरेटर कहा जा सकता है के लिए:
class A
{
int m_value;
public
A(int initialValue) : m_value(initialValue) {}
};
class B
{
int m_value;
public:
B(int initialValue) : m_value(initialValue) {}
operator A() const { return A(m_value); }
};
void f(A const& arg);
B someB;
f(static_cast<A>(arg));
इस विशेष मामले में , कास्ट अनावश्यक है, और रूपांतरण इसकी अनुपस्थिति में पूरी तरह से किया जाएगा। लेकिन सभी मामलों में: अंतर्निहित रूपांतरण, static_cast
, सी शैली डाली ((A) someB
) या कार्यात्मक शैली डाली (A(someB)
), B::operator A()
बुलाया जाएगा)
यदि वहाँ एक उपयुक्त रूपांतरण निर्माता है कि रूपांतरण निर्माता static_cast
द्वारा बुलाया जाएगा है:
class Class {
public:
Class(int); //<< conversion constructor
};
int what = 0;
Class object = static_cast<Class>(what);
एक ही सी-शैली पर लागू होता है डाले और "कार्यात्मक" डाले।
int what = 0;
Class object = (Class)what;
int what = 0;
Class object = Class(what);
क्या होगा अगर निर्माता स्पष्ट है के बारे में।? मुझे लगता है कि इसे अभी भी बुलाया जाएगा। – Mankarse
@Mankarse: हां, 'स्पष्ट' का अर्थ है कि इसे टाइप निर्दिष्ट किए बिना इसे नहीं कहा जा सकता है। जब आप टाइप निर्दिष्ट करते हैं तो इसे कॉल किया जाएगा। – sharptooth
किसी प्रकार के प्रकार के लिए एक कन्स्ट्रक्टर को तब भी कहा जाता है जब उस प्रकार का एक नया उदाहरण बनाया जाता है। यदि एक कास्ट उस वर्ग प्रकार की एक नई वस्तु बनाता है तो एक निर्माता को बुलाया जाता है। ओवरलोड रिज़ॉल्यूशन निर्धारित करता है कि किसी वर्ग प्रकार के रचनाकारों को विशेष तर्क दिए जाते हैं।
यदि static_cast
का लक्ष्य प्रकार एक वर्ग प्रकार है, तो यह लक्ष्य प्रकार का एक नया ऑब्जेक्ट बनाएगा।
ए const_cast
, dynamic_cast
, या reinterpret_cast
कभी भी एक नई कक्षा-प्रकार वस्तु नहीं बनाएगा, और इस प्रकार कभी भी कन्स्ट्रक्टर को कॉल नहीं करेगा।
एक सी शैली डाली के बाद से हमेशा static_cast
, const_cast
, और reinterpret_cast
के कुछ संयोजन करता है, यह एक ही परिस्थितियों है कि एक static_cast
एक नई वस्तु बनाने हैं में एक नई वस्तु बनाने होंगे।
यह सही है, लेकिन यह कहना महत्वपूर्ण है कि * कब * यह एक नया उदाहरण बनाता है (आईआईआरसी फ़ंक्शन-स्टाइल कास्ट हमेशा करता है और स्थिर कास्ट करता है जब यह सीवी-योग्यता से अधिक होता है)। –
लक्ष्य प्रकार एक वर्ग प्रकार होने पर 'static_cast' के माध्यम से एक नया वर्ग प्रकार ऑब्जेक्ट बनाया गया है। मैंने उस विवरण के साथ उत्तर अपडेट किया है। –
लेकिन मैंने यह –
- 1. आप ऑपरेटर को अधिभार कब करते हैं?
- 2. आप कोड को दोबारा कब करते हैं?
- 3. रुबी इंस्टेंस चर सेट कब करते हैं?
- 4. जावा क्लास लोडर कब संलग्न करते हैं?
- 5. हम एमवीवीएम का उपयोग कब करते हैं?
- 6. ओओपी डिजाइन - आप कहां/कब गुणों को मान्य करते हैं?
- 7. क्या आप subclass के भीतर super.finalize() को कॉल करते हैं?
- 8. नेस्टेड डॉसिंक कॉल कैसे व्यवहार करते हैं?
- 9. जावास्क्रिप्ट सेट अंतराल: कॉल ओवरलैप करते हैं?
- 10. हम एक शब्दकोश के लिए GetHashCode() कब करते हैं?
- 11. व्युत्पन्न वर्ग निर्माता कैसे पाइथन में काम करते हैं?
- 12. डिफ़ॉल्ट प्रकार के उदाहरण एक दूसरे को संदर्भित करते हैं
- 13. फेसबुक के नए फुलस्क्रीन फोटो व्यूअर कैसे काम करते हैं?
- 14. आप पाइथन में फ़ाइल प्रकार को कैसे उपclass करते हैं?
- 15. सी अंतर्निहित रूपांतरण क्यों करते हैं जैसे वे करते हैं?
- 16. क्या अपवादों को अंततः अनदेखा करते हैं?
- 17. सी ++ निर्माता कॉल पैरामीटर प्रकार
- 18. एसएसआईएस में संग्रहीत प्रक्रिया को आप कैसे कॉल करते हैं?
- 19. जावा जेनेरिक रनटाइम पर कास्टिंग का उपयोग कब करते हैं?
- 20. आप जावा से स्कैला ऑब्जेक्ट्स को कैसे कॉल करते हैं?
- 21. PHP के यूजरोर्ट किस प्रकार के एल्गोरिदम लागू करते हैं?
- 22. बाइंडिंग दोहरी बैकटीक्स में संलग्न विराम चिह्न का समर्थन करते हैं, लेकिन प्रकार नहीं करते हैं?
- 23. आप टेबल क्लस्टर का उपयोग कब करते हैं?
- 24. हास्केल प्रकार एक साधारण 'औसत' फ़ंक्शन को निराशाजनक करते हैं
- 25. आप अपने अपवादों का नाम कैसे व्यवस्थित करते हैं और व्यवस्थित करते हैं?
- 26. @users कैसे प्रस्तुत करते हैं और 'नया' अलग करते हैं?
- 27. करते हैं: मानकों
- 28. परीक्षक क्या करते हैं?
- 29. आप जेनेरिक के लिए डिफ़ॉल्ट प्रकार कैसे प्रदान करते हैं?
- 30. एनएससीओडर बनाम एनएस डिक्शनरी, आप कब उपयोग करते हैं?
"ए' static_cast' हमेशा एक नई, अस्थायी वस्तु में परिणाम देता है "सत्य नहीं है। उदाहरण के तौर पर, श्रेणी पदानुक्रम 'संरचना बी {} दिया गया है; संरचना डी: बी {}; ', निम्नलिखित' static_cast' कोई नई वस्तु नहीं बनाता है: 'डी डी; बी एंड बी (static_cast <बी &>(d)); '। कोई भी' static_cast' जहां लक्ष्य प्रकार एक ऑब्जेक्ट प्रकार है, एक नई वस्तु बना देगा। –
@ जेम्स हाँ, मुझे और सटीक होना चाहिए था। मैं कक्षा के प्रकारों के बारे में सोच रहा था (क्योंकि सवाल शामिल है रचनाकार); वास्तव में, नियम सरल है (और सभी के लिए समान है): यदि परिणाम एक संदर्भ हैं, तो कोई नई वस्तु नहीं है, अन्यथा, वहां है। (मानक के संदर्भ में, एक प्रकार के रूपांतरण का परिणाम यदि एक संदर्भ प्रकार है तो रूपांतरण केवल एक है।) –