2009-07-24 18 views
19

मुझे आज एक कार्यक्रम में एक दिलचस्प स्थिति का सामना करना पड़ा जहां मैंने अनजाने में एक std :: स्ट्रिंग के लिए एक हस्ताक्षरित पूर्णांक असाइन किया। विजुअलस्टूडियो सी ++ कंपाइलर ने इसके बारे में कोई चेतावनी या त्रुटियां नहीं दीं, लेकिन जब मैंने प्रोजेक्ट चलाया तो मुझे बग नोटिस हुआ और उसने मुझे अपनी स्ट्रिंग के लिए जंक कैरेक्टर दिए।सी ++ एक स्ट्रिंग को एक पूर्णांक को असाइन करने की अनुमति क्यों देता है?

std::string my_string(""); 
unsigned int my_number = 1234; 
my_string = my_number; 

निम्नलिखित कोड भी ठीक संकलित:

यह वही कोड की तरह देखा की तरह है

std::string my_string(""); 
unsigned int my_number = 1234; 
my_string.operator=(my_number); 

एक त्रुटि में निम्न परिणाम:

unsigned int my_number = 1234; 
std::string my_string(my_number); 

क्या चल रहा है? कैसे संकलक अंतिम कोड ब्लॉक के साथ निर्माण को रोक देगा, लेकिन पहले 2 कोड ब्लॉक बनाने दें?

+0

कंपाइलर त्रुटियां क्या हैं? मेरे लिए, g ++ v4.4 संकलित और सही ढंग से काम करता है – CsTamas

+0

मुझे खेद है, मैंने दूसरे कोड ब्लॉक के साथ गलती की - यह संकलित करता है। आखिरी वाला एक std :: स्ट्रिंग कन्स्ट्रक्टर नहीं होने के बारे में त्रुटि के साथ विफल रहता है जो एक हस्ताक्षरित int स्वीकार करता है। – user55417

उत्तर

28

क्योंकि स्ट्रिंग char से असाइन करने योग्य है, और int स्पष्ट रूप से char पर परिवर्तनीय है।

string& operator=(char ch); 

इस ऑपरेटर char को unsigned int की अंतर्निहित रूपांतरण द्वारा लाया जाता है:

+0

पिछले 2 ब्लॉक के लिए int को निश्चित रूप से कैसे नहीं डाला जाता है? आपका क्या मतलब है कि मैं ऑपरेटर = स्पष्ट रूप से कॉल नहीं कर सकता? क्योंकि निम्न कार्य करता है: my_string.operator = ("हैलो वर्ल्ड"); – user55417

+0

'my_string.operator = (my_number)' 'operator =' के लिए एक स्पष्ट कॉल नहीं है? मैं यहाँ क्या गलत समझ रहा हूँ? – sbi

+0

"आखिरी 2 ब्लॉक के लिए int कैसे अंतर्निहित नहीं किया जाता है?" क्योंकि 1234 में 16 बिट्स फिट बैठते हैं, और वहां एक चार होने के लिए हो सकता है, प्रत्येक हस्ताक्षरित int 16 बिट्स में फिट नहीं होगा। जैसे ही आप एक चार से अधिक रेंज के साथ एक प्रकार निर्दिष्ट करते हैं, आपने संकलक को मूल्य को चारों ओर कास्टिंग करने से रोक दिया। –

20

std :: स्ट्रिंग वर्ग निम्नलिखित असाइनमेंट ऑपरेटर परिभाषित है।

अपने तीसरे मामले में, आप एक स्पष्ट निर्माता का उपयोग कर रहे एक std::string का दृष्टांत के लिए, उपलब्ध कंस्ट्रक्टर्स में से कोई भी एक unsigned int स्वीकार कर सकते हैं, या unsigned int से अंतर्निहित रूपांतरण का उपयोग करें:

string(); 
string(const string& s); 
string(size_type length, const char& ch); 
string(const char* str); 
string(const char* str, size_type length); 
string(const string& str, size_type index, size_type length); 
string(input_iterator start, input_iterator end); 
+3

"ऑपरेटरों को कार्यात्मक कॉल सिंटैक्स का उपयोग करके बुलाया नहीं जा सकता"। 13.5 (4) सी ++ मानक में कहते हैं कि वे कर सकते हैं। –

+0

"ऑपरेटरों को कार्यात्मक कॉल सिंटैक्स का उपयोग करके बुलाया नहीं जा सकता" यह सादा गलत है। – sbi

+1

शर्म, क्योंकि स्वीकार किए गए उत्तर ने पहली बार एक ही गलती की लेकिन उसे वैसे भी वोट दिया गया और फिर सही किया गया, जबकि यह उत्तर अन्यथा बेहतर है और वोट दिया गया है। अगर यह तय हो तो मैं इसके लिए वोट दूंगा। –

2

यह निश्चित रूप से ऑपरेटर = (है char ch) कॉल - मेरा डीबगर उसमें कदम रखा। और मेरा एमएस वीएस 2005 त्रुटि के बिना निम्नलिखित संकलित करता है।

std::string my_string(""); 
unsigned int my_number = 1234; 
my_string = my_number; 
my_string.operator=(my_number); 
0

मैं पहली और तीसरी स्थितियों की व्याख्या कर सकते हैं:

my_string = 1234; 

यह काम करता है क्योंकि स्ट्रिंग अधिरोहित है ऑपरेटर = (चार)। आप वास्तव में स्ट्रिंग में एक वर्ण (डेटा ओवरफ्लो के साथ) असाइन कर रहे हैं। मुझे नहीं पता कि दूसरा केस संकलन त्रुटि में क्यों परिणाम देता है। मैंने जीसीसी के साथ कोड की कोशिश की और यह संकलित करता है।

std::string my_string(1234); 

काम नहीं करेगा, क्योंकि कोई स्ट्रिंग कन्स्ट्रक्टर नहीं है जो एक char या int तर्क लेता है।

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

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