O que significa o sinal de intercalação ('^') em C ++ / CLI?

212

Acabei de encontrar esse código e algumas pesquisas no Google não explicam essa misteriosa sintaxe (para mim).

Hashtable^ tempHash = gcnew Hashtable(iterators_);

IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator();

O que diabos significa o sinal de intercalação? ( gcnewIsso também é novo para mim, e eu perguntei sobre isso aqui .)

Owen
fonte
6
A propósito, é pronunciado "chapéu" .
kmote

Respostas:

176

Isso é C ++ / CLI e o cursor é o equivalente gerenciado de um * (ponteiro) que na terminologia C ++ / CLI é chamado de 'identificador' para um 'tipo de referência' (já que você ainda pode ter ponteiros não gerenciados).

(Obrigado a Aardvark por apontar a melhor terminologia.)

Rob Walker
fonte
5
A sintaxe (suponho "referência não gerenciada") "&" ainda existe no C ++ / CLI?
Owen
C ++ / CLI é uma extensão do C ++ normal, então sim - é apenas para referências não gerenciados embora
1800 INFORMATION
77
// 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

Em geral, o pontuador %é ^como o pontuador &é *. Em C ++, o &operador unário está em C ++ / CLI, o %operador unário .

Enquanto &ptrproduz a P*, %mngdproduz em MO^.

Salomão
fonte
1
Eu preferiria dizer por que não ^ mngd em vez de * mngd .. De repente, é confuso usar o símbolo de ponteiro não gerenciado (*), não o ponteiro gerenciado (^) na frente da variável realmente declarada no heap gerenciado.
swcraft
20

Isso significa que essa é uma referência a um objeto gerenciado versus um ponteiro C ++ comum. Os objetos por trás dessas referências são gerenciados pelo tempo de execução e podem ser realocados na memória. Eles também são coletados automaticamente.

Franci Penov
fonte
17

Quando você aloca memória gerenciada, essa memória pode ser movida pelo coletor de lixo. O operador ^ é um ponteiro para a memória gerenciada, que continua apontando para o local correto, mesmo que o coletor de lixo mova o objeto para o qual aponta.

Joel Coehoorn
fonte
3

Em C ++ / CLI, significa um ponteiro gerenciado. Você pode ler mais sobre isso (e outros recursos C ++ / CLI) aqui:

http://en.wikipedia.org/wiki/C%2B%2B/CLI

Mark Ingram
fonte
2

Isso significa que é uma referência a um objeto gerenciado.

1800 INFORMAÇÃO
fonte