C++-Stapel-Semantik für Verweistypen

Vor Visual C++ 2005 kann eine Instanz eines Referenztyps mithilfe des Operators new nur erstellt werden, der das - Objekt auf dem Heap der Garbage Collection unterliegt erstellt hat.Sie können eine Instanz eines Referenztyps mithilfe der gleichen Syntax jetzt erstellen, die Sie verwenden können, um eine Instanz eines systemeigenen Typs auf dem Stapel zu erstellen.Daher müssen Sie nicht, um gcnew zu verwenden, um ein - Objekt aus einem Referenztyp zu erstellen.Und wenn das Objekt den Gültigkeitsbereich verlässt, ruft der Compiler den Destruktor des Objekts auf.

Hinweise

Wenn Sie eine Instanz eines Referenztyps mithilfe der Stapelsemantik erstellen, erstellt der Compiler intern die Instanz auf dem Heap der Garbage Collection unterliegt (mithilfe gcnew).

Wenn die Signatur oder den Rückgabetyp einer Funktion eine Instanz eines Referenztyps nach Wert enthält, wird die Funktion in den Metadaten als erfordert die spezielle Behandlung gekennzeichnet (mit modreq).Diese besondere Behandlung wird derzeit nur von Visual C++-Clients bereitgestellt; andere Sprachen nicht nur unterstützen das Konsumieren von Funktionen oder Daten, die die Verweistypen verwenden, die mit Stapelsemantik erstellt werden.

Ein Grund, gcnew (dynamische Speicherbelegung) anstelle der Stapelsemantik zu verwenden würde sein, wenn der Typ keinen Destruktor enthält.Unter Verwendung der Referenztypen, die mit Stapelsemantik in den Funktionssignaturen erstellt wurden, sind nicht möglich, wenn Sie die Funktionen von anderen Sprachen als Visual C++ verwendet werden soll.

Der Compiler generiert keinen Kopierkonstruktor für einen Referenztyp.Wenn Sie eine Funktion definieren, die einen Verweistyp nach Wert in der Signatur verwendet, müssen Sie einen Kopierkonstruktor für den Referenztyp definieren.Ein Kopierkonstruktor für einen Referenztyp verfügt über eine Signatur der folgenden Form: R(R%){}.

Der Compiler generiert keinen Standard Zuweisungsoperator für einen Referenztyp.Ein Zuweisungsoperator ermöglicht es Ihnen, ein Objekt mit der Stapelsemantik zu erstellen und es mit einem vorhandenen - Objekt initialisiert, das mithilfe der Stapelsemantik erstellt wird.Ein Zuweisungsoperator für einen Referenztyp verfügt über eine Signatur der folgenden Form: void operator=( R% ){}.

Wenn der Destruktor des Typs wichtige Ressourcen und Sie Verwendungsstapelsemantik für Verweistypen ungebunden, müssen Sie nicht, um den Destruktor explizit aufzurufen (oder delete aufrufen).Weitere Informationen zu Destruktoren in den Verweistypen, finden Sie unter Destruktoren und Finalizer in Visual C++.

Ein vom Compiler generierter Zuweisungsoperator folgt den üblichen Standard-C++-Regeln mit den folgenden Hinzufügungen:

  • Alle nicht statischen Datenmembern, deren Typ ein Handle für ein Verweistyp ist, sind kopiert zurück (behandelt wie ein nicht statischer Datenmember, dessen Typ ein Zeiger ist).

  • Jeder nicht statische Datenmember, dessen Typ ein Werttyp ist, ist kopiert zurück.

  • Jeder nicht statische Datenmember, dessen Typ eine Instanz eines Verweistyps ist, ruft einen Aufruf an den Kopierkonstruktor des Referenztyps auf.

Der Compiler stellt auch einen % unären Operator, um eine Instanz eines Referenztyps zu konvertieren, der mithilfe der Stapelsemantik zu seinem zugrunde liegenden Handletyp erstellt wird.

Die folgenden Verweistypen sind nicht zur Verwendung mit Stapelsemantik verfügbar:

Beispiel

ms177191.collapse_all(de-de,VS.110).gifBeschreibung

Im folgenden Codebeispiel wird gezeigt, wie Instanzen von Verweistypen mit Stapelsemantik, wie die Zuweisungsoperator- und Kopierkonstruktorarbeiten deklariert und wie einen Nachverfolgungsverweis mit den Referenztyp initialisiert, der mithilfe der Stapelsemantik erstellt wird.

ms177191.collapse_all(de-de,VS.110).gifCode

// stack_semantics_for_reference_types.cpp
// compile with: /clr
ref class R {
public:
   int i;
   R(){}

   // assignment operator
   void operator=(R% r) {
      i = r.i;
   }

   // copy constructor
   R(R% r) : i(r.i) {}
};

void Test(R r) {}   // requires copy constructor

int main() {
   R r1;
   r1.i = 98;

   R r2(r1);   // requires copy constructor
   System::Console::WriteLine(r1.i);
   System::Console::WriteLine(r2.i);

   // use % unary operator to convert instance using stack semantics
   // to its underlying handle
   R ^ r3 = %r1;
   System::Console::WriteLine(r3->i);

   Test(r1);

   R r4;
   R r5;
   r5.i = 13;
   r4 = r5;   // requires a user-defined assignment operator
   System::Console::WriteLine(r4.i);

   // initialize tracking reference
   R % r6 = r4;
   System::Console::WriteLine(r6.i);
}

ms177191.collapse_all(de-de,VS.110).gifAusgabe

98
98
98
13
13

Siehe auch

Referenz

Classes and Structs (Managed)