Compartilhar via


Operador de Referência de Acompanhamento (Extensões de Componentes C++)

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

Todas as Plataformas

Uma referência de rastreamento tem as seguintes características.

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

  • Uma referência nativa (&) é o resultado quando você remove a referência de um *. Uma referência de rastreamento (%) é o resultado quando você remove a referência de um ^. A única diferença entre & e % é que onde & é uma referência “bruta”, % é uma referência contada por referência. Enquanto você tiver uma % de um objeto, o objeto ficará ativo na memória.

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

  • Uma referência de rastreamento pode ser declarada somente na pilha. Uma referência de rastreamento não pode ser membro de uma classe.

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

  • Uma referência de rastreamento não pode ser atribuída a um valor de zero ou nullptr. Uma referência de rastreamento pode ser reatribuída a outro objeto válido quantas vezes forem necessárias.

  • Uma referência de rastreamento não pode ser usada como um operador unário de tomada de endereço.

Tempo de Execução do Windows

Uma referência de rastreamento se comporta como uma referência padrão do C++ contada por referência. Para obter informações sobre as referências do C++, consulte Referências (C++).

O exemplo a seguir mostra como usar uma referência de rastreamento para modificar o conteúdo do objeto para o qual aponta.

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

Common Language Runtime

Você pode usar uma referência de rastreamento para um identificador ao associar a um objeto de um tipo de CLR na heap do lixo coletado.

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

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

Para obter mais informações sobre as referências de rastreamento no C++/CLI, consulte:

Exemplos

Exemplo

O exemplo a seguir mostra como usar uma referência de rastreamento 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;
}

Exemplo

O exemplo a seguir mostra como associar uma referência de rastreamento 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]);
}

Saída