Static_cast <> और C शैली कास्टिंग में क्या अंतर है?


जवाबों:


217

सी ++ स्टाइल कास्ट को कंपाइलर द्वारा चेक किया जाता है। C स्टाइल के कास्ट नहीं हैं और रनटाइम में विफल हो सकते हैं।

साथ ही, c ++ शैली की जातियों को आसानी से खोजा जा सकता है, जबकि यह वास्तव में c शैली की जातियों के लिए खोजना कठिन है।

एक और बड़ा लाभ यह है कि 4 अलग सी ++ शैली के कलाकार प्रोग्रामर के इरादे को अधिक स्पष्ट रूप से व्यक्त करते हैं।

C ++ लिखते समय मैं हमेशा C ++ को C स्टाइल के ऊपर उपयोग करता हूँ।


67
रनवे पर विफल हो सकने वाली एकमात्र कास्ट्स हैं dynamic_cast
आर। मार्टिनो फर्नांडिस

12
C ++ reinterpret_cast <T> (U) रन समय पर विफल हो सकता है उसी तरह C शैली डाली जा सकती है, और वे सभी गतिशील_कास्ट <T> (U) से कितने भिन्न हैं।
क्रिस्टोफर स्मिथ

20
Cast1 सामान्य सी कास्ट (int)somethingविफल नहीं हो सकती है - या तो आप इंट या कंपाइलर त्रुटि के लिए तैयार हो जाते हैं।
टॉम ज़ातो -

2
क्या आप विस्तृत कर सकते हैं कि C ++ जातियों को C जातियों की तुलना में अधिक आसानी से क्यों खोजा जा सकता है?
मिन्ह ट्रान

3
@MhhTran C ++ शैली के लिए आप अपने स्रोत फ़ाइलों के लिए "कास्ट" कीवर्ड के लिए खोज कर सकते हैं। लेकिन क्या आप सी-स्टाइल कास्ट्स के साथ कर सकते हैं?
हुंगज़ोंगहाओ

176

संक्षेप में :

  1. static_cast<>() आपको एक संकलित समय की जाँच करने की क्षमता देता है, सी-स्टाइल कास्ट नहीं करता है।
  2. static_cast<>() अधिक पठनीय है और C ++ स्रोत कोड के अंदर कहीं भी आसानी से देखा जा सकता है, C_Style कास्ट is'nt।
  3. इरादों को C ++ जातियों का उपयोग करके बेहतर ढंग से व्यक्त किया जाता है।

अधिक स्पष्टीकरण :

स्थिर कलाकार संगत प्रकारों के बीच रूपांतरण करता है । यह सी-स्टाइल कास्ट के समान है, लेकिन अधिक प्रतिबंधक है। उदाहरण के लिए, सी-स्टाइल कास्ट एक पूर्णांक सूचक को एक चार को इंगित करने की अनुमति देगा।

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 ++ कास्ट्स पर अधिक स्पष्टीकरण पर भी देख सकते हैं: यहां क्लिक करें


17
मुझे लगता है कि "4-बाइट पॉइंटर" के बजाय आपका मतलब है "पॉइंटर टू 4-बाइट
डेटेटाइप

लेकिन यह int q = static_cast <int> (c) की अनुमति देता है;
टोनीपकर

3
@TonyParker ऐसा इसलिए है क्योंकि उस लाइन में कुछ भी गलत नहीं है।
ब्रैडेन बेस्ट

15

C ++ कास्टिंग ऑपरेटर्स की तुलना देखें ।

हालांकि, विभिन्न कास्टिंग संचालन के लिए एक ही वाक्यविन्यास का उपयोग करना प्रोग्रामर के इरादे को स्पष्ट नहीं कर सकता है।

इसके अलावा, एक बड़े कोडबेस में एक विशिष्ट प्रकार की कास्ट को खोजना मुश्किल हो सकता है।

सी-स्टाइल कास्ट की सामान्यता उन स्थितियों के लिए ओवरकिल हो सकती है जहां सभी की जरूरत होती है एक सरल रूपांतरण। अलग-अलग डिग्री के कई अलग-अलग कास्टिंग ऑपरेटरों के बीच चयन करने की क्षमता प्रोग्रामर को अनजाने में गलत प्रकार से कास्टिंग करने से रोक सकती है।


14
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!
}

5
क्या आप अपने समाधान के बारे में थोड़ा और विवरण जोड़कर अपने जवाब को विस्तृत कर सकते हैं?
abarisone

1
मुझे लगता है कि उत्तर दिखाता है कि "static_casts" प्रकार के रूपांतरणों के लिए जाँच करता है ताकि यह सुनिश्चित हो सके कि वे पदानुक्रम ग्राफ में मान्य पथों के साथ हैं। इस विशेष उदाहरण में, A * से B * या B * से A * की कास्टिंग की अनुमति है क्योंकि A और B, पदानुक्रमित ग्राफ में एक पथ बनाते हैं। C * पथ पर नहीं है इसलिए static_cast संकलन-समय त्रुटि उत्पन्न करेगा। सिडेनोट: यह ध्यान देने योग्य हो सकता है कि A * से B * तक कास्टिंग का परिणाम NULL में परिणामी समय पर डायनामिक_कास्ट के साथ हो सकता है जो कि वास्तविक अंतर्निहित वस्तु पर निर्भर करता है।
टॉमी चेन

7

C / C ++ में विभिन्न जातियों की व्याख्या करने वाली एक महान पोस्ट, और C- शैली की कास्ट वास्तव में क्या करती है: https://anteru.net/blog/2007/12/18/200/index.html

सी-स्टाइल कास्टिंग, (प्रकार) चर सिंटैक्स का उपयोग कर। अब तक का सबसे बुरा आविष्कार। यह इस क्रम में निम्नलिखित जातियों को करने की कोशिश करता है: (C ++ मानक, 5.4 expr.cast पैराग्राफ 5 भी देखें)

  1. const_cast
  2. static_cast
  3. static_cast के बाद const_cast
  4. reinterpret_cast
  5. reinterpret_castfollowed द्वारा const_cast

5

static_castसंकलित समय पर जाँच कि रूपांतरण स्पष्ट रूप से असंगत प्रकारों के बीच नहीं है। इसके विपरीत dynamic_cast, रन समय पर संगतता के लिए कोई जांच नहीं की जाती है। इसके अलावा, static_castरूपांतरण आवश्यक रूप से सुरक्षित नहीं है।

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

उपयोगकर्ता static_castको यह सुनिश्चित करना चाहिए कि रूपांतरण सुरक्षित है।

सी-स्टाइल कास्ट किसी भी चेक का प्रदर्शन नहीं करता है, या तो संकलन या रन टाइम पर।


3

चूंकि अलग-अलग शब्दार्थों के साथ प्रत्येक में कई अलग-अलग कास्टिंग हैं, static_cast <> आपको यह कहने की अनुमति देता है कि "मैं एक प्रकार से दूसरे में एक कानूनी रूपांतरण कर रहा हूं" जैसे इंट से डबल। एक सादे सी-स्टाइल कास्ट का मतलब बहुत सारी चीजें हो सकता है। क्या आप ऊपर / नीचे कास्टिंग कर रहे हैं? क्या आप एक पॉइंटर को पुन: स्थापित कर रहे हैं?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.