2010-12-02 10 views
11

में रूपांतरण/कास्टिंग भ्रम टाइप करें टाइप करें और कास्टिंग टाइप करें?सी ++

मुझे उनमें से प्रत्येक का उपयोग कब करना चाहिए?

विवरण: क्षमा करें अगर यह एक स्पष्ट प्रश्न है; मैं सी ++ में नया हूं, एक रूबी पृष्ठभूमि से आ रहा हूं और to_s और to_i और इसी तरह इस्तेमाल किया जा रहा है।

उत्तर

15

रूपांतरण है जब एक मूल्य है स्टेटिक कास्टिंग भी आप ठेठ "निहित" प्रकार रूपांतरण होता है कि जब आप की तरह कुछ करने की अनुमति देता , उम, एक अलग प्रकार में परिवर्तित। नतीजा लक्ष्य प्रकार का एक मूल्य है, और आउटपुट मूल्य के परिणाम के लिए नियम हैं जो स्रोत (स्रोत प्रकार के) से हैं।

उदाहरण के लिए:

int i = 3; 
unsigned int j; 
j = i; // the value of "i" is converted to "unsigned int". 

परिणाम unsigned int मूल्य कि i सापेक्ष UINT_MAX+1 समान हो जाता है, और इस नियम भाषा का हिस्सा है। इसलिए, इस मामले में मान (अंग्रेजी में) अभी भी "3" है, लेकिन यह 3 का एक हस्ताक्षरित int मान है, जो 3.

पर हस्ताक्षर किए गए अंतर से अलग है, ध्यान दें कि रूपांतरण स्वचालित रूप से हुआ, हम बस एक ऐसी स्थिति में एक हस्ताक्षरित int मान का उपयोग किया जहां एक हस्ताक्षरित int मान आवश्यक है, और भाषा परिभाषित करती है कि इसका अर्थ यह है कि वास्तव में यह कहकर कि हम परिवर्तित हो रहे हैं। इसे "निहित रूपांतरण" कहा जाता है।

"कास्टिंग" एक स्पष्ट रूपांतरण है।

उदाहरण के लिए:

unsigned int k = (unsigned int)i; 
long l = long(i); 
unsigned int m = static_cast<unsigned int>(i); 

सभी डाले हैं। विशेष रूप से, मानक के 5.4/2 के अनुसार, kकास्ट-अभिव्यक्ति का उपयोग करता है, और 5.2.3/1, l के अनुसार समतुल्य चीज़ का उपयोग करता है (सिवाय इसके कि मैंने एक अलग प्रकार का उपयोग किया है)। m एक "प्रकार रूपांतरण ऑपरेटर" (static_cast) का उपयोग करता है, लेकिन मानक के अन्य हिस्सों को उनको "कास्ट" भी कहा जाता है।

उपयोगकर्ता-परिभाषित प्रकार "रूपांतरण कार्यों" जो अन्य प्रकार के अपने प्रकार परिवर्तित करने के लिए विशिष्ट नियम प्रदान परिभाषित कर सकते हैं, और एकल आर्ग कंस्ट्रक्टर्स रूपांतरण में भी उपयोग किया जाता है:

struct Foo { 
    int a; 
    Foo(int b) : a(b) {}     // single-arg constructor 
    Foo(int b, int c) : a(b+c) {}   // two-arg constructor 
    operator float() { return float(a); } // conversion function 
}; 

Foo f(3,4);    // two-arg constructor 
f = static_cast<Foo>(4); // conversion: single-arg constructor is called 
float g = f;    // conversion: conversion function is called 
3

क्लासिक कास्टिंग (सी 0+ में (Bar)foo की तरह कुछ, सी ++ में reinterpret_cast<> के साथ प्रयोग किया जाता है) तब होता है जब एक चर की वास्तविक स्मृति सामग्री को एक अलग प्रकार का चर माना जाता है। प्रकार रूपांतरण (यानी बूस्ट का lexical_cast<> या अन्य उपयोगकर्ता परिभाषित फ़ंक्शंस जो प्रकारों को परिवर्तित करते हैं) तब होता है जब कुछ तर्क वास्तव में को कनवर्ट करने के लिए एक प्रकार से दूसरे में कनवर्ट करते हैं, जैसे एक स्ट्रिंग के पूर्णांक की तरह, जहां कुछ कोड तर्कसंगत रूप से फ़ॉर्म करने के लिए चलाते हैं एक दिए गए पूर्णांक से बाहर स्ट्रिंग।

वहाँ भी स्थिर और गतिशील कास्टिंग, जो, विरासत में किया जाता है उदाहरण के लिए, एक बच्चे के प्रकार (dynamic_cast<>) पर एक माता पिता के सदस्य कार्यों के उपयोग के लिए मजबूर करने, या इसके विपरीत (static_cast<>) है।

 
float f = 3.14; 
int i = f; //float converted to int by dropping the fraction 

जो के रूप में लिखा जा सकता है::

 
float f = 3.14; 
int i = static_cast<int>(f); //same thing 
+2

+1, लेकिन यह ध्यान दिया जाना चाहिए कि इस शब्दावली का सख्ती से पालन नहीं किया जाता है। 'Int i पर विचार करें; फ्लोट एफ = static_cast (i) '- आपके तर्क से (और मैं सहमत हूं), यह एक * रूपांतरण * है, न कि कलाकार। सी ++ अभी भी 'static_cast' का उपयोग करता है (और हाँ, मुझे पता है कि एक निहित रूपांतरण यहां काम करेगा)। दूसरे शब्दों में: आपने दो शर्तों के अर्थपूर्ण रूप से सबसे सार्थक भेद दिया है। लेकिन सी ++ इस भेद का पालन नहीं करता है। –

+1

कुछ चीजों को स्पष्ट करने के लिए संपादित, उम्मीद है कि मैं गलत जानकारी फैल रहा हूं। –

+1

ऐसा लगता है कि एक * कास्ट-एक्सप्रेशन * (5.4/2) एक कलाकार नहीं है, बल्कि एक रूपांतरण है। यह सामान्य रूप से प्रोग्रामिंग भाषाओं के लिए "कास्ट" बनाम "रूपांतरण" की एक उपयोगी परिभाषा हो सकती है, लेकिन यह सी ++ मानक में उपयोग की जाने वाली "कास्ट" की परिभाषा नहीं है। –

2

C++ में, किसी भी अभिव्यक्ति है एक प्रकार। जब आप एक संदर्भ में एक प्रकार (कहें प्रकार एस) की अभिव्यक्ति का उपयोग करते हैं जहां किसी अन्य प्रकार का मान आवश्यक है (टाइप डी कहें), तो संकलक प्रकार एस से टाइप डी में अभिव्यक्ति को परिवर्तित करने का प्रयास करता है। यदि ऐसा निहित रूपांतरण नहीं होता है अस्तित्व में नहीं है, यह एक त्रुटि में परिणाम। शब्द प्रकार कास्ट मानक नहीं है लेकिन रूपांतरण के समान है।

ईजी।

void f(int x){} 

char c; 

f(c); //c is converted from char to int. 

रूपांतरण रैंक किए गए हैं और आप अधिक जानकारी के लिए promotions vs. conversions के लिए Google पर जा सकते हैं।

5 सी ++ static_cast, const_cast, reinterpret_cast और dynamic_cast में स्पष्ट डाली ऑपरेटर, और कर रहे हैं भी C-style cast

+0

वाह, धन्यवाद दोस्तों, मैं इतनी तेजी से ऐसे महान उत्तरों की उम्मीद नहीं कर रहा था, धन्यवाद! – Ell

+2

@Ell: सी ++ टैग एक व्यस्त है :) –

2

प्रकार रूपांतरण है जब आप वास्तव में एक प्रकार एक और प्रकार में, एक स्ट्रिंग एक पूर्णांक और उपाध्यक्ष में तब्दील उदाहरण के लिए -वर्सा, एक प्रकार का कास्टिंग तब होता है जब स्मृति की वास्तविक सामग्री परिवर्तित नहीं होती है, लेकिन संकलक इसे अलग तरीके से समझता है।

0

टाइप कास्टिंग इंगित करता है कि आप स्मृति के ब्लॉक को अलग-अलग इलाज कर रहे हैं।

int i = 10; 
int* ip = &i; 
char* cp = reinterpret_cast<char*>(ip); 
if (*cp == 10) // Here, you are treating memory that was declared 
{     // as int to be char. 
} 

टाइप रूपांतरण इंगित करता है कि आप एक प्रकार से दूसरे में एक मूल्य को परिवर्तित कर रहे हैं।

char c = 'A'; 
int i = c; // This coverts a char to an int. 
      // Memory used for c is independent of memory 
      // used for i. 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^