2008-10-14 12 views
158

Acabo de encontrar este código y algunas búsquedas de Google no dan ninguna explicación de esta sintaxis misteriosa (para mí).¿Qué significa el símbolo de intercalación ('^') en C++/CLI?

Hashtable^ tempHash = gcnew Hashtable(iterators_); 

IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator(); 

¿Qué significa "caret"? (El gcnew también es nuevo para mí, y pregunté acerca de eso here.)

+3

Por cierto, es [pronunciado "hat"] (https://msdn.microsoft.com/en-us/library/yk97tc08 (v = vs.120) .aspx). – kmote

Respuesta

134

Esto es C++/CLI y el símbolo de intercalación es el equivalente administrado de un * (puntero) que en la terminología C++/CLI se llama 'handle' a un 'tipo de referencia' (ya que aún puede tener punteros no administrados).

(Gracias a Aardvark por señalar la terminología mejor.)

+6

Lo he visto que también tiene un "mango". – Aardvark

+4

¿La sintaxis (supongo "referencia no gestionada") "&" todavía existe en C++/CLI? – Owen

+0

C++/CLI es una extensión de C++ regular, por lo que sí, es solo para referencias no administradas aunque –

2

Significa que es una referencia a un objeto administrado.

18

significa que esta es una referencia a un objeto administrado frente a un C++ regular de puntero. Los objetos detrás de tales referencias son gestionados por el tiempo de ejecución y pueden ser reubicados en la memoria. También se recogen basura automáticamente.

15

Una vez asignado memoria administrada, que la memoria se puede mover alrededor por el recolector de basura. El operador^es un puntero para la memoria administrada, que continúa apuntando al lugar correcto incluso si el recolector de elementos no utilizados mueve el objeto al que apunta.

59
// here normal pointer 
P* ptr = new P; // usual pointer allocated on heap 
P& nat = *ptr; // object on heap bind to native object 

//.. here CLI managed 
MO^ mngd = gcnew MO; // allocate on CLI heap 
MO% rr = *mngd; // object on CLI heap reference to gc-lvalue 

En general, la Punctuator % es ^ como el Punctuator & es *. En C++, el operador único & está en C++/CLI el operador único %.

Mientras &ptr produce P*, %mngd cede en MO^.

+0

según lo que dices, tu última línea debería ser% mngd en lugar de * mngd, ¿no? – Geoffroy

+2

@Geoffroy: el operador '%' se llama [Referencia de seguimiento] (https://msdn.microsoft.com/en-us/library/8903062a.aspx) y la respuesta de Salomon es correcta tal como está. – kmote

+0

Prefiero decir por qué no^mngd en lugar de * mngd .. De repente, es confuso permitir el uso del símbolo del puntero no administrado (*), no el puntero administrado (^) frente a la variable declarada en el montón administrado. –

Cuestiones relacionadas