überladen - ostream c++




Warum gibt der Aufruf von cout.operator<<(const char*) die Adresse anstelle der Zeichenkette aus? (2)

Ich habe die ostream Klasse in C ++ erkundet. Ich bin auf die seltsame Ausgabe von cout auf Zeichenfolge und Integer-Datentypen stecken.

Wenn ich einen Integer- oder Gleitkommawert übergebe, ist die Ausgabe genau das, was ich übergebe. Zum Beispiel cout.operator<<(10); druckt 10 . Bei der Übergabe eines Strings als Argument werden jedoch einige hexadezimale Werte ausgegeben:

#include <iostream>
#include <string>

using namespace std;

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

Ausgabe: 0x4007e0 .


Das Problem ist, dass bei einigen Typen der operator<< als Mitglied von ostream und bei einigen Typen als globale Funktion überladen ist. Im Fall von const char* es sich um eine globale Funktion. Wenn Sie die Operatorfunktion explizit aufrufen möchten, müssen Sie schreiben

operator<<(cout, str);

aber für Integer-Typen müssen Sie schreiben

cout.operator<<(num);

Was in dem von Ihnen veröffentlichten Code passiert, ist, dass die Überladung für const void* aufgerufen wird, weshalb Sie hexadezimale Zahlen sehen.


Verwenden Sie cout << str anstelle von cout.operator << (str); Es wird klappen.





c++14