Semantyka języka C++ stosu dla typu odwołania
Visual C++ 2005 r. wystąpienie typu odwołania można tworzyć tylko za pomocą new operator, która utworzyła obiekt na śmieci zebrane sterty.Jednakże można teraz utworzyć wystąpienia typu odwołania, przy użyciu tej samej składni, którego mogłaby użyć, aby utworzyć wystąpienie typu macierzystego na stosie.Tak, nie trzeba używać ref new, gcnew (C++ Component Extensions) do utworzenia obiektu typu odwołania.A gdy obiekt wykracza poza zakres, kompilator wywołania destruktora tego obiektu.
Uwagi
Podczas tworzenia wystąpienia typu odwołanie za pomocą semantykę stosu, kompilator wewnętrznie utworzyć instancję na stercie zebrane śmieci (za pomocą gcnew).
Gdy typ podpisu lub return funkcji zawiera wystąpienie typu przez wartość odwołania, funkcja zostaną oznaczone w metadanych jako wymagające specjalnej obsługi (z modreq).Ta obsługa specjalna jest obecnie 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 semantykę będzie, jeśli typ ma nie destruktor.Ponadto utworzone z semantyką stosu w sygnatury funkcji typów odwołań nie byłoby to możliwe, jeśli chcesz, aby Twoje funkcje ma zostać zużyta w językach innych niż Visual C++.
Kompilator nie powodowała Konstruktor kopiujący dla typu odwołania.W związku z tym jeśli została zdefiniowana funkcja, która używa typu przez wartość odwołania 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 powodowała operator przypisania domyślnej dla typu odwołania.Operator przypisania pozwala na tworzenie obiektu przy użyciu semantykę stosu i go zainicjować z istniejącego obiektu utworzone przy użyciu semantykę stosu.Operator przypisania dla typu odwołania ma podpis następującą postać: void operator=( R% ){}.
Jeśli typ swojego destruktora zwalnia zasoby krytycznych i używasz semantykę stosu dla typu odwołania, nie trzeba jawnie wywołać destruktor (lub zadzwoń delete).Aby uzyskać więcej informacji na temat destruktory 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, które zostaną elementy członkowskie, którego typem jest uchwytem do typu odwołania skrócona skopiowane (traktowane jak każdy inny składnik Niestatyczne pola, którego typ jest wskaźnik).
Każdy Członek niestatyczny danych, którego typem jest typ wartości będzie obowiązywać płytkie skopiowane.
Każdy Członek niestatyczny danych, którego typem jest wystąpienie typu odwołanie będzie wywoływał wywołanie Konstruktor kopiujący typ odwołania.
Kompilator zapewnia także % operator jednoargumentowy przerobić wystąpienie typu Odwołanie utworzonych przy użyciu semantykę stosu do jego typ podstawowy uchwyt.
Następujące typy odwołań nie są dostępne do użytku z semantyką stosu:
Przykład
Opis
Poniższy przykład kodu pokazuje, jak zadeklarować wystąpień typów odwołań z semantyką stosu, jak operator przypisania i kopiowania Konstruktor działa i jak zainicjować odwołanie śledzenia z utworzonych przy użyciu stosu Semantyka typu odwołania.
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