Mit einem Konstruktor in einer Funktion aufrufen?
Ich habe Suche eine Weile für eine gute Erklärung, warum/warum nicht das verwenden der struct
Konstruktor als argument function legal ist. Kann mir jemand eine zur Verfügung?
//Begin simple illustrative example C++ program
#include<vector.h>
struct Item
{
Item(double data, const int lead)
: m_grid(data), m_lead(lead) {}
double m_grid;
int m_lead;
};
int main()
{
double img = 0.0;
int steps = 5;
std::vector<Item> images;
for (int i = 0; i < steps; i++)
{
img += 2.0;
images.push_back(Item(img,i));
}
return 0;
}
War ich unter dem Eindruck, einen Konstruktor hat weder Rückgabetyp noch die Aussage...
- Ist es C++? Bitte wählen Sie Ihre Sprache.
- Sorry, ja, C++
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es legal.
Du nie rufen Sie den Konstruktor selbst; Sie sind eigentlich nur zu erklären, eine Unbenannte oder "temporary" - Objekt vom Typ
Item
. Sehen Sie, wie die syntax entwickelt sich, wenn Sie das Objekt Unbenannte:Obwohl es aussieht, als wenn Sie ruft den Konstruktor wie eine Funktion, Sie sind es nicht.
Sowieso, können Sie die temporäre als "rvalue" (weil es einer ist) in Funktion von Argumenten und dergleichen, das ist, was du hier tust.
BTW, nicht die alten
iostream.h
undvector.h
Header. Sie verdrängen 1998. Im ISO-Standard C++ verwenden, sollten Sieiostream
undvector
beziehungsweise. Der Standard-Header in C++ nicht enden ".h" (inb4, ignorieren die C-Header vererbt für rückwärts-Kompatibilität).Es ist nicht der Konstruktor, oder seinen Rückgabewert übergeben
push_back
. C++ verwendet den Konstruktor zu erstellen, ein namenloses temporäres Objekt, das existiert nur für die Dauer der der Aufruf der Funktion; in der Regel auf den Stapel. Diese wird dann anpush_back
, undpush_back
kopiert dessen Inhalt in deiner vector.Dies ist legal, denn
push_back
nimmt es das argument von const-Referenz, und erstellt dann eine Kopie des Objekts. Der Aufruf der Konstruktor erstellt ein temporäres Objekt, das ist ein rvalue. Eine const-Referenz kann binden ein rvalue. Die Methode kann das Objekt ändern, es ist passiert, aber es kann eine Kopie erstellen.Obwohl es sieht aus wie ein Funktionsaufruf, Ausdruck Element(img,i) ist eigentlich die Schaffung von einem temporären Objekt. Der Unterschied ist, dass in der runtime-Speicher für das Objekt reserviert auf dem stack, und dann der Konstruktor aufgerufen wird, in der Erwägung, dass, wenn dies eine normale Funktion aufrufen, kein Speicher zugeordnet werden würde.