जवाबों:
पहले, यह समझें कि वे रेखाएँ समतुल्य नहीं हैं ।
int* anInt = (int*)aFloat; // is equivalent to
int* anInt = reinterpret_cast<int*>(aFloat);
यहाँ क्या हो रहा है कि प्रोग्रामर कंपाइलर को यह करने के लिए कह रहा है कि वह जो भी कर सकता है उसे कास्ट करे।
यह अंतर महत्वपूर्ण है क्योंकि static_cast का उपयोग केवल आधार प्रकार के लिए पूछेगा जो कि "सुरक्षित" रूपांतरित करने के लिए होता है, जहाँ reinterpret_cast किसी भी चीज़ में परिवर्तित हो जाएगा, संभवतः दिए गए ऑब्जेक्ट की मेमोरी पर वांछित मेमोरी लेआउट को मैप करके।
तो, जैसा कि "फ़िल्टर" समान नहीं है, सी कास्ट का उपयोग करने की तुलना में विशिष्ट कास्ट का उपयोग करना अधिक स्पष्ट और सुरक्षित है, यदि आप कंपाइलर पर भरोसा करते हैं (या रनटाइम इम्प्लांट। यदि आप डायनेमिक_कास्ट का उपयोग करते हैं) तो आपको यह बताने के लिए कि आपने कुछ गलत कहाँ किया है। , सी कास्ट और reinterepret_cast से बचें।
अब जब यह अधिक स्पष्ट है, तो एक और बात है: static_cast, reinterpret_cast, const_cast और dynam_cast को खोजना आसान है ।
और अंतिम बिंदु: वे बदसूरत हैं । यही चाहता था। संभावित रूप से छोटी गाड़ी का कोड, कोड की बदबू, स्पष्ट "चाल" जो कीड़े उत्पन्न कर सकते हैं, ट्रैक करना आसान है जब यह बदसूरत नज़र से जुड़ा हो। बुरा कोड बदसूरत होना चाहिए ।
वह "डिज़ाइन द्वारा" है। और यह डेवलपर को यह जानने की अनुमति देता है कि वह कहां से चीजों को बेहतर तरीके से कर सकता है (पूरी तरह से जाति से बचने के लिए, अगर वास्तव में जरूरत नहीं है) और जहां यह ठीक है लेकिन यह कोड में "दस्तावेज" है इसे "बदसूरत" के रूप में चिह्नित करें।
नई शैली के कलाकारों को पेश करने का एक माध्यमिक कारण यह था कि सी-स्टाइल कलाकारों को एक कार्यक्रम में स्थान देना बहुत कठिन है। उदाहरण के लिए, आप साधारण संपादक या वर्ड प्रोसेसर का उपयोग करके आसानी से जातियों की खोज नहीं कर सकते। सी-शैली के कलाकारों की यह निकट-अदृश्यता विशेष रूप से दुर्भाग्यपूर्ण है क्योंकि वे संभावित रूप से हानिकारक हैं।एक बदसूरत ऑपरेशन में एक बदसूरत सिंटैक्टिक रूप होना चाहिए। यह अवलोकन नई शैली की जातियों के लिए वाक्य रचना को चुनने के कारण का हिस्सा था। नई शैली की जातियों का खाका नोटेशन से मेल खाने का एक और कारण था, ताकि प्रोग्रामर अपनी खुद की कास्ट, विशेष रूप से रन-टाइम चेक की हुई जातियों को लिख सकें।
हो सकता है, क्योंकि static_cast इतनी बदसूरत और इतनी अपेक्षाकृत टाइप करने के लिए कठिन है, आप एक का उपयोग करने से पहले दो बार सोचने की संभावना है? यह अच्छा होगा, क्योंकि आधुनिक C ++ में कलाकार वास्तव में परहेज करते हैं।
C ++ जातियां अधिक प्रतिबंधात्मक हैं (इसलिए अपने इरादे को बेहतर तरीके से व्यक्त करें और कोड समीक्षा को आसान बनाएं, आदि)। यदि आपको कभी भी आवश्यकता हो, तो उन्हें खोजना बहुत आसान है।
विकल्प सी: एक "सी ++ - स्टाइल" कास्ट, क्योंकि यह एक निर्माण से अप्रभेद्य है:
int anInt = int(aFloat);
या और भी:
int anInt(aFloat);
इसके अलावा, आदिम के साथ इन तुच्छ मामलों के अलावा, जिन्हें अच्छी तरह से समझा जाता है, मैं सी-शैली की जातियों पर x_cast <> का उपयोग करना पसंद करता हूं। तीन कारण हैं:
वे उस ऑपरेशन को अधिक संकीर्ण रूप से परिभाषित करते हैं जो प्रोग्रामर प्रदर्शन करने की कोशिश कर रहा था।
वे ऐसी क्रियाएं कर सकते हैं जो C- शैली की जातियां नहीं कर सकती (विशेष रूप से डायनेमिक_कास्ट <>, जो कई-वंशीय श्रृंखला की शाखाओं को पार कर सकती हैं)।
वे बदसूरत हैं । वे जोर से घोषणा करते हैं कि प्रोग्रामर टाइप सिस्टम के खिलाफ काम कर रहा है। इस मामले में, यह अच्छी बात है।
यदि C में कोड लिखना C जाति का उपयोग करता है। यदि C ++ में लिखना C ++ कास्ट का उपयोग करता है।
जबकि अधिकांश कास्टिंग उचित प्रकार-सुरक्षा को तोड़ती हैं, C ++ वाले अधिक प्रतिबंधक हैं, और इसलिए आप C कास्ट के साथ होने की तुलना में थोड़े कम असुरक्षित हैं।
मैं (T *) का उपयोग करके किसी को सहन कर सकता हूं, हालांकि एक अधिभार को मजबूर करने के लिए ...
मेरे पास C / C ++ शैली के बारे में कुछ नियम हैं:
const_cast
। ज़ाहिर कारणों की वजह से। अफसोस की बात है कि एक कास्ट को लागू करने के बारे में मेरे नियम के कारण कीबोर्ड को पहुंचने और प्रोग्रामर की उंगली तोड़ने की मंजूरी नहीं मिली।reinterpret_cast
। यह वास्तव में कास्ट की तरह है कि सी नहीं है: इस पूर्णांक बिट का दिखावा वास्तव में फ्लोट के बिट्स हैं। इस तरह अप्रियता से बचा जाता है (int)(*(int*)(&floatVar))
।dynamic_cast
" , तो अपने पॉलीमॉर्फिक क्लास पदानुक्रम और डिज़ाइन को रोकें और पुनर्मूल्यांकन करें। अपनी कक्षा पदानुक्रम की डिज़ाइन का पुनर्मूल्यांकन तब तक जारी रखें जब तक आप उन शब्दों को हटा नहीं सकते।static_cast
।# 4 के पीछे तर्क बस इतना है कि यह कोई फर्क नहीं पड़ता। जो परिस्थितियां अन्य नियमों में फिट नहीं होती हैं वे या तो स्पष्ट हैं या वास्तव में निम्न स्तर की हैं। इंट-टू-फ्लोट जैसे सरल प्रकारों के एक सुव्यवस्थित रूपांतरण को विशेष वाक्यविन्यास की आवश्यकता नहीं होनी चाहिए। और अगर आप किसी चीज के गहरे, बदसूरत हिम्मत में नीचे हैं, ठीक है, आप किसी चीज के गहरे, बदसूरत हिम्मत में नीचे हैं। इस तथ्य पर ध्यान आकर्षित करने की कोई आवश्यकता नहीं है कि "यहां पर ड्रेगन हो," चूंकि दांत, पंजे, और आग बहुत ज्यादा पहले से ही इसे दूर कर देती है।
dynamic_cast
एक पूरी तरह से मान्य उपकरण है। शायद ही कभी, मैं मानता हूँ, लेकिन यह वैश्विक चर की तरह चीजों के शैतान से दूर है। हालाँकि, मुख्य रूप से, मैंने आपको अस्वीकार कर दिया क्योंकि आपने उस प्रश्न का उत्तर नहीं दिया था, जो सी-स्टाइल कास्ट के उपयोग या नहीं के बारे में था।
जैसा कि ऊपर दिए गए पोस्ट ध्यान दें कि C ++ (स्थिर) कास्ट व्यवहार में थोड़ा सुरक्षित है।
यह विभिन्न प्रकार के कास्टिंग और उनके समर्थक और विपक्ष के बारे में कुछ और जानकारी देखने के लिए स्मार्ट हो सकता है।
बस एक पृष्ठभूमि का अधिक क्यों है। ।
http://en.wikipedia.org/wiki/Static_cast
यह वास्तव में निर्भर करता है कि मैं किस भाषा के साथ काम कर रहा हूं, क्योंकि आप जानते हैं कि वे क्या कहते हैं: रोम में रोमन बोलते हैं। इसलिए यदि मैं C में प्रोग्रामिंग कर रहा हूं, तो मैं अधिकतम में C सुविधाओं का उपयोग करने का प्रयास करता हूं, लेकिन यदि मैं C ++ पर प्रोग्रामिंग कर रहा हूं, तो मैं आगे बढ़ता हूं और C ++ सुविधाओं का अधिकतम उपयोग करता हूं, भले ही कुछ लोग उस दृष्टिकोण को पसंद न करें क्योंकि वे कहते हैं कि यह कोड को "कम पोर्टेबल" बनाता है, मैं कहता हूं कि मुझे परवाह नहीं है, मैं C ++ में हूं और C ++ में प्रोग्रामिंग कर रहा हूं, और मुझे कोड संकलित करने के लिए पूरी तरह से C ++ संगत संकलक की आवश्यकता है, अन्यथा मैं कुछ अलग काम करूंगा पहली जगह में।
जब टेम्पलेट में उपयोग किया जाता है, तो C शैली कलाकारों के साथ समस्याओं के कारण static_cast आदि का आविष्कार किया गया था। यदि आप एक टेम्प्लेट लिख रहे हैं, या यदि आप कोड हैं, तो बाद में एक टेम्प्लेट में परिवर्तित किया जा सकता है, तो C ++ - स्टाइल कास्ट का उपयोग करना एक अच्छा विचार है। इसका कारण यह है कि C ++ - शैली के लोग बेहतर इरादे व्यक्त करते हैं, इसलिए वे उन मामलों में अपेक्षित परिणाम देंगे जहां C- शैली की गलतियां गलत कार्य करेंगी (विशेष प्रकार के टेम्पलेट मापदंडों के रूप में)।
इसके अलावा, मैं कहता हूं कि अगर आप किसी विशिष्ट मुद्दे की जरूरत है तो C ++ - शैली की कास्ट का उपयोग करें - डायनेमिक_कास्ट सबसे आम है, लेकिन यहां तक कि शायद हर दिन की चीज नहीं है।
और कुछ भी, और सी स्टाइल कास्ट थोड़ा कम अव्यवस्थित हो सकता है और पठनीयता में मदद कर सकता है, या शायद इस बात पर निर्भर नहीं करता कि पाठक इन दिनों उस कास्ट स्टाइल से कितना परिचित है। मेरे विचार में यह वास्तव में महत्वपूर्ण नहीं है, ज्यादातर व्यक्तिगत पसंद की चीज है, हालांकि कुछ लोगों को सी शैली पसंद नहीं है, तो आश्चर्यचकित न हों।
अंतिम नोट - यदि आपको बहुत सारे कलाकारों की आवश्यकता है तो यह एक बड़ी बात है, आप शायद कुछ और गलत कर रहे हैं। कुछ मामलों में इसके अपवाद हैं, लेकिन अधिकांश उच्च स्तरीय कोड को कई (यदि कोई हो) की आवश्यकता नहीं है।
reinterpret_cast<int>(double);
। एक सी-स्टाइल कास्ट के साथ एक इंट का डबल कास्ट करना पूरी तरह से संभव है, लेकिन इसे reinterpret_cast के साथ करना संभव नहीं है। मैं देखता हूं कि टिम्बो ने पहले ही आपको यह इंगित कर दिया था, और आपने कहा था कि आप इसे ठीक कर देंगे, लेकिन चार साल बाद भी यह गलत है। मैं अभी भी आपको नीचा दिखाऊंगा अगर यह तय किया गया था, क्योंकि कास्ट का उपयोग करने के लिए पूरी तरह से वैध कारण हैं। यहाँ एक बेहतर जवाब है: stackoverflow.com/a/332086/3878168