Ich verstehe den kaskadierten Memberfunktionsaufruf, aber ich verstehe nicht, wie t.setHour (18) .setMinute (30) .setSecond (22); bleibt hängen, muss es nicht etwas zugewiesen werden, da es immer noch zurückkommt * das nachdem es kaskadiert ist? Warum ist es in Ordnung, es so zu lassen?
Der Wert des Ausdrucks, der als Anweisung verwendet wird, wird verworfen. Es ist das gleiche, was passiert, wenn Sie
schreiben %Vor% Sie wussten, dass scanf
einen Rückgabewert hat, richtig? Und so auch ++i
in
Und sogar
%Vor%verwirft das Ergebnis des Ausdrucks.
Es gibt viele Ausdrücke und Funktionen mit Rückgabewerten, die nur am Rande nützlich sind. Wenn Sie den Code so schreiben möchten, dass der Rückgabewert absichtlich und nicht zufällig ignoriert wird, übergeben Sie ihn an void:
%Vor%Dies sollte Compiler-Warnungen über ignorierte Rückgabewerte stummschalten.
Diese Variationen sind auch gültig, aber ein bisschen dümmer:
%Vor%Dies wird als "fließende Syntax", "fließende Schnittstelle" oder "Methodenverkettung" bezeichnet. Sie sind völlig frei zu ignorieren / wegwerfen / nicht mit einem Rückgabewert belästigen, wenn es zur Verfügung gestellt wird (aber Sie sind nicht daran interessiert). Es macht die Verknüpfung von Funktionsaufrufen einfacher (und auf welchem Boot Sie sitzen, ob das gut oder schlecht ist, liegt ganz bei Ihnen).
Daher gibt jede Methode *this
zurück, damit Sie diese Aufrufe zusammen ketten können, aber die letzte wird nur ausgegeben, ignoriert, nicht verwendet.
Das ist völlig in Ordnung.
Da jemand nach einem Standardzitat in einem Kommentar gefragt hat ...
Dies wird als "Ausdrucksanweisung" bezeichnet. Der C ++ 11-Standard sagt dazu Folgendes:
6.2 Ausdrucksanweisung [stmt.expr]
Ausdruckanweisungen haben die Form
%Vor%Der Ausdruck ist ein Ausdruck mit verworfenem Wert (Abschnitt 5). Auf der ganzen Seite Auswirkungen von einer Ausdrucksaussage werden vor der nächsten abgeschlossen Anweisung wird ausgeführt. Eine Ausdrucksanweisung mit dem Ausdruck Missing wird als Null-Anweisung bezeichnet. [Hinweis: Die meisten Aussagen sind Ausdruck Anweisungen - in der Regel Zuweisungen oder Funktionsaufrufe. Eine Null Anweisung ist nützlich, um ein Label direkt vor der} einer Verbindung zu tragen Anweisung und um einer Iterationsanweisung wie z eine while-Anweisung (6.5.1). - Endnote]
Bezüglich des "verworfenen Wertausdrucks" sagt Abschnitt 5:
In einigen Kontexten erscheint ein Ausdruck nur für seine Seiteneffekte. Ein solcher Ausdruck wird als Ausdruck mit verworfenem Wert bezeichnet. Der Ausdruck wird ausgewertet und sein Wert wird verworfen. ...