2011-11-14 10 views
20

क्या किसी को पता है कि इट्रीम ऑब्जेक्ट को बूल अभिव्यक्ति के रूप में क्यों उपयोग किया जा सकता है? उदाहरण के लिए:क्यों आईट्रीम ऑब्जेक्ट को बूल अभिव्यक्ति के रूप में उपयोग किया जा सकता है?

ifstream input("tmp"); 
int iValue; 
while (input >> iValue) 
    //do something; 

यहां input >> iValue ifstream ऑब्जेक्ट का संदर्भ देता है। मैं जानना चाहता हूं कि इस वस्तु का उपयोग बूल अभिव्यक्ति के रूप में क्यों किया जा सकता है।
मैं ifstream वर्ग में देखो और इस निम्नलिखित सदस्य समारोह के कारण हो सकता है कि लगता है:

operator void * () const; 

इस समारोह के बारे में विस्तार के लिए here देखें।
यदि यह है, तो क्या कोई मुझे इस समारोह को समझा सकता है? इस फ़ंक्शन का प्रोटोटाइप सामान्य ऑपरेटर ओवरलोड घोषणा से अलग है। इस समारोह का रिटर्न प्रकार क्या है?
यदि यह नहीं है, तो क्या कारण है कि ifstream ऑब्जेक्ट को बूल अभिव्यक्ति के रूप में उपयोग किया जा सकता है?
आपकी मदद के लिए तत्पर हैं!

चेंग

+0

खैर एक सीधे आगे जवाब होने के बावजूद सवाल पूछा था। –

+0

चूंकि सी ++ 11 वास्तव में 'स्पष्ट ऑपरेटर बूल() ' –

उत्तर

20

सटीक तंत्र जो एक बूलियन अभिव्यक्ति के रूप में एक आईट्रीम के उपयोग को सक्षम बनाता है, को C++ 11 में बदला गया था। जैसा कि आपने पाया है, पहले void* पर एक अंतर्निहित रूपांतरण था। सी ++ 11 में यह explicit रूपांतरण bool पर रूपांतरण है।

एक IStream या एक बूलियन अभिव्यक्ति में ostream की

उपयोग सक्षम किया गया था ताकि सी ++ प्रोग्रामर एक while या for पाश की शर्त के रूप में दुष्प्रभाव साथ एक अभिव्यक्ति का उपयोग जारी कर सकता है:

SomeType v; 

while(stream >> v) 
{ 
    // ... 
} 

और कारण यह है कि प्रोग्रामर ऐसा करते हैं और चाहते हैं, यह है कि यह अधिक संक्षिप्त कोड देता है, कोड जो एक नज़र में लेना आसान है, उदाहरण के लिए & Hellip;

for(;;) 
{ 
    SomeType v; 

    stream >> v; 
    if(stream.fail()) 
    { 
     break; 
    } 
    // ... 
} 

हालांकि, कुछ मामलों में भी ऐसी वर्बोज संरचना बेहतर हो सकती है। निर्भर करता है।

चीयर्स & hth।,

5

यह दिया प्रकार के लिए एक डाली ऑपरेटर है। operator T() टाइप टी के लिए एक कास्ट ऑपरेटर है। if कथन में, ifstream को void* में परिवर्तित कर दिया गया है, और फिर void*bool में परिवर्तित हो गया है।

+4

' शून्य * बूल में परिवर्तित किया गया है .. यह सही नहीं है। इसके बजाय मैं कहूंगा, 'शून्य * की तुलना 0' से की जाती है। – iammilind

+0

इतनी जल्दी जवाब देने के लिए धन्यवाद, मुझे मिल गया। मेरे पास एक और सवाल है: यदि कक्षा में दो कास्ट ऑपरेटर फ़ंक्शन हैं, तो एक int और दूसरे को int *। कॉल के लिए अगर (ओबीजे), कौन सा केस ऑपरेशन फ़ंक्शन कहा जाएगा? क्यूं कर? धन्यवाद। – cheng

+4

@iammilind: यह सही है। सूचक को 'बूल' में परिवर्तित कर दिया जाता है। §4.12 और §6.4.1 जांचें। –

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

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