Übergabe eines C-Objekts an seinen eigenen Konstruktor: Ist das legal?
Es mag überraschend erscheinen, herauszufinden, dass das Konstruieren eines Objekts aus sich selbst in C ist tatsächlich zulässig. Der folgende Code demonstriert dieses unerwartete Verhalten:
#include <iostream> struct Foo { Foo(Foo& bar) { std::cout << &bar << std::endl; } }; int main(int argc, char** argv) { Foo foo(foo); // This works! std::cout << &foo << std::endl; // And this works too... }
In diesem Code wird ein Objekt vom Typ Foo als Argument an seinen eigenen Konstruktor übergeben. Dies scheint eine zirkuläre Definition zu sein, aber die C-Standards erlauben dies tatsächlich.
Obwohl das Objekt foo nicht initialisiert ist, manipuliert der Code es auf eine vom Standard zugelassene Weise. Insbesondere ist es erlaubt, einen Verweis darauf zu binden oder seine Adresse zu übernehmen, bevor ein Objekt vollständig initialisiert ist.
Dieses Verhalten wird im Fehlerbericht 363 näher erläutert, der zu dem Schluss kommt, dass Verweise gültig und zulässig sind Ermitteln Sie die Adresse eines Klassenobjekts, bevor es vollständig initialisiert ist, und stellen Sie es als Referenzparameter bereit.
Obwohl es ungewöhnlich oder unpraktisch sein kann, dieses Verhalten zu nutzen, bietet es Einblicke in das Innenleben von Klassen und die begrenzten Möglichkeiten, wie ein nicht initialisiertes Objekt manipuliert werden kann.
Das obige ist der detaillierte Inhalt vonKönnen Sie ein C-Objekt konstruieren, indem Sie sich selbst als Argument verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!