Udostępnij za pośrednictwem


Semantyka stosu języka C++ dla typów odwołań

Przed Visual C++ 2005, wystąpienie typu odwołania można tylko tworzone za pomocą new operator, która utworzyła obiekt na śmieci zebrane sterty.Teraz można jednak utworzyć wystąpienie typu odwołania przy użyciu tej samej składni, która umożliwia utworzenie wystąpienia typu macierzystego na stosie.Tak, nie trzeba używać gcnew do utworzenia obiektu typu odwołania.A gdy obiekt wykracza poza zakresem, kompilator wywołuje destruktor obiektu.

Uwagi

Podczas tworzenia wystąpienia typu odwołania za pomocą semantyka stosu, kompilator wewnętrznie utworzyć instancję na stercie zebrane śmieci (za pomocą gcnew).

Gdy typ podpisu lub return funkcji zawiera wystąpienie typu odwołania przez wartość, funkcja zostaną oznaczone w metadanych jako wymagające specjalnego traktowania (z modreq).To jest specjalnych aktualnie dostarczane tylko przez klientów Visual C++; inne języki aktualnie nie obsługują zużywające funkcje lub dane, które używane typy odwołań utworzone z semantyką stosu.

Jeden powód, aby użyć gcnew (dynamicznego przydzielania) zamiast stosu semantyka będzie, jeśli typ ma nie destruktora.Ponadto utworzone z semantyką stosu w podpisach funkcja typów odwołań nie byłoby możliwe, jeśli chcesz, aby Twoje funkcje ma zostać zużyta w językach innych niż Visual C++.

Kompilator nie wygeneruje Konstruktor kopiujący dla typu odwołania.W związku z tym jeśli została zdefiniowana funkcja, która używa typu odwołania przez wartość w podpisie, należy zdefiniować Konstruktor kopiujący dla typu odwołania.Konstruktor kopiujący dla typu odwołania ma podpis następującą postać: R(R%){}.

Kompilator nie wygeneruje operator przydział domyślny dla typu odwołania.Operator przypisania pozwala na tworzenie obiektu za pomocą semantyka stosu i go zainicjować z istniejący obiekt utworzony za pomocą semantyka stosu.Operator przypisania dla typu odwołania ma podpis następującą postać: void operator=( R% ){}.

Jeśli Twój typ destruktora zwalnia zasoby krytycznych i używać semantyka stosu dla typu odwołania, nie trzeba jawnie wywołać destruktor (lub zadzwoń delete).Aby uzyskać więcej informacji na temat destruktorów w typach odwołań, zobacz Destruktory i finalizatory w języku Visual C++.

Operator przypisania generowanych przez kompilator będzie postępuj zgodnie ze zwykłymi regułami C++ standard z następujących dodatków:

  • Wszelkie dane niestatyczny członków, których typ jest dojście do typu odwołania będzie skrócona skopiowane (traktowany jak członek danych statycznych, którego typem jest wskaźnik).

  • Każdy Członek niestatyczny dane, którego typem jest typ wartości będą płytkie kopiowane.

  • Każdy Członek niestatyczny danych, którego typem jest wystąpieniem typu odwołania będzie wywoływał wywołanie konstruktora Kopiuj typ odwołania.

Zapewnia również kompilator % operator jednoargumentowy przekonwertować wystąpienia typu Odwołanie utworzonych przy użyciu semantyka stosu do jego podstawowym typem uchwytu.

Następujące typy odwołań nie są dostępne do użytku z semantyką stosu:

Przykład

Opis

Poniższy przykład kodu ilustruje sposób deklarowania wystąpień typów odwołań z semantyką stosu, sposób, w jaki operator przypisania i kopiowania Konstruktor działa i jak zainicjować odwołanie śledzenia typu Odwołanie utworzonych przy użyciu semantyka stosu.

Kod

// 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);
}

Dane wyjściowe

98
98
98
13
13

Zobacz też

Informacje

Klasy i strukturach (zarządzanych)