เครื่องหมายรูปหมวก ('^') หมายถึงอะไรใน C ++ / CLI


212

ฉันเพิ่งเจอรหัสนี้และการค้นหาของ Google สองสามครั้งไม่ปรากฏคำอธิบายของไวยากรณ์ลึกลับ (สำหรับฉัน) นี้

Hashtable^ tempHash = gcnew Hashtable(iterators_);

IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator();

เครื่องหมายรูปหมวกหมายถึงอะไร (นี่gcnewเป็นของใหม่สำหรับฉันและฉันถามเกี่ยวกับที่นี่ )


6
โดยวิธีการที่มันเป็นเด่นชัด "หมวก"
kmote

คำตอบ:


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

โดยทั่วไปแล้วเครื่องหมายวรรคตอน%จะ^เป็นเครื่องหมายวรรคตอน&*คือการ ใน C ++ ตัวดำเนิน&การunary อยู่ใน C ++ / CLI ตัวดำเนิน%การunary

ในขณะที่&ptrอัตราผลตอบแทนP*, อัตราผลตอบแทนที่%mngdMO^


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

แก้ไขลิงก์ไปยังสำเนา archive.org สุจริตลิงค์ MSDN มีความเปราะบางดังนั้นการเชื่อมโยง MSDN ใหม่ทั้งหมดควรจะเรียกใช้ผ่าน archive.org ตั้งแต่เริ่มต้น
Anssssss


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.