C ++ / CLIでのキャレット( '^')の意味は?


212

私はこのコードに出くわしました、そしていくつかのGoogle検索はこの不思議な(私にとって)構文の説明を何も表示しません。

Hashtable^ tempHash = gcnew Hashtable(iterators_);

IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator();

キャレットとは一体どういう意味ですか?(これgcnewも私にとって新しいものであり、ここでそれについて尋ねました。)


6
ちなみに「帽子」発音します。
kmote 2015年

回答:


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
マネージヒープで宣言された実際の変数の前にあるマネージポインター(^)ではなく、アンマネージポインターシンボル(*)の使用が突然許可されて混乱します。
swcraft 2016

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


2

これは、管理対象オブジェクトへの参照であることを意味します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.