2011-09-20 30 views
8

यह एक शुरुआती प्रश्न हो सकता है और समझ सकता है कि कैसे सीओटी काम संभवतः यहां महत्वपूर्ण है। अगर कोई अच्छी व्याख्या से जुड़ सकता है, तो यह बहुत अच्छा होगा। cout<<cout और cout<<&cout प्रिंट हेक्स मान लिनक्स x86 मशीन पर 4 से अलग हो गए हैं।cout << cout और cout << और cout में C++ के बीच क्या अंतर है?

+0

यहां लोगों के लिए एक उदाहरण है। http://ideone.com/0FZXZ –

+1

वास्तव में क्या प्रश्न है? – Puppy

+3

आप यह क्यों पूछ रहे हैं। सवाल यह नहीं समझता कि ऐसा करने में उनका कोई तर्क नहीं है। –

उत्तर

16

cout << coutcout << cout.operator void *() के बराबर है। यह idiom C++ 11 से पहले उपयोग किया जाता है यह निर्धारित करने के लिए कि क्या iostream विफलता स्थिति में है, और std::ios_base में लागू किया गया है; यह आमतौर पर static_cast<std::ios_base *>(&cout) का पता देता है।

cout << &coutcout के पते को प्रिंट करता है।

चूंकि std::ios_basecout का वर्चुअल बेस क्लास है, तो यह cout के साथ अनिवार्य नहीं हो सकता है। यही कारण है कि यह एक अलग पता मुद्रित करता है।

0

cout<<&cout स्ट्रीम में cout का पता भेज रहा है।

4

cout << &coutcoutcout का पता गुजर रहा है।

cout << cout परोक्ष एक void* सूचक को cout कास्टिंग अपने operator void* का उपयोग कर के मूल्य प्रिंट कर रहा है।

+0

लिंक टूटा हुआ है। – Destructor

+0

मैंने लिंक हटा दिया क्योंकि मुझे उपयुक्त प्रतिस्थापन नहीं मिला। धन्यवाद – GWW

5

cout << coutvoid* पर अंतर्निहित रूपांतरण का उपयोग कर रहा है जो बूलियन परीक्षण उद्देश्यों के लिए मौजूद है। कुछ अनिच्छुक कारणों से आपका कार्यान्वयन उस पते का उपयोग करता है जो std::cout ऑब्जेक्ट में 4 बाइट्स है। सी ++ 11 में यह रूपांतरण हटा दिया गया था, और यह संकलित नहीं होना चाहिए।

cout << &coutstd::cout ऑब्जेक्ट का पता प्रिंट कर रहा है।

3

जैसा कि पहले ही कहा गया है, cout << cout bool परीक्षण (while (some_stream){ ... }, आदि)

यह मूल्य प्रिंट के लिए प्रदान की void* रूपांतरण का उपयोग करता & अदालत 4 रूपांतरण आधार कार्यान्वयन में किया जाता है, और अपने स्वयं के लिए डाले क्योंकि टाइप करें, यह from libstdc++ है:

operator void*() const 
{ return this->fail() ? 0 : const_cast<basic_ios*>(this); } 
संबंधित मुद्दे