Operator odwołania śledzenia (C++ Component Extensions)
Odwołanie śledzenia (%) zachowuje się jak zwykłe odniesienie C++ (&) z tym, że gdy obiekt jest przypisany do odwołania śledzenia, zwiększany jest licznik odwołań obiektu.
Wszystkie platformy
Odwołanie śledzenia ma następujące cechy.
Przypisanie obiektu do odwołania śledzenia powoduje, że licznik odwołań obiektu rośnie.
Odwołanie natywne (&) jest wynikiem, gdy użytkownik cofnie odwołanie *.Odwołanie śledzenia (%) jest wynikiem, gdy użytkownik cofnie odwołanie ^.Jedyną różnicą między & i % jest to, że gdy & jest odwołaniem „raw”, % jest zliczanym odwołaniem odniesienia.Tak długo, jak długo mają % do obiektu, obiekt pozostanie w pamięci.
Kropka jest używana jako operator dostępu do elementu członkowskiego (.) w celu uzyskania dostępu do członka obiektu.
Odwołanie śledzenia może być deklarowane tylko na stosie.Odwołanie śledzenia nie może należeć do klasy.
Śledzenie odwołań jest prawidłowe dla typów wartości i uchwytów (na przykład String^).
Odwołaniu śledzenia nie można przypisać wartości null ani wartości nullptr.Odwołanie śledzenia może zostać ponownie przypisane do innego prawidłowego obiektu dowolną liczbę razy.
Odwołania śledzenia nie można użyć jako operatora jednoargumentowego pobierania adresu.
Środowisko wykonawcze systemu Windows
Odwołanie śledzenia zachowuje się jak odwołanie zliczane odniesienia standardowego języka C++.Aby uzyskać więcej informacji na temat odwołań w języku C++, zobacz Odwołania (C++).
Poniższy przykład pokazuje, jak używać śledzenia odwołania do modyfikowania zawartości obiektu, na który wskazuje.
/ZW
using namespace Platform;
int main()
{
array<String^> ^arr = ref new array<String^>(10);
int i = 0;
for(int i = 0; i < 10; ++i){
String^& s = arr[i];
s = i++.ToString(); // changes the array content
}
}
Środowisko uruchomieniowe języka wspólnego
Można użyć odwołania śledzenia do uchwytu, gdy powiąże się obiekt typu CLR na stosie modułu odśmiecania pamięci.
W CL, wartość zmienna odniesienia śledzenia jest aktualizowana automatycznie, gdy moduł odśmiecania pamięci przenosi obiekt, do którego istnieje odwołanie.
Nie jest możliwe macierzyste odwołanie C++ do obiektu na stercie modułu odśmiecania pamięci.
Aby uzyskać więcej informacji dotyczących śledzenia odwołań w języku C++/CLI, zobacz:
Porady: korzystanie z odwołań śledzenia w języku C++/interfejsie wiersza polecenia
Porady: korzystanie z odwołań śledzenia i wskaźników wewnętrznych
Przykłady
Przykład
W poniższym przykładzie przedstawiono sposób użycia śledzenia odwołania z typami macierzystym i zarządzanym.
// tracking_reference_1.cpp
// compile with: /clr
ref class MyClass {
public:
int i;
};
value struct MyStruct {
int k;
};
int main() {
MyClass ^ x = ref new MyClass;
MyClass ^% y = x; // tracking reference handle to reference object
int %ti = x->i; // tracking reference to member of reference type
int j = 0;
int %tj = j; // tracking reference to object on the stack
int * pi = new int[2];
int % ti2 = pi[0]; // tracking reference to object on native heap
int *% tpi = pi; // tracking reference to native pointer
MyStruct ^ x2 = ref new MyStruct;
MyStruct ^% y2 = x2; // tracking reference to value object
MyStruct z;
int %tk = z.k; // tracking reference to member of value type
delete[] pi;
}
Przykład
Poniższy przykład pokazuje, jak powiązać śledzenie odwołania z tablicą.
// tracking_reference_2.cpp
// compile with: /clr
using namespace System;
int main() {
array<int> ^ a = ref new array< Int32 >(5);
a[0] = 21;
Console::WriteLine(a[0]);
array<int> ^% arr = a;
arr[0] = 222;
Console::WriteLine(a[0]);
}
Dane wyjściowe