Operador de referência de acompanhamento (C++/CLI e C++/CX)

Uma referência de acompanhamento (%) se comporta como uma referência comum de C++ (&), exceto pelo fato de que quando um objeto é atribuído a uma referência de acompanhamento, a contagem de referências do objeto é incrementada.

Todas as plataformas

Uma referência de acompanhamento possui as características a seguir.

  • A atribuição de um objeto a uma referência de acompanhamento faz com que a contagem de referências do objeto seja incrementada.

  • Uma referência nativa (&) é o resultado quando você desfaz uma referência a um *. Uma referência de acompanhamento (%) é o resultado quando você desfaz uma referência a um ^. Contanto que você tenha um % para um objeto, o objeto permanecerá vivo na memória.

  • O operador de acesso de membro dot (.) é usado para acessar um membro do objeto.

  • As referências de acompanhamento são válidas para tipos de valores e identificadores (por exemplo, String^).

  • Uma referência de acompanhamento não pode receber um valor null ou nullptr. Uma referência de acompanhamento pode ser reatribuída a outro objeto válido quantas vezes for necessário.

  • Uma referência de acompanhamento não pode ser usada como um operador take-address unário.

Windows Runtime

Uma referência de acompanhamento se comporta como uma referência padrão do C++, exceto pelo fato de que um % é contado por referência. O snippet a seguir mostra como converter entre os tipos % e ^:

Foo^ spFoo = ref new Foo();
Foo% srFoo = *spFoo;
Foo^ spFoo2 = %srFoo;

O exemplo a seguir mostra como passar um ^ para uma função que recebe um %.

ref class Foo sealed {};

    // internal or private
    void UseFooHelper(Foo% f)
    {
        auto x = %f;
    }

    // public method on ABI boundary
    void UseFoo(Foo^ f)
    {
        if (f != nullptr) { UseFooHelper(*f); }
    }

Common Language Runtime

No C++ ou na CLI, é possível usar uma referência de acompanhamento para um identificador ao vincular-se a um objeto de um tipo CLR no heap coletado como lixo.

No CLR, o valor de uma variável de referência de acompanhamento é atualizado automaticamente sempre que o coletor de lixo move o objeto referenciado.

Uma referência de acompanhamento pode ser declarada apenas na pilha. Uma referência de acompanhamento não pode ser um membro de uma classe.

Não é possível ter uma referência de C++ nativa para um objeto no heap coletado como lixo.

Saiba mais sobre referências de acompanhamento no C++/CLI em:

Exemplos

O exemplo a seguir para C++/CLI mostra como usar uma referência de acompanhamento com tipos nativos e gerenciados.

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

O exemplo a seguir para C++/CLI mostra como vincular uma referência de acompanhamento a uma matriz.

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