2008-10-14 93 views
158

Tôi vừa xem qua mã này và một vài tìm kiếm của Google không bật ra lời giải thích nào về cú pháp bí ẩn này (với tôi).Dấu mũ (‘^’) có nghĩa là gì trong C++/CLI?

Hashtable^ tempHash = gcnew Hashtable(iterators_); 

IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator(); 

Dấu mũ có nghĩa là gì? (Số gcnew cũng mới đối với tôi và tôi đã hỏi về điều đó here.)

+3

Nhân tiện, nó được [phát âm là "mũ"] (https://msdn.microsoft.com/en-us/library/yk97tc08 (v = vs.120) .aspx). – kmote

Trả lời

134

Đây là C++/CLI và dấu mũ là tương đương được quản lý của * (con trỏ) trong thuật ngữ C++/CLI được gọi là 'handle' thành 'loại tham chiếu' (vì bạn vẫn có thể có con trỏ không được quản lý).

(Nhờ Aardvark để chỉ ra các thuật ngữ tốt hơn.)

+6

Tôi đã nhìn thấy nó cũng được gọi là "xử lý". – Aardvark

+4

Cú pháp (giả sử "không được quản lý") "&" vẫn tồn tại trong C++/CLI? – Owen

+0

C++/CLI là phần mở rộng của C++ thông thường, vì vậy có - nó chỉ dành cho các tài liệu tham khảo không được quản lý mặc dù –

2

Nó có nghĩa là nó là tham chiếu đến đối tượng được quản lý.

18

Nó có nghĩa rằng đây là một tham chiếu đến một đối tượng quản lý so với một C thường xuyên ++ con trỏ. Các đối tượng đằng sau các tham chiếu như vậy được quản lý bởi thời gian chạy và có thể được di chuyển trong bộ nhớ. Chúng cũng được thu gom rác tự động.

15

Khi bạn phân bổ bộ nhớ được quản lý, bộ nhớ có thể được di chuyển xung quanh bằng cách thu gom rác thải. Toán tử^là con trỏ cho bộ nhớ được quản lý, nó tiếp tục trỏ đến địa chỉ chính xác ngay cả khi bộ thu gom rác di chuyển đối tượng mà nó trỏ đến.

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 

Nhìn chung, punctuator %^ như punctuator &*. Trong C++, toán tử & đơn nhất nằm trong C++/CLI, toán tử un2 % đơn nhất.

Trong khi &ptr sản lượng là P*, %mngd sản lượng tại MO^.

+0

theo những gì bạn nói, dòng cuối cùng của bạn phải là% mngd thay vì * mngd thì không? – Geoffroy

+2

@Geoffroy: toán tử '%' được gọi là [Tham chiếu theo dõi] (https://msdn.microsoft.com/en-us/library/8903062a.aspx) và câu trả lời của salomon là chính xác khi nó đứng. – kmote

+0

Tôi thà nói lý do tại sao không^mngd thay vì * mngd .. Thật bất ngờ khi sử dụng biểu tượng con trỏ không được quản lý (*), không phải con trỏ được quản lý (^) trước biến thực sự được khai báo trong vùng quản lý. –

Các vấn đề liên quan