huhu ihrs
wenn ich
cout << cin;
mache, wird eine Adresse ausgeben.
Was ist das für eine Adresse bzw. zu wem gehört diese Adresse?
Danke euch
huhu ihrs
wenn ich
cout << cin;
mache, wird eine Adresse ausgeben.
Was ist das für eine Adresse bzw. zu wem gehört diese Adresse?
Danke euch
vielleicht hilft dies dir weiter...
http://www.cpp-tutor.de/cpp/le04/le04_02.htm
Hi!
Man kann etwas probieren:
Es gibt zwei Möglichkeiten in C++, den <<-Operator zu überladen, einmal als Elementfunktion und einmal als globale Funktion. Der zweite Weg ist üblicher, also kann man es einmal probieren:
Das kompiliert nicht, die Funktion existiert nicht. Folglich muss es eine Elementfunktion sein:
>> Geht und führt zur selben Ausgabe.
Sieht doch aus wie eine Pointer-Adresse, das wollen wir einmal testen:
Ausgabe:
Zitat
0x804a040
0x804a048
Es ist nicht die Adresse von cin, aber die Ähnlichkeit fällt doch auf.
Mit cout sieht die Ausgabe recht ähnlich aus, vermutlich klappt es wohl auf jedem ios oder ios_base geht.
Dazu finden wir hier jedoch keine Funktion operator<< mit ios oder ios_base als Operanden.
Folglich muss eine Konvertierung stattgefunden haben, in ios finden wir operator void*.
#include <iostream>
using namespace std;
int main()
{
cout << (void*)cin << endl;
cout << cin;
}
Die beiden Ausgaben sind identisch!
Das Ergebnis hat laut Doku keine besondere Bedeutung, außer es ist 0, dann ist der interne Status einer, der einen Fehler anzeigt. Warum ein operator void* und kein operator bool verwendet wurde, ist mir schleierhaft.
Viele liebe Grüße
The User
PS:
driver
In der Praxis ist das keine entscheidende Frage, ich glaube es war nur Interesse und kein wirkliches Problem.
PPS:
Die Rückgabe der Funktion ios::operator void* ist vom Compiler abhängig:
Visual C++:
Hierbei wird die Konvertierung im C-Stil geschrieben, was zu Unklarheiten führt.
Anders sieht es beim GNU Compiler in basic_ios (das ist ein Implementierungs-Detail) aus (abgesehen von der besseren Kommentierung, Einrückung und Lesbarkeit!):
Explizit wird klar gemacht, dass ein const_cast stattfindet, denn der Typ von this in einer Funktion mit const nach den Klammern ist const basic_ios*. Anschließend findet implizit die Konvertierung in void* statt, die selbstverständlich sein sollte.
Wenn mehrfache Vererbung ins Spiel kommt, ist die Adresse nicht mehr unbedingt diejenige, die man durch (void*)cin erhält. Dadurch weichen die Zahlen leicht ab.
Es sollte klar sein, dass du den Rückgabewert dieser Funktion nicht verwenden solltest außer als boolean!
das hat mir weitergeholfen
vielen dank euch