Operador de referencia de seguimiento (Extensiones de componentes de C++)
Una referencia de seguimiento (%) se comporta como una referencia normal de C++ (&) excepto que cuando se asigna un objeto a una referencia de seguimiento, se incrementa el recuento de referencias del objeto.
Todas las plataformas
Una referencia de seguimiento tiene las siguientes características.
La asignación de un objeto a una referencia de seguimiento hace que el recuento de referencias del objeto que se incrementará.
Una referencia nativa (y) es el resultado cuando se desreferencia a *.Una referencia de seguimiento (%) es el resultado cuando se desreferencia un ^.La única diferencia entre y % es donde se referencia “sin formato”, % es una referencia referencia- contada.Siempre que tenga un % a un objeto, el objeto permanecerá activo en memoria.
Se utiliza el operador de acceso a miembros de punto (.) para tener acceso a un miembro del objeto.
Una referencia de seguimiento sólo se puede declarar en la pila.Una referencia de seguimiento no puede ser un miembro de una clase.
Siguiendo referencias es válido para los tipos de valor y los identificadores (por ejemplo String^).
Una referencia de seguimiento no se puede asignar una null o un valor nullptr .Una referencia de seguimiento puede reasignarse a otro objeto válido tantas veces como sea necesario.
Una referencia de seguimiento no se puede utilizar como un operador unario de la toma- dirección.
Windows en tiempo de ejecución
Una referencia de seguimiento se comporta como una referencia estándar referencia- contada de C++.Para obtener información sobre las referencias de C++, vea Referencias (C++).
El ejemplo siguiente se muestra cómo usar una referencia de seguimiento para modificar el contenido del objeto que elija.
/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
Puede utilizar una referencia de seguimiento a un identificador cuando se enlaza a un objeto de un tipo CLR en la pila basura- obtenida.
En CLR, el valor de una variable de referencia de traza se actualiza automáticamente siempre que el recolector de elementos no utilizados mueva el objeto de referencia.
No es posible tener una referencia de C++ nativo a un objeto en la pila basura- obtenida.
Para obtener más información acerca de las referencias de traza en C++/CLI, vea:
Cómo: Tipos CLR de paso por referencia con referencias de seguimiento
Cómo: Funciones de la escritura que ocupan natural, el valor, o parámetros de referencia
Ejemplos
Ejemplo
El ejemplo siguiente se muestra cómo usar una referencia de seguimiento con código nativo y los tipos administrados.
// 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;
}
Ejemplo
El ejemplo siguiente se muestra cómo enlazar una referencia de seguimiento en una 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]);
}
Output