Що означає карета ('^') у C ++ / CLI?


212

Щойно я натрапив на цей код, і кілька пошукових запитів Google не виявили пояснення цього таємничого (для мене) синтаксису.

Hashtable^ tempHash = gcnew Hashtable(iterators_);

IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator();

Що, до біса, означає каре? (Це gcnewтакож для мене нове, і я запитав про це тут .)


Відповіді:


176

Це C ++ / CLI, а карета - керований еквівалент * (покажчика), який у термінології C ++ / CLI називається "ручкою" до "опорного типу" (оскільки ви все ще можете мати некеровані покажчики).

(Дякую Aardvark за вказівку на кращу термінологію.)


5
Чи існує (я вважаю, "некерований посилання") синтаксис "&" все ще існує в C ++ / CLI?
Оуен

C ++ / CLI - це розширення звичайних C ++, тому так - це лише для некерованих посилань, хоча
1800 ІНФОРМАЦІЯ

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

Загалом, punctuator %є ^як punctuator &це *. У C ++ унарний &оператор знаходиться в C ++ / CLI, одинарний %оператор.

Хоча &ptrврожайність а P*, %mngdврожайність при MO^.


1
Я скоріше скажу, чому б не ^ mngd замість * mngd .. Це збиває зненацька дозволене використання некерованого символу вказівника (*), а не керованого вказівника (^) перед фактично змінною, оголошеною в керованій купі.
swcraft

20

Це означає, що це посилання на керований об'єкт проти звичайного вказівника C ++. Об'єкти, що стоять за такими посиланнями, керуються під час виконання та можуть бути переміщені в пам'яті. Вони також збираються сміття автоматично.


17

Коли ви виділили керовану пам'ять, цю пам’ять можна переміщувати сміттєзбірником. Оператор ^ - це покажчик керованої пам’яті, який продовжує вказувати на потрібне місце, навіть якщо сміттєзбірник переміщує об’єкт, на який він вказує.


4

З MSDN, схоже, що каре означає, що ви отримуєте ручку до створюваного типу.

https://web.archive.org/web/20150117095313/http://msdn.microsoft.com/en-us/library/te3ecsc8%28VS.80%29.aspx


мертве посилання (2018)
gbarry

виправлено посилання на copy.org. Чесно кажучи, посилання MSDN настільки крихкі, що всі нові посилання MSDN повинні бути запущені через archive.org з самого початку.
Anssssss


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.