Sdílet prostřednictvím


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čů.

yk97tc08.collapse_all(cs-cz,VS.110).gifPří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
}

yk97tc08.collapse_all(cs-cz,VS.110).gifPožadavky

Volba kompilátoru:/clr

Viz také

Referenční dokumentace

Operátor sledovacího odkazu (rozšíření komponent C++)

Koncepty

Součást rozšíření pro Runtime platformy