Ich habe eine Weile nach einer guten Erklärung gesucht, warum / warum nicht die folgende Verwendung des Konstruktors struct
als Funktionsargument zulässig ist. Kann mir jemand einen geben?
Ich hatte den Eindruck, dass ein Konstruktor weder einen Rückgabetyp noch eine Aussage hat ...
Es ist legal.
Sie rufen den Konstruktor nie selbst auf; Sie deklarieren gerade ein unbenanntes oder "temporäres" Objekt vom Typ Item
. Sehen Sie, wie sich die Syntax entwickelt, wenn Sie das Objekt unbenannt machen:
Obwohl es so aussieht, als würden Sie den Konstruktor wie eine Funktion aufrufen, sind Sie das nicht.
Wie auch immer, Sie können das Temporäre als "rvalue" (weil es eins ist) in Funktionsargumenten und ähnlichem verwenden, was Sie hier tun.
Übrigens, verwenden Sie nicht die alten Header iostream.h
und vector.h
. Sie sind älter als 1998. In ISO Standard C ++ sollten Sie iostream
bzw. vector
verwenden. Standard-Header in C ++ enden nicht in ".h" (inb4, ignorieren die aus Gründen der Abwärtskompatibilität geerbten C-Header).
Es wird nicht der Konstruktor oder sein Rückgabewert an push_back
übergeben. C ++ verwendet den Konstruktor tatsächlich, um ein namenloses temporäres Objekt zu erstellen, das nur für die Dauer des Funktionsaufrufs existiert. normalerweise auf dem Stapel. Dies wird dann an push_back
übergeben, und push_back
kopiert seinen Inhalt in Ihren Vektor.
Dies ist zulässig, weil push_back
das Argument von const als Referenz verwendet und anschließend eine Kopie des Objekts erstellt. Der Aufruf des Konstruktors erstellt ein temporäres Objekt, das ein Rvalue ist. Eine const-Referenz kann einen rvalue binden. Die Methode kann das übergebene Objekt nicht ändern, aber sie kann eine Kopie erstellen.
Obwohl es wie ein Funktionsaufruf aussieht, ist der Ausdruck Element (img, i) eigentlich die Erstellung eines temporären Objekts. Der Unterschied ist, dass in der Laufzeit Speicher für das Objekt auf dem Stapel reserviert wird, und dann wird der Konstruktor aufgerufen, während, wenn dies ein regulärer Funktionsaufruf wäre, kein Speicher zugewiesen würde.
Tags und Links c++ arguments constructor function