2009-10-22 15 views
135

क्या सी शैली कास्टिंग पर static_cast<> पसंद करने का कोई कारण है? क्या वे बराबर हैं? क्या उनके किसी प्रकार का गति अंतर है?static_cast <> और सी शैली कास्टिंग के बीच क्या अंतर है?

+5

संबंधित reinterpret_castfollowed flow.com/questions/103512/in-c-why-use-static-castintx-instead-of-intx – Flow

उत्तर

161

सी ++ स्टाइल कास्ट कंपाइलर द्वारा चेक किए जाते हैं। सी शैली डाले नहीं हैं और,

भी, सी ++ शैली डाले आसानी से खोजे जा सकते हैं कार्यावधि में असफल हो सकता है, जबकि यह ग शैली के लिए खोज करने के लिए बहुत मुश्किल है डाले

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

सी ++ लिखते समय मैं हमेशा सी शैली में सी ++ वाले लोगों का उपयोग करता हूं।

+46

रनटाइम पर असफल होने वाले एकमात्र ऐसा स्थान 'dynamic_cast' हैं। –

+8

सी ++ reinterpret_cast (यू) रन टाइम पर असफल हो सकता है, जिस तरह से सी शैली कास्ट सकता है, और वे सभी डायनेमिक_कास्ट (यू) विफल होने से काफी अलग हैं। –

+11

˗1 सामान्य सी कास्ट '(int) कुछ 'विफल नहीं हो सकता है - या तो आप int या compiler त्रुटि में डाले जाते हैं। –

2

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

12

A comparison of the C++ casting operators देखें।

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

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

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

129

कम में:

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

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

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

char c = 10;  // 1 byte 
int *p = (int*)&c; // 4 bytes 

के बाद से इस आबंटित स्मृति की 1 बाइट के लिए एक 4-बाइट डेटाप्रकार इशारा में परिणाम है, इस सूचक के लिए लिख या तो एक रन-टाइम त्रुटि का कारण होगा या कुछ आसन्न स्मृति ऊपर लिख देगा।

*p = 5; // run-time error: stack corruption 

सी शैली डाली के विपरीत, स्थिर डाली संकलक जाँच करने के लिए है कि सूचक और pointee डेटा प्रकार संगत कर रहे हैं, जो प्रोग्रामर संकलन के दौरान यह गलत सूचक काम को पकड़ने के लिए अनुमति देता है की अनुमति देगा।

int *q = static_cast<int*>(&c); // compile-time error 

तुम भी सी ++ के बारे में अधिक विवरण पर इस पेज की जांच कर सकते डाले: संकलन समय है कि रूपांतरण स्पष्ट रूप से असंगत प्रकार के बीच नहीं है पर Click Here

+9

मुझे लगता है कि "4-बाइट पॉइंटर" के बजाय आपको "4-बाइट डेटाटाइप के सूचक" का अर्थ है – iheanyi

10
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! 
} 
+3

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

+0

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

2

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

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

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

सी-स्टाइल कास्ट संकलित या रन टाइम पर या तो कोई भी जांच नहीं करता है।

1

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

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

  1. const_cast
  2. static_cast
  3. static_cast
  4. reinterpret_cast const_cast द्वारा पीछा किया http: // stackover
  5. const_cast द्वारा
संबंधित मुद्दे