आपने इसे तीन भाषाओं के साथ टैग किया है, और उत्तर वास्तव में तीनों के बीच काफी भिन्न हैं। C ++ की चर्चा कमोबेश C जाति की चर्चा के रूप में अच्छी तरह से होती है, और यह चौथा उत्तर देता है (अधिक या कम)।
चूंकि यह वह है जिसका आपने स्पष्ट रूप से उल्लेख नहीं किया है, मैं सी। सी। के साथ शुरू करूँगा जिसमें कई समस्याएं हैं। एक यह है कि वे कई अलग-अलग चीजों में से कोई भी कर सकते हैं। कुछ मामलों में, कलाकार संकलक (संक्षेप में) को बताने से ज्यादा कुछ नहीं करता है: "चुप रहो, मुझे पता है कि मैं क्या कर रहा हूं" - यानी, यह सुनिश्चित करता है कि जब आप रूपांतरण करते हैं तो भी समस्या हो सकती है, संकलक आपको उन संभावित समस्याओं के बारे में चेतावनी नहीं देगा। बस उदाहरण के लिए, char a=(char)123456;
। परिभाषित इस कार्यान्वयन का सटीक परिणाम (आकार और हस्ताक्षर पर निर्भर करता है)char
), और बल्कि अजीब स्थितियों को छोड़कर, शायद उपयोगी नहीं है। सी कास्ट्स में भी भिन्नता है कि क्या वे कुछ हैं जो केवल संकलित समय पर होता है (यानी, आप केवल संकलक को बता रहे हैं कि कुछ डेटा की व्याख्या / उपचार कैसे करें) या कुछ ऐसा जो रन टाइम पर होता है (उदाहरण के लिए, डबल से वास्तविक रूपांतरण लंबा)।
C ++ "नए" कलाकारों के संचालकों को जोड़कर कम से कम कुछ हद तक इससे निपटने का प्रयास करता है, जिनमें से प्रत्येक केवल C कलाकारों की क्षमताओं के सबसेट तक सीमित है। इससे गलती से (उदाहरण के लिए) गलती से एक रूपांतरण हो जाता है जो आपने वास्तव में इरादा नहीं किया था - यदि आप केवल एक वस्तु पर कब्ज दूर करने का इरादा रखते हैं, तो आप उपयोग कर सकते हैं const_cast
, और सुनिश्चित करें कि केवल एक चीज जो इसे प्रभावित कर सकती है, वह है एक वस्तु है const
, volatile
या नहीं। इसके विपरीत, एक static_cast
को प्रभावित करने की अनुमति नहीं है कि कोई वस्तु है const
या नहींvolatile
। संक्षेप में, आपके पास अधिकांश एक ही प्रकार की क्षमताएं हैं, लेकिन उन्हें वर्गीकृत किया जाता है ताकि एक कलाकार आम तौर पर केवल एक ही प्रकार का रूपांतरण कर सके, जहां एक एकल सी-स्टाइल कास्ट एक ऑपरेशन में दो या तीन रूपांतरण कर सकता है। प्राथमिक अपवाद यह है कि आप कम से कम कुछ मामलों में ए की जगह का उपयोग कर सकते हैं और एक के रूप में लिखे जाने के बावजूद , यह वास्तव में ए के रूप में समाप्त हो जाएगा । उदाहरण के लिए, आप किसी वर्ग पदानुक्रम को आगे या पीछे करने के लिए उपयोग कर सकते हैं - लेकिन एक कास्ट "अप" पदानुक्रम हमेशा सुरक्षित होता है, इसलिए इसे स्टैटिकली किया जा सकता है, जबकि एक कास्ट "डाउन" पदानुक्रम जरूरी नहीं है इसलिए यह आवश्यक नहीं है गतिशील रूप से किया।dynamic_cast
static_cast
dynamic_cast
static_cast
dynamic_cast
जावा और C # एक दूसरे के समान हैं। विशेष रूप से, उन दोनों के साथ कास्टिंग (वस्तुतः?) हमेशा एक रन-टाइम ऑपरेशन है। C ++ के कास्ट ऑपरेटर्स के संदर्भ में, यह आमतौर पर एक dynamic_cast
चीज़ के संदर्भ में सबसे नज़दीकी होता है - जो कि, जब आप किसी लक्ष्य प्रकार के ऑब्जेक्ट को डालने का प्रयास करते हैं, तो कंपाइलर रन-टाइम चेक को यह देखने के लिए सम्मिलित करता है कि क्या रूपांतरण की अनुमति है , और एक अपवाद फेंक दो अगर यह नहीं है। सटीक विवरण (उदाहरण के लिए, "खराब कास्ट" अपवाद के लिए उपयोग किया जाने वाला नाम) भिन्न होता है, लेकिन मूल सिद्धांत ज्यादातर समान रहता है (हालांकि, यदि स्मृति कार्य करती है, तो जावा कुछ गैर-ऑब्जेक्ट प्रकारों पर लागू होता है जैसे int
सी के बहुत करीब। कास्ट्स - लेकिन इन प्रकारों का उपयोग शायद ही कभी किया जाता है 1) मुझे यह याद नहीं है कि यकीन है, और 2) भले ही यह सच है, यह वैसे भी बहुत मायने नहीं रखता है)।
चीजों को आम तौर पर देखते हुए, स्थिति बहुत सरल है (कम से कम आईएमओ): एक कास्ट (स्पष्ट रूप से पर्याप्त) का मतलब है कि आप कुछ को एक प्रकार से दूसरे में परिवर्तित कर रहे हैं। जब / यदि आप ऐसा करते हैं, तो यह सवाल उठता है कि "क्यों?" यदि आप वास्तव में एक विशेष प्रकार के लिए कुछ चाहते हैं, तो आपने इसे उस प्रकार से परिभाषित क्यों नहीं किया है जिसके साथ शुरू करना है? यह कहना नहीं है कि इस तरह के रूपांतरण को करने का कोई कारण नहीं है, लेकिन कभी भी ऐसा होता है, तो यह इस सवाल का संकेत देना चाहिए कि क्या आप कोड को फिर से डिज़ाइन कर सकते हैं, इसलिए सही प्रकार का उपयोग किया गया था। यहां तक कि सहज रूप से अंतरंग रूपांतरण (जैसे, पूर्णांक और फ्लोटिंग बिंदु के बीच) की तुलना में सामान्य रूप से बहुत अधिक बारीकी से जांच की जानी चाहिए। उनके लगने के बावजूदसमानता, पूर्णांक वास्तव में चीजों की "गणना" प्रकार और "मापा" प्रकार की चीजों के लिए फ्लोटिंग बिंदु के लिए उपयोग किया जाना चाहिए। भेद को नजरअंदाज करना कुछ पागल बयानों की ओर जाता है जैसे "औसत अमेरिकी परिवार में 1.8 बच्चे हैं।" भले ही हम सभी देख सकते हैं कि यह कैसे होता है, तथ्य यह है कि किसी भी परिवार में 1.8 बच्चे नहीं हैं। उनके पास 1 हो सकता है या वे 2 हो सकते हैं या उनके पास इससे अधिक हो सकता है - लेकिन 1.8 कभी नहीं।