2010-11-06 14 views
12

वर्ग दो कंस्ट्रक्टर्स साथ foo इस तरह परिभाषित किया गया पर विचार करें:सी ++ में पॉइंटर्स से बूल तक एक अंतर्निहित प्रकार रूपांतरण क्यों है?

class foo 
{ 
public: 
    foo(const std::string& filename) {std::cout << "ctor 1" << std::endl;} 
    foo(const bool some_flag = false) {std::cout << "ctor 2" << std::endl;} 
}; 

एक स्ट्रिंग शाब्दिक साथ वर्ग इन्स्तांत, और लगता है कि जो निर्माता कहा जाता है?

foo a ("/path/to/file"); 

आउटपुट:

ctor 2

मैं तुम्हारे बारे में पता नहीं है, लेकिन मुझे लगता है कि प्रोग्रामिंग के इतिहास में सबसे सहज व्यवहार नहीं पाते हैं। मुझे यकीन है कि इसके लिए कुछ चालाक कारण है, हालांकि, और मैं जानना चाहता हूं कि यह क्या हो सकता है?

+2

संभावित डुप्लिकेट [क्यों संकलक एल "" के अंतर्निहित टाइपकास्ट के लिए स्ट्रिंग पर बूल का चयन करता है?] (Http://stackoverflow.com/questions/316181/why-does-the-compiler-choose-bool-over -स्ट्रिंग-फॉर-इम्प्लीसिट-टाइपकास्ट-ऑफ-एल) – Hasturkun

+2

फिर भी एक और समान प्रश्न: [फ़ंक्शन/विधि ओवरलोडिंग सी ++: डेटा प्रकार भ्रम?] (http://stackoverflow.com/questions/1636181/function-method-overloading- सी-डेटा-प्रकार-भ्रम) – Athari

+0

क्षमा करें। मैंने खोज की (जैसा कि मैंने पाया कि यह एक एफएक्यू होगा), लेकिन मुझे एक शीर्षक के साथ कोई प्रश्न नहीं मिला जो इस बात से जुड़ा हुआ था कि सवाल इस बारे में था। – Oystein

उत्तर

9

यह लिखने के लिए इस

void f(T* ptr) { 
    if (ptr) { 
     // ptr is not NULL 
    } 
} 

आप एक const char* निर्माता बनाना चाहिए सी में बहुत आम है।

+7

निश्चित रूप से आपका मतलब है 'अगर (! पीआरटी) वापसी; '? :) हम नहीं चाहते हैं कि हमारा पूरा कार्य आवश्यकतानुसार ब्लॉक से घिरा हुआ हो। – GManNickG

+3

@GMan: क्रूरता से, मुझे वास्तव में उस तरह के रिटर्न स्टेटमेंट की रक्षा करना पड़ा था, क्योंकि शक्तियों का निर्णय लिया गया था कि कई रिटर्न स्टेटमेंट स्वाभाविक रूप से भ्रमित और पालन करने में कठोर थे, और कोडिंग मानकों में विश्वास को स्थापित करते थे। – Cascabel

+2

मैं इसे उपरोक्त कर दूंगा, अगर यह 'char *' पैरामीटर की अनुशंसा नहीं करेगा:/ –

1

आप दो मुद्दों को भ्रमित कर रहे हैं। एक यह है कि "blah" को string पर स्पष्ट रूप से परिवर्तित किया जा सकता है और दूसरा यह है कि const char* को पूरी तरह से एक बूलियन में परिवर्तित किया जा सकता है। यह देखने के लिए बहुत तार्किक है कि संकलक अंतर्निहित रूपांतरण पर जाता है जो आवश्यक रूपांतरणों की कुल मात्रा को कम करता है।

+0

मैं सिर्फ एक उदाहरण दे रहा था कि मुझे लगता है कि मुठभेड़ के लिए आम बात होगी - मेरा सवाल था _why_ 'बूल' के अंतर्निहित प्रकार रूपांतरण पॉइंटर्स के साथ होता है। – Oystein

2

आप फू कन्स्ट्रक्टर को char * पास कर रहे हैं। इसे निहित रूप से एक बुलियन (जैसा कि सभी पॉइंटर्स) या एक std :: स्ट्रिंग में परिवर्तित किया जा सकता है। कंपाइलर के दृष्टिकोण से, पहला रूपांतरण दूसरे की तुलना में "करीब" है क्योंकि यह उपयोगकर्ता द्वारा प्रदान किए गए रूपांतरण (std :: string (char *) कन्स्ट्रक्टर) पर मानक रूपांतरण (यानी पॉइंटर टू बूल) का पक्ष लेता है।

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