Operátor popisovače objektu (^) (rozšíření komponent C++)
Zpracování declarator (^, vyslovováno "hat"), změní typ specifikátor znamená, že objekt deklarované by automaticky odstraněna systém určí, že objekt již není přístupný.
Přístup k objektu deklarovaného
Proměnná, která je deklarována s declarator táhlo se chová jako ukazatel na objekt.Proměnná odkazuje na celý objekt nemůže odkazovat na člen objektu a nepodporuje aritmetický ukazatel.Operátor nepřímé odkazování (*) přístup k objektu a operátor přístupu členských šipku (->) člen objektu přístup.
Windows Runtime
Kompilátor používá COM počítání odkazů mechanismus k určení, pokud se již používá objekt a mohou být odstraněny.To je možné, protože objekt, který je odvozen z Windows Runtime rozhraní je ve skutečnosti objekt COM.Počet odkazů je zvýšen, pokud objekt je vytvořený nebo zkopírované a snížena objektu nastavena na hodnotu null nebo přejde mimo rozsah.Pokud počet odkazů odkazuje na nulu, objekt je automaticky a okamžitě odstraněny.
Výhodou declarator popisovač je v modelu COM musí výslovně spravují počet odkazů pro objekt, který je únavné a chyba náchylné.Zvýšit a snížit počet odkazů, musí volat metody objektu AddRef() a Release().Pokud deklarujete s declarator táhlo objekt, generuje kompilátoru Visual C++ kódu, která automaticky upravuje počet odkazů.
Informace o vytvoření instance objektu nové ref.
Požadavky
Volba kompilátoru:/ZW
Common Language Runtime
Systém používá CLR paměti mechanismus k určení, pokud se již používá objekt a mohou být odstraněny.Společný jazykový modul runtime udržuje haldy, na které přiděluje objektů a použití spravovaných odkazy (proměnné) v programu označuje umístění objektů na haldy.Objekt již používá, paměť, která je obsazena na haldy uvolněno.Pravidelně garbage collector zkomprimuje haldy pro lepší využití uvolněné paměti.Komprimování haldy můžete přesunout objekty na haldy, který zruší platnost uvedená umístění spravované odkazy.Garbage collector však si je vědoma umístění spravované všechny odkazy a automaticky aktualizuje označující aktuální umístění objektů na haldy.
Protože ukazatele nativního C++ (*) a odkazy (&) nejsou spravované odkazy nesmyslné kolekcí nelze automaticky aktualizovat adresy odkazují.Chcete-li tento problém vyřešit pomocí declarator úchyt zadejte proměnnou, která si je vědoma garbage collector a můžete automaticky aktualizovat.
Visual C++ 2002 a Visual C++ 2003 __gc * byla použita ve spravovaných haldách deklarovat objektu.^ Nahradí __gc * novou syntaxi.
Další informace naleznete v tématu Jak: deklarovat typy nativních popisovačů.
Příklady
Příklad
Tento příklad ukazuje, jak vytvořit instanci typu odkazu ve spravovaných haldách.Tento příklad ukazuje také, že inicializovat úchytu jiným, výsledkem jsou dva odkazy na stejný objekt na spravované, shromážděné uvolnění paměti haldy.Všimněte si, že přiřazení nullptr (rozšíření komponent C++) k úchytu neoznačí objekt pro úklid.
// mcppv2_handle.cpp
// compile with: /clr
ref class MyClass {
public:
MyClass() : i(){}
int i;
void Test() {
i++;
System::Console::WriteLine(i);
}
};
int main() {
MyClass ^ p_MyClass = gcnew MyClass;
p_MyClass->Test();
MyClass ^ p_MyClass2;
p_MyClass2 = p_MyClass;
p_MyClass = nullptr;
p_MyClass2->Test();
}
Výsledek
Příklad
Následující příklad ukazuje, jak deklarovat popisovač objektu ve spravovaných haldách, kde typ objektu je typu hodnota krabici.Vzorek také ukazuje, jak získat typ hodnoty z objektu krabici.
// mcppv2_handle_2.cpp
// compile with: /clr
using namespace System;
void Test(Object^ o) {
Int32^ i = dynamic_cast<Int32^>(o);
if(i)
Console::WriteLine(i);
else
Console::WriteLine("Not a boxed int");
}
int main() {
String^ str = "test";
Test(str);
int n = 100;
Test(n);
}
Výsledek
Příklad
Tento příklad ukazuje společné idiomu C++ přejděte na libovolný objekt pomocí ukazatele void * nahrazuje objekt ^, který pojme popisovač referenční třídy.Také ukazuje, že všechny typy jako matice a delegáty, můžete převést na popisovač objektu.
// mcppv2_handle_3.cpp
// compile with: /clr
using namespace System;
using namespace System::Collections;
public delegate void MyDel();
ref class MyClass {
public:
void Test() {}
};
void Test(Object ^ x) {
Console::WriteLine("Type is {0}", x->GetType());
}
int main() {
// handle to Object can hold any ref type
Object ^ h_MyClass = gcnew MyClass;
ArrayList ^ arr = gcnew ArrayList();
arr->Add(gcnew MyClass);
h_MyClass = dynamic_cast<MyClass ^>(arr[0]);
Test(arr);
Int32 ^ bi = 1;
Test(bi);
MyClass ^ h_MyClass2 = gcnew MyClass;
MyDel^ DelInst = gcnew MyDel(h_MyClass2, &MyClass::Test);
Test(DelInst);
}
Výsledek
Příklad
Tento příklad ukazuje, že lze přímo odkázat popisovač a člen je přístupná prostřednictvím dereferenced táhlo.
// mcppv2_handle_4.cpp
// compile with: /clr
using namespace System;
value struct DataCollection {
private:
int Size;
array<String^>^ x;
public:
DataCollection(int i) : Size(i) {
x = gcnew array<String^>(Size);
for (int i = 0 ; i < Size ; i++)
x[i] = i.ToString();
}
void f(int Item) {
if (Item >= Size)
{
System::Console::WriteLine("Cannot access array element {0}, size is {1}", Item, Size);
return;
}
else
System::Console::WriteLine("Array value: {0}", x[Item]);
}
};
void f(DataCollection y, int Item) {
y.f(Item);
}
int main() {
DataCollection ^ a = gcnew DataCollection(10);
f(*a, 7); // dereference a handle, return handle's object
(*a).f(11); // access member via dereferenced handle
}
Výsledek
Příklad
Tento příklad ukazuje, že nativní odkaz (&) nelze vytvořit vazbu int člen spravované typu jako int mohou být uloženy shromážděné haldy odpadků a nativní odkazy nejsou sledovat pohyb objektu ve spravovaných haldách.Oprava je použít místní proměnné nebo změnit & na %, odkazu jeho sledování.
// mcppv2_handle_5.cpp
// compile with: /clr
ref struct A {
void Test(unsigned int &){}
void Test2(unsigned int %){}
unsigned int i;
};
int main() {
A a;
a.i = 9;
a.Test(a.i); // C2664
a.Test2(a.i); // OK
unsigned int j = 0;
a.Test(j); // OK
}
Požadavky
Volba kompilátoru:/clr
Viz také
Referenční dokumentace
Operátor sledovacího odkazu (rozšíření komponent C++)