जवाबों:
सी ++ स्टाइल कास्ट को कंपाइलर द्वारा चेक किया जाता है। C स्टाइल के कास्ट नहीं हैं और रनटाइम में विफल हो सकते हैं।
साथ ही, c ++ शैली की जातियों को आसानी से खोजा जा सकता है, जबकि यह वास्तव में c शैली की जातियों के लिए खोजना कठिन है।
एक और बड़ा लाभ यह है कि 4 अलग सी ++ शैली के कलाकार प्रोग्रामर के इरादे को अधिक स्पष्ट रूप से व्यक्त करते हैं।
C ++ लिखते समय मैं हमेशा C ++ को C स्टाइल के ऊपर उपयोग करता हूँ।
dynamic_cast
।
(int)something
विफल नहीं हो सकती है - या तो आप इंट या कंपाइलर त्रुटि के लिए तैयार हो जाते हैं।
संक्षेप में :
static_cast<>()
आपको एक संकलित समय की जाँच करने की क्षमता देता है, सी-स्टाइल कास्ट नहीं करता है।static_cast<>()
अधिक पठनीय है और C ++ स्रोत कोड के अंदर कहीं भी आसानी से देखा जा सकता है, C_Style कास्ट is'nt।अधिक स्पष्टीकरण :
स्थिर कलाकार संगत प्रकारों के बीच रूपांतरण करता है । यह सी-स्टाइल कास्ट के समान है, लेकिन अधिक प्रतिबंधक है। उदाहरण के लिए, सी-स्टाइल कास्ट एक पूर्णांक सूचक को एक चार को इंगित करने की अनुमति देगा।
char c = 10; // 1 byte
int *p = (int*)&c; // 4 bytes
चूँकि यह 4-बाइट पॉइंटर (4-बाइट डेटेटाइप के लिए एक पॉइंटर) के परिणामस्वरूप आवंटित मेमोरी के 1 बाइट की ओर इशारा करता है, इस पॉइंटर पर लिखने से या तो रन-टाइम त्रुटि होगी या कुछ आसन्न मेमोरी को अधिलेखित कर देगा।
*p = 5; // run-time error: stack corruption
सी-स्टाइल कास्ट के विपरीत, स्टेटिक कास्ट कंपाइलर को यह जांचने की अनुमति देगा कि पॉइंटर और पॉइंटी डेटा प्रकार संगत हैं, जो प्रोग्रामर को संकलन के दौरान इस गलत पॉइंटर असाइनमेंट को पकड़ने की अनुमति देता है।
int *q = static_cast<int*>(&c); // compile-time error
आप इस पृष्ठ को C ++ कास्ट्स पर अधिक स्पष्टीकरण पर भी देख सकते हैं: यहां क्लिक करें
C ++ कास्टिंग ऑपरेटर्स की तुलना देखें ।
हालांकि, विभिन्न कास्टिंग संचालन के लिए एक ही वाक्यविन्यास का उपयोग करना प्रोग्रामर के इरादे को स्पष्ट नहीं कर सकता है।
इसके अलावा, एक बड़े कोडबेस में एक विशिष्ट प्रकार की कास्ट को खोजना मुश्किल हो सकता है।
सी-स्टाइल कास्ट की सामान्यता उन स्थितियों के लिए ओवरकिल हो सकती है जहां सभी की जरूरत होती है एक सरल रूपांतरण। अलग-अलग डिग्री के कई अलग-अलग कास्टिंग ऑपरेटरों के बीच चयन करने की क्षमता प्रोग्रामर को अनजाने में गलत प्रकार से कास्टिंग करने से रोक सकती है।
struct A {};
struct B : A {};
struct C {};
int main()
{
A* a = new A;
int i = 10;
a = (A*) (&i); // NO ERROR! FAIL!
//a = static_cast<A*>(&i); ERROR! SMART!
A* b = new B;
B* b2 = static_cast<B*>(b); // NO ERROR! SMART!
C* c = (C*)(b); // NO ERROR! FAIL!
//C* c = static_cast<C*>(b); ERROR! SMART!
}
C / C ++ में विभिन्न जातियों की व्याख्या करने वाली एक महान पोस्ट, और C- शैली की कास्ट वास्तव में क्या करती है: https://anteru.net/blog/2007/12/18/200/index.html
सी-स्टाइल कास्टिंग, (प्रकार) चर सिंटैक्स का उपयोग कर। अब तक का सबसे बुरा आविष्कार। यह इस क्रम में निम्नलिखित जातियों को करने की कोशिश करता है: (C ++ मानक, 5.4 expr.cast पैराग्राफ 5 भी देखें)
- const_cast
- static_cast
- static_cast के बाद const_cast
- reinterpret_cast
- reinterpret_castfollowed द्वारा const_cast
static_cast
संकलित समय पर जाँच कि रूपांतरण स्पष्ट रूप से असंगत प्रकारों के बीच नहीं है। इसके विपरीत dynamic_cast
, रन समय पर संगतता के लिए कोई जांच नहीं की जाती है। इसके अलावा, static_cast
रूपांतरण आवश्यक रूप से सुरक्षित नहीं है।
static_cast
का उपयोग पॉइंटर से बेस क्लास में पॉइंटर से व्युत्पन्न क्लास में, या देशी प्रकारों के बीच करने के लिए किया जाता है, जैसे कि एनम इंट या फ्लोट टू इंट।
उपयोगकर्ता static_cast
को यह सुनिश्चित करना चाहिए कि रूपांतरण सुरक्षित है।
सी-स्टाइल कास्ट किसी भी चेक का प्रदर्शन नहीं करता है, या तो संकलन या रन टाइम पर।
चूंकि अलग-अलग शब्दार्थों के साथ प्रत्येक में कई अलग-अलग कास्टिंग हैं, static_cast <> आपको यह कहने की अनुमति देता है कि "मैं एक प्रकार से दूसरे में एक कानूनी रूपांतरण कर रहा हूं" जैसे इंट से डबल। एक सादे सी-स्टाइल कास्ट का मतलब बहुत सारी चीजें हो सकता है। क्या आप ऊपर / नीचे कास्टिंग कर रहे हैं? क्या आप एक पॉइंटर को पुन: स्थापित कर रहे हैं?