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:
Como: passar tipos CLR por referência com rastreamento de referências
Como: usar referências de rastreamento e ponteiros interiores
Como: escrever funções de modelo que usem nativas, valor ou parâmetros de referência
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