2009-12-23 13 views
5

अंदर मैं इस कोडएम्पसेंड कास्टिंग

int n1 = 10; 
int n2 = (int &)n1; 

मैं इस कास्टिंग के अर्थ, n2 n1 को संशोधित करने n1 को प्रतिबिंबित नहीं करता क्योंकि संदर्भ नहीं है समझ में नहीं आता के पार चलो। आश्चर्यजनक रूप से यह कोड जीसीसी में कंपाइलर त्रुटि फेंकता है जहां वीसी ++ में ठीक संकलित होता है।

किसी को भी इस कास्टिंग का अर्थ पता है?

+0

मेरा सी ++ जंगली है लेकिन मुझे लगता है कि एक * या तो इंट आवंटित करने या इनट्स की एक श्रृंखला रखने के लिए इस्तेमाल किया जा सकता है। हालांकि मुझे इस मामले में क्या मतलब होगा और इसका क्या मतलब होगा। –

+2

एन 1 का प्रकार क्या है? –

+0

"संशोधित एन 1 एन 1 को प्रतिबिंबित नहीं करता है" ?? –

उत्तर

9

मान लिया जाये की कुछ बिल्ट-इन प्रकार, int & प्रकार के कलाकारों lvalue n1 (जो भी प्रकार यह था) की पुनर्व्याख्या के lvalue के रूप में प्रदर्शन n2 है int टाइप करें।

int n2 = (int &) n1 घोषणा के संदर्भ में, अगर n1 से ही प्रकार int के lvalue है, डाली ज़रूरत से ज़्यादा है, यह पूरी तरह से कुछ भी नहीं बदलता है। यदि n1const int प्रकार का एक आभासी है, तो कास्ट बस स्थिरता को दूर करता है, जो उपर्युक्त संदर्भ में भी अनिवार्य है। यदि n1 कुछ अन्य प्रकार के lvalue है, डाली बस स्मृति प्रकार int की वस्तु के रूप n1 के कब्जे में (इस प्रकार punning कहा जाता है) reinterprets। यदि n1 एक लालसा नहीं है तो कोड खराब है।

तो, int n2 = (int&) n1 की तरह कोड में int & को कच्चा ही है गैर-अनावश्यक (कुछ वास्तविक प्रभाव पड़ता है) यह punning टाइप करता है जब, यानी जब n1 कुछ अन्य प्रकार के (नहीं int) के एक lvalue है। उदाहरण

float n1 = 5.0; 
int n2 = (int &) n1; 

जो कहने के लिए

int n2 = *(int *) &n1; 

करने के लिए और करने के लिए

int n2 = *reinterpret_cast<int *>(&n1); 

जरूरत नहीं बराबर होगा के लिए, यह एक बहुत बुरा प्रोग्रामिंग अभ्यास है।

यह बीटीडब्ल्यू है, समर्पित सी ++ शैली शैली का उपयोग करते समय मामलों में से एक को दृढ़ता से प्राथमिकता दी जाती है। यदि कोड के लेखक ने सी-स्टाइल कास्ट के बजाय reinterpret_cast का उपयोग किया है, तो आपको शायद इस प्रश्न से पूछना नहीं होगा।

बेशक, यदि n1 स्वयं int प्रकार है, तो इस कलाकार के लिए कोई सार्थक स्पष्टीकरण नहीं है। उस मामले में, यह फिर से पूरी तरह से अनिवार्य है।

पीएस एक संभावना भी है कि n2 ओवरलोडेड रूपांतरण ऑपरेटर के साथ int & प्रकार के साथ एक वर्ग है, जो पूरी तरह से एक अलग कहानी है ... वैसे भी, आपको यह बताना होगा कि n2 तब होता है जब आप ऐसे प्रश्न पूछते हैं।

11

यह पूरी तरह से वैध C++ कोड है, और g ++ 4.4.1 के साथ संकलित करता है। यह n1 के लिए एक अस्थायी संदर्भ बनाता है और उसके बाद संदर्भ n2 के संदर्भ में संदर्भित मान का उपयोग करता है।

यह अगर एक समारोह के रूप expresed देखने के लिए आसान हो सकता है:

void f(int & n1) { 
    int n2 = n1; // initialise with valuue referred to by n1 
} 

नोट इस वैध सी कोड के रूप में सी संदर्भ का समर्थन नहीं करता नहीं है,।

+0

मैं कहूंगा कि इस संदर्भ में यह परिस्थितियों में केवल "प्रीफेक्ली" मान्य है जब यह अनिवार्य है, यानी जब 'n1' के पास 'int' टाइप होता है। जब यह अनावश्यक है, तो यह एक 'reinterpret_cast' है। आम तौर पर जब आपको किसी अन्य ऑब्जेक्ट पर कब्जा कर लिया गया स्मृति दोबारा परिभाषित करने की आवश्यकता होती है, तो परिणामी कोड सिंटैक्टिक रूप से मान्य हो सकता है, लेकिन कहने के लिए बिल्कुल सही है। – AnT

+0

मुझे स्वीकार करना होगा, मुझे लगता है कि एन 1 एक int था। जब तक ओपी respomds, हम कभी नहीं जानते .... –

+1

एक "अस्थायी संदर्भ" क्या है? –

0

यह जीसीसी में भी संकलित करता है (मैंने बस सुनिश्चित करने की कोशिश की)। यह बस संदर्भ के लिए n1 रहता है।

1

मुझे विश्वास है कि यह शायद मूल कोड में एक टाइपो है।

जीसीसी आमतौर पर वीसी ++ की तुलना में अधिक pedantic है। हालांकि यह कोड ठीक लगता है भले ही यह अनावश्यक चीजें कर रहा हो। असल में एक temp संदर्भ n1 के लिए बनाया गया है और फिर कॉपी कन्स्ट्रक्टर का उपयोग n2 को तुरंत चालू करने के लिए किया जाता है।

+0

ऑपरेटर =, निश्चित रूप से? और यदि हां, तो आप गलत होंगे। कोड प्रारंभिकरण दिखाता है, असाइनमेंट नहीं - वे सी ++ में अलग-अलग चीजें हैं। –

+0

सही, उत्तर को सही करना। – rui

+0

'n2' में टाइप' int' है। टाइप करें 'int' कक्षा प्रकार नहीं है। इसमें कोई कॉपी कन्स्ट्रक्टर नहीं है। इसमें कोई रचनाकार नहीं है। – AnT

2
int main() 
{ 
     int n1 = 10; 
     int n2 = (int &)n1; 
     cout<<n2<<endl; 
} 

प्रिंटर 10 अपेक्षित के रूप में।
कलाकारों के साथ कोई समस्या नहीं है।

int main() 
{ 
     int n1 = 10; 
     int n2 = (int &)n1; 
     n2 = 20; 
     cout<<n1<<endl; // print 10 and not 20. 
} 
+0

तो यह "int n2 = n1" से अलग कैसे है? –

1

यह स्पष्ट बात करता है:
यह सिर्फ एक अस्थायी संदर्भ के रूप में अगले उत्पादन ने सुझाव दिया पैदा करता है। एक संदर्भ में n1 कास्ट करें, और उसके बाद इसे int n2 पर असाइन करें।

और मानते हैं कि n1 एक int है, इसे ठीक से संकलित करना चाहिए।

n1 एक रैल्यू है, तो यह संकलित नहीं होगा। निम्नलिखित संकलन नहीं होगा, उदाहरण के लिए:

(int&)foo(); 
(int&)42; 
(int&) (x+y); // assuming x and y are int variables 
+0

अंतिम व्यक्ति पूरी तरह से ठीक संकलित करेगा। कास्ट अतिरिक्त से अधिक प्राथमिकता है। '(int &) x + y' का अर्थ है '((int &) x) + y'। – AnT

+0

सच है। अब फिक्स्ड :) – jalf

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