2012-03-04 13 views
14

मेरे पास यहां एक बिल्कुल मूल सी ++ प्रश्न है।सी ++ में ऑपरेटर चेनिंग कैसा होता है?

#include <iostream> 
using namespace std; 

int main() { 
    int a = 255; 
    cout << hex << a << endl; // <----- 
} 

ऊपर कोड टुकड़ा में, कैसे std::cout बयान श्रृंखलित है?

मैं समझता हूँ कि cout के एक कार्यान्वयन cout वस्तु के संदर्भ में वापसी होगी तो होना ही चेनिंग अनुमति देने के लिए, तो यह रूप में निष्पादित किया जाना चाहिए: क्रम में,

(((cout << hex) << a) << endl) 

यानी इन के बराबर

  1. cout << hex
  2. cout << a
  3. cout << endl

लेकिन इस मामले क्योंकि किसी भी तरह a जरूरतों का मूल्य hex रूप में रूपांतरित किया जाने नहीं हो सकता!

ऑपरेटर वास्तव में रूपांतरण करने के लिए संकलक द्वारा कैसे बंधे जाते हैं?

उत्तर

7

यहाँ कैसे hex आमतौर पर कार्यान्वित किया जाता है है बाद में इसे संख्या में पारित किया गया।

संपादित (एक टिप्पणी के जवाब में)

Hammar सही ढंग से नोटों के रूप में, पहेली के अन्य भाग hex(ios_base& __base) कैसे बुलाया जा रहा है। इस हस्ताक्षर के साथ << ऑपरेटर की एक अधिभार है:

ostream& operator <<(ostream& (*)(ostream&)) 

यह अधिभार stream manipulators के आवश्यक कार्यान्वयन विस्तार है। यह अधिभार है जो hex पर कॉल करता है, और इसे "जादू" करने देता है (जो निश्चित रूप से अब आपके लिए जादू की तरह नहीं लगना चाहिए)।

+1

आपको शायद यह भी होना चाहिए पहेली के दूसरे भाग का उल्लेख करें, 'ओस्ट्रीम और ऑपरेटर << (ओस्ट्रीम और (*) (ओस्ट्रीम एंड))' ओवरलोड, जो कि 'हेक्स' जैसे मैनिपुलेटर्स को वास्तव में बुलाया जाता है। – hammar

+0

@hammar ग्रेट अवलोकन! टिप्पणी के लिए बहुत बहुत धन्यवाद, मैंने इस आवश्यक बिंदु को दर्शाने के लिए उत्तर संपादित किया। – dasblinkenlight

22

आपको यह सही मिला है, यह ठीक है कि यह कैसे काम करता है। hex में एक विशेष प्रकार है जो ऑब्जेक्ट की आंतरिक स्थिति को बदलता है जब operator<< फ़ंक्शन पर जाता है। आंतरिक स्थिति तब निर्धारित करती है कि भविष्य में cout पर operator<< के माध्यम से भविष्य के मूल्य कैसे पारित किए जाते हैं।

std::hex एक समारोह होता है। cout << hex हेक्स फ़ंक्शन को इस तरह से कॉल नहीं करता है, हालांकि: यह हेक्स फ़ंक्शन में operator<< ओवरलोड को ostream के लिए एक पॉइंटर पास करता है जो किसी विशेष हस्ताक्षर के साथ फ़ंक्शन पॉइंटर्स स्वीकार करता है। hex() को उस फ़ंक्शन पॉइंटर के माध्यम से ऑपरेटर कार्यान्वयन के अंदर से बुलाया जाता है, और जहां तक ​​मुझे पता है वहां ostream ऑब्जेक्ट को संशोधित करता है।

+0

'हेक्स' एक * विशेष प्रकार * नहीं है। यह एक समारोह है। (या बस कह रहा है, 'हेक्स' * * एक विशेष प्रकार है, समझ में नहीं आता है। * इसका मतलब क्या है?) – Nawaz

+1

हां, यह फ़ंक्शन प्रकार होता है। यह वह प्रकार है जो निर्धारित करता है कि कौन सा 'ऑपरेटर <<' अधिभार कहलाता है, हालांकि। 'cout << हेक्स' 'हेक्स' फ़ंक्शन को इस प्रकार कॉल नहीं करता है: यह हेक्स फ़ंक्शन में एक पॉइंटर को 'ऑपरेटर <<' अधिभार में पास करता है जो किसी विशेष हस्ताक्षर के साथ फ़ंक्शन पॉइंटर्स स्वीकार करता है। जहां तक ​​मुझे पता है, 'हेक्स() 'को ऑपरेटर कार्यान्वयन के अंदर से बुलाया जाता है। – pmdj

+0

+1। अब जवाब बेहतर दिखता है। – Nawaz

2

std::hex वास्तव में std::cout ऑब्जेक्ट के अंदर एक ध्वज सेट करता है, जो आईआईआरसी रीसेट होने तक टिकेगा। operator<< स्वयं का मूल्यांकन बाएं से दाएं है, इसलिए आपके माता-पिता सही हैं।

1

मेरे दृष्टिकोण से हेक्स केवल एक पैकेज ऑब्जेक्ट है जिसका cout ऑब्जेक्ट पर दुष्प्रभाव है। इस कोउट के बाद केवल हेक्साडेसिमल मानों का उत्पादन होगा।

1

std :: हेक्स एक ऐसा फ़ंक्शन है जो std :: ostream ऑब्जेक्ट की स्थिति को बदलता है।

inline ios_base& 
hex(ios_base& __base) 
{ 
    __base.setf(ios_base::hex, ios_base::basefield); 
    return __base; 
} 

आप देख सकते हैं, hex अपने आप में किसी भी रूपांतरण प्रदर्शन नहीं करता: इसके बजाय, यह की छपाई के लिए हेक्स का उपयोग करने के आधार धारा में एक विकल्प सेट http://www.cplusplus.com/reference/iostream/manipulators/hex/

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