6 Stimmen

>> und << Überladen von Operatoren

Ich habe gerade ein Quiz für meinen Programmierkurs gemacht und habe diese Frage falsch beantwortet:

Der Rückgabetyp der Funktion, die Überladung des Operators << m Referenz auf ein ostream-Objekt sein.

Das scheint mir überhaupt nicht richtig zu sein. Sicherlich ist C++ ein bisschen offener als das. Aber ich dachte, ich frage hier trotzdem mal nach. Wie kann das richtig (oder falsch) sein? Meine C++-Kenntnisse beginnen wirklich zu verblassen, wenn es um Operatorüberladung geht

19voto

Thanatos Punkte 40150

In C++ ist es nicht erforderlich, dass der Rückgabetyp ein Verweis auf eine ostream Objekt. Wenn Sie jedoch versuchen, etwas zu tun wie:

cout << instance_of_custom_type << 3 << "hi" << endl;

Dann brauchen Sie:

ostream &operator << (ostream &os, custom_type &t);

Wenn Sie jedoch z.B. einen großen Integer-Typ schreiben und die Bitverschiebung unterstützen wollen, könnte das etwa so aussehen:

BigInt operator << (const BigInt &i, unsigned int shift);

Um dies noch ein wenig weiter auszuführen: Die ursprüngliche Verwendung des << Operator ist für die Bitverschiebung. 1 << 8 ist zum Beispiel 256. C++ fügte eine (leicht verwirrende) zweite Verwendung für diese Funktion hinzu und überlud sie auf ostream als "Ausgabe" in den Stream zu verstehen. Innerhalb eines überladenen Operators können Sie tun, was immer Sie wollen - er funktioniert genau wie eine Funktion, allerdings sind Operatoren mit einer menschlichen Erwartung verbunden: Programmierer erwarten in C++, dass << ist die Bitverschiebung oder Stromausgabe.

2voto

Chubsdad Punkte 23861

Da der Rückgabetyp ein Verweis auf dasselbe Stream-Objekt ist, das als Referenzargument an den überladenen Einfügeoperator übergeben wird, können wir Code wie den folgenden schreiben

mystream &operator << (mystream &os, myclass &myobject){
   // do whatever
   return os;
}

mystream << myobject << fundamental_type_object;

2voto

Alok Save Punkte 196241

Der Rückgabetyp der Funktion zur Überladung des Operators << muss ein Verweis auf eine ostream Objekt.

Die Aussage "muss" ist falsch, wahrscheinlich ist "normalerweise" das richtige Wort, und warum? Weil es, wie in den meisten Antworten bereits betont wurde, die Bequemlichkeit von object chaining bei der Arbeit mit iostreams .

1voto

André Caron Punkte 43205

Vom allgemeineren Standpunkt aus betrachtet, operator<< sollte immer den Operanden auf der linken Seite zurückgeben, um Aufrufe zu verketten, genau wie operator= .

Beim Umgang mit dem <iostreams> Bibliothek ist dies zufällig ein Verweis auf std::ostream .

0voto

Ben Jackson Punkte 84305

Der Zweck der Rückgabe der ostream-Referenz besteht darin, dass man sie miteinander verketten kann. Andernfalls müssten Sie schreiben cout << 1; cout << " is a number"; cout << endl

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X