c++ - कॉलिंग कोऑपरेटर क्यों कहा जाता है<<(const char*) कैरेक्टर स्ट्रिंग के बजाय एड्रेस प्रिंट करें?




c++11 c++14 (2)

मैं C ++ में ostream क्लास की खोज कर रहा था। मैं स्ट्रिंग और पूर्णांक डेटा प्रकारों पर cout के अजीब आउटपुट पर फंस गया हूं।

जब एक पूर्णांक या फ्लोटिंग-पॉइंट मान पास करते हैं, तो आउटपुट वही होता है जो मैं पास करता हूं। उदाहरण के लिए cout.operator<<(10); प्रिंट 10 । लेकिन जब एक स्ट्रिंग को एक तर्क के रूप में पारित किया जाता है तो यह कुछ हेक्साडेसिमल मानों को मुद्रित कर रहा है:

#include <iostream>
#include <string>

using namespace std;

int main() {
        const char* str = "aia";
        cout.operator<<(str);
        return 0;
}

आउटपुट: 0x4007e0


Cout.operator << (str) के बजाय cout << str का उपयोग करें; यह काम करेगा।


जब आप cout.operator<<(str) तो आप cout के operator << सदस्य फ़ंक्शन को कॉल करते हैं। यदि हम देखते हैं कि हमारे पास कौन से सदस्य कार्य ओवरलोड हैं

basic_ostream& operator<<( short value );
basic_ostream& operator<<( unsigned short value );

basic_ostream& operator<<( int value );
basic_ostream& operator<<( unsigned int value );

basic_ostream& operator<<( long value );
basic_ostream& operator<<( unsigned long value );

basic_ostream& operator<<( long long value );
basic_ostream& operator<<( unsigned long long value );

basic_ostream& operator<<( float value );
basic_ostream& operator<<( double value );
basic_ostream& operator<<( long double value );

basic_ostream& operator<<( bool value );

basic_ostream& operator<<( const void* value );

basic_ostream& operator<<( std::nullptr_t );

basic_ostream& operator<<( std::basic_streambuf<CharT, Traits>* sb);

basic_ostream& operator<<(
    std::ios_base& (*func)(std::ios_base&) );

basic_ostream& operator<<(
    std::basic_ios<CharT,Traits>& (*func)(std::basic_ios<CharT,Traits>&) );

basic_ostream& operator<<(
    std::basic_ostream<CharT,Traits>& (*func)(std::basic_ostream<CharT,Traits>&) );

यदि आप ध्यान दें, तो एक const char* लिए एक नहीं है, लेकिन एक const void* लिए एक है। तो, आपका const char* एक const void* const char* में बदल जाता है और फ़ंक्शन का वह संस्करण पॉइंटर द्वारा आयोजित पते को प्रिंट करता है।

आपको जो करने की आवश्यकता है वह operator<< के गैर सदस्य फ़ंक्शन अधिभार को कॉल करता है operator<< और ऐसा करने के लिए जिसे आप उपयोग कर सकते हैं

cout << str;




c++14