2011-06-07 9 views
16

यह निर्धारित करने के नियम क्या हैं कि कोई विशेष static_cast कक्षा के कन्स्ट्रक्टर को कॉल करेगा या नहीं? सी शैली/कार्यात्मक शैली के बारे में कैसे?कब करते हैं नए प्रकार के निर्माता को कॉल करते हैं?

उत्तर

12

किसी भी समय एक नई वस्तु बनाई जाती है, एक निर्माता को बुलाया जाता है। 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() बुलाया जाएगा)

+2

"ए' static_cast' हमेशा एक नई, अस्थायी वस्तु में परिणाम देता है "सत्य नहीं है। उदाहरण के तौर पर, श्रेणी पदानुक्रम 'संरचना बी {} दिया गया है; संरचना डी: बी {}; ', निम्नलिखित' static_cast' कोई नई वस्तु नहीं बनाता है: 'डी डी; बी एंड बी (static_cast <बी &>(d)); '। कोई भी' static_cast' जहां लक्ष्य प्रकार एक ऑब्जेक्ट प्रकार है, एक नई वस्तु बना देगा। –

+0

@ जेम्स हाँ, मुझे और सटीक होना चाहिए था। मैं कक्षा के प्रकारों के बारे में सोच रहा था (क्योंकि सवाल शामिल है रचनाकार); वास्तव में, नियम सरल है (और सभी के लिए समान है): यदि परिणाम एक संदर्भ हैं, तो कोई नई वस्तु नहीं है, अन्यथा, वहां है। (मानक के संदर्भ में, एक प्रकार के रूपांतरण का परिणाम यदि एक संदर्भ प्रकार है तो रूपांतरण केवल एक है।) –

4

यदि वहाँ एक उपयुक्त रूपांतरण निर्माता है कि रूपांतरण निर्माता 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); 
+0

क्या होगा अगर निर्माता स्पष्ट है के बारे में।? मुझे लगता है कि इसे अभी भी बुलाया जाएगा। – Mankarse

+0

@Mankarse: हां, 'स्पष्ट' का अर्थ है कि इसे टाइप निर्दिष्ट किए बिना इसे नहीं कहा जा सकता है। जब आप टाइप निर्दिष्ट करते हैं तो इसे कॉल किया जाएगा। – sharptooth

11

किसी प्रकार के प्रकार के लिए एक कन्स्ट्रक्टर को तब भी कहा जाता है जब उस प्रकार का एक नया उदाहरण बनाया जाता है। यदि एक कास्ट उस वर्ग प्रकार की एक नई वस्तु बनाता है तो एक निर्माता को बुलाया जाता है। ओवरलोड रिज़ॉल्यूशन निर्धारित करता है कि किसी वर्ग प्रकार के रचनाकारों को विशेष तर्क दिए जाते हैं।

यदि static_cast का लक्ष्य प्रकार एक वर्ग प्रकार है, तो यह लक्ष्य प्रकार का एक नया ऑब्जेक्ट बनाएगा।

const_cast, dynamic_cast, या reinterpret_cast कभी भी एक नई कक्षा-प्रकार वस्तु नहीं बनाएगा, और इस प्रकार कभी भी कन्स्ट्रक्टर को कॉल नहीं करेगा।

एक सी शैली डाली के बाद से हमेशा static_cast, const_cast, और reinterpret_cast के कुछ संयोजन करता है, यह एक ही परिस्थितियों है कि एक static_cast एक नई वस्तु बनाने हैं में एक नई वस्तु बनाने होंगे।

+1

यह सही है, लेकिन यह कहना महत्वपूर्ण है कि * कब * यह एक नया उदाहरण बनाता है (आईआईआरसी फ़ंक्शन-स्टाइल कास्ट हमेशा करता है और स्थिर कास्ट करता है जब यह सीवी-योग्यता से अधिक होता है)। –

+0

लक्ष्य प्रकार एक वर्ग प्रकार होने पर 'static_cast' के माध्यम से एक नया वर्ग प्रकार ऑब्जेक्ट बनाया गया है। मैंने उस विवरण के साथ उत्तर अपडेट किया है। –

+0

लेकिन मैंने यह –

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