2009-08-10 23 views
20

संभव डुप्लिकेट:
Regular cast vs. static_cast vs. dynamic_castस्थिर डाली बनाम गतिशील डाली

मैं काफी जब स्थिर कास्ट और जब गतिशील उपयोग करने के लिए नहीं मिलता है। कोई स्पष्टीकरण कृपया?

+5

डुप: http://stackoverflow.com/questions/28002/regular-cast-vs-staticcast-vs- गतिशीलता –

उत्तर

29

बेस क्लास प्रकार से व्युत्पन्न वर्ग प्रकार में कास्टिंग करते समय dynamic_cast का उपयोग करें। यह जांचता है कि ऑब्जेक्ट डाला जा रहा है वास्तव में व्युत्पन्न वर्ग प्रकार का है और यदि ऑब्जेक्ट वांछित प्रकार का नहीं है (जब तक कि आप एक संदर्भ प्रकार कास्टिंग नहीं कर लेते हैं) - तो यह bad_cast अपवाद फेंकता है)।

static_cast का उपयोग करें यदि यह अतिरिक्त चेक आवश्यक नहीं है। जैसा कि अर्काइट्स ने कहा था, चूंकि dynamic_cast अतिरिक्त चेक करता है, इसके लिए आरटीटीआई जानकारी की आवश्यकता होती है और इस प्रकार अधिक रनटाइम ओवरहेड होता है, जबकि static_cast संकलन समय पर किया जाता है।

+2

गतिशील कास्ट का संदर्भ संदर्भों के लिए भी उपयोग किया जा सकता है, इस मामले में वे एक शून्य बिंदु –

+0

गतिशील_कास्ट को वापस करने के बजाए कास्टिंग त्रुटि पर अपवाद फेंक सकते हैं, रनटाइम पर भी अपवाद फेंक सकते हैं। –

+0

@Neil, मार्टिन: धन्यवाद, मैंने अपना जवाब संपादित कर लिया है। –

2

गतिशील कलाकारों को आरटीटीआई की आवश्यकता होती है और स्थिर जादू की तुलना में कुछ जादू करता है। static_cast सिर्फ एक संकलित समय कास्ट है, यह जांचता है कि मूल वर्ग को कुछ सरल नियमों द्वारा विरासत के रूप में जाति वर्ग में पदोन्नत किया जा सकता है।

उदाहरण के लिए, वर्चुअल विरासत के मामलों में केवल dynamic_cast स्थिति को हल कर सकता है।

इसके अलावा, यदि संभव नहीं है तो गतिशील_कास्ट न्यूल वापस आ जाएगा, इसलिए आप एक अलग निर्णय ले सकते हैं।

दूसरी तरफ, गतिशील_कास्ट धीमा है, क्योंकि इसका मतलब है कि कुछ कोड निष्पादित किए जा रहे हैं, और जैसा कि पहले कहा गया है, इसे आरटीटीआई सक्षम करने की आवश्यकता है जो बाइनरी के आकार को बढ़ाता है।

+0

गतिशील_कास्ट रनटाइम पर भी अपवाद फेंक सकता है। –

0

यदि आप सी ++ के बारे में बात कर रहे हैं। फिर static_cast कास्टिंग का सुरक्षित प्रकार नहीं है। यह आपके प्रकार पर जा सकता है लेकिन यदि यह गलत है तो यह कोई त्रुटि/संदेश नहीं फेंक देगा। तो आप उस से खराब वस्तु प्राप्त करेंगे। और कास्टिंग विफल होने पर गतिशील_कास्ट त्रुटि फेंक रहा है :) उम्मीद है कि इससे मदद मिलती है! :)

3

आरटीटीआई जैसे रन-टाइम पर गतिशील_कास्ट चेक जानकारी उपलब्ध है, यह क्लास पदानुक्रमों को भी देखता है ताकि यह देखने के लिए कि ऐसी कास्ट संभव है या नहीं।

चेक C++ type casting tutorial at cplusplus.com

2

static_cast वर्ष सी शैली डाली के समान है और सिर्फ कुछ के बारे में करने के लिए लागू किया जा सकता। static_cast का उपयोग तब किया जाएगा जब आप कुछ प्रकार के प्रश्न पूछें। उदाहरण के लिए, int और enum के बीच कास्टिंग करते समय, आमतौर पर static_cast का उपयोग करता हूं।

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

इसके अलावा बाहर की जाँच C++ : Documentation : C++ Language Tutorial : Type Casting

+2

आप static_cast के बारे में क्या कहते हैं वास्तव में reinterpret_cast –

+0

के बारे में अधिक सही ढंग से कहा जाएगा, मैं anon से सहमत हूं, reintepret_cast सी शैली कास्ट के समान है। – Aminos

2

स्टेटिक कास्टिंग संकलक द्वारा किया जाता है: यह लक्ष्य प्रकार के रूप में परिणाम व्यवहार करता है, कोई बात नहीं क्या। जब आप लक्ष्य प्रकार के तर्क के बारे में पूरी तरह से सुनिश्चित होते हैं तो आप ऐसा करते हैं।

गतिशील कास्टिंग रनटाइम पर किया जाता है, और इस प्रकार रनटाइम प्रकार की जानकारी की आवश्यकता होती है।जब आप अपने प्रकार के बारे में अनिश्चित होते हैं तो आप ऐसा करते हैं: कास्ट असफल हो सकती है, जो रिटर्न वैल्यू द्वारा शून्य दिखाया जाता है। यह केवल पॉइंटर्स और संदर्भों के लिए भी किया जा सकता है।

7

कुछ संदर्भों में, इस तरह की, "स्थिर" संकलन-समय और "गतिशील" को संदर्भित करता है जो रन-टाइम को संदर्भित करता है।

संकलन-समय की जांच के लिए, static_cast का उपयोग करें (संकलक जानता है कि सीमित)। रन-टाइम जांच के लिए, गतिशील_कास्ट (आरटीटीआई के साथ कक्षाओं तक सीमित) का उपयोग करें। कोई जांच के लिए, reinterpret_cast का उपयोग करें।

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