Heim >Backend-Entwicklung >C++ >Können Sie ein C-Objekt an seinen eigenen Konstruktor übergeben?

Können Sie ein C-Objekt an seinen eigenen Konstruktor übergeben?

Linda Hamilton
Linda HamiltonOriginal
2024-11-13 15:00:04229Durchsuche

Can You Pass a C   Object into Its Own Constructor?

Übergabe von C-Objekten an ihre eigenen Konstruktoren

In C mag es kontraintuitiv erscheinen, aber es ist tatsächlich legal, ein C-Objekt an seine eigenen Konstruktoren zu übergeben eigener Konstruktor. Betrachten Sie den folgenden Codeausschnitt:

#include <iostream>

struct Foo {
    Foo(Foo& bar) {
        std::cout << &bar << std::endl;
    }
};

int main(int argc, char** argv) {
    Foo foo(foo); // Surprising, yet valid
    std::cout << &foo << std::endl;
}

In diesem Beispiel übergeben wir die Adresse des konstruierten Foo-Objekts (&foo) an seinen eigenen Konstruktor. Dies mag einer zirkulären Definition ähneln, wird jedoch von den C-Standards nicht als undefiniertes Verhalten angesehen.

Erklärung

Der Standard ermöglicht es uns, zuvor nicht initialisierte Objekte auf begrenzte Weise zu verwenden ihre vollständige Initialisierung. Insbesondere ist die Bindung eines Hinweises darauf oder die Übernahme der Adresse zulässig. Dies ist im Fehlerbericht 363 und Abschnitt 3.8 des Entwurfs des C 14-Standards definiert.

Das bedeutet, dass wir im obigen Code keine durch die Sprache festgelegten Einschränkungen verletzen. Wir verwenden lediglich das nicht initialisierte foo-Objekt innerhalb des Konstruktors auf eine Weise, die dem Standard entspricht.

Clangs Warnung

Es ist jedoch erwähnenswert, dass einige Compiler wie Clang kann eine Warnung vor nicht initialisierten Variablen ausgeben. Dies liegt daran, dass die Erzeugung unbestimmter Werte aus nicht initialisierten automatischen Variablen im Allgemeinen als undefiniertes Verhalten gilt. In diesem Fall führen wir jedoch keine Unbestimmtheit ein, da wir nur eine Referenz binden und die Adresse innerhalb des Konstruktors übernehmen.

Einschränkungen

Es ist wichtig zu betonen dass dieses Verhalten zwar durch den Standard zulässig ist, aber nicht als bewährte Praxis angesehen werden sollte oder praktische Anwendungsfälle haben sollte. Die Hauptabsicht dieser Diskussion besteht darin, Licht auf einen weniger bekannten Aspekt der C-Sprachsemantik zu werfen.

Das obige ist der detaillierte Inhalt vonKönnen Sie ein C-Objekt an seinen eigenen Konstruktor übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn