2

C++/CLI ハンドル(^) とその仕組みに興味があります。例:

私が理解できない最初のことは、ここで受け入れられた答えは、キャレットが * (ポインター) と同等の管理対象であると言っているということです。ただし、* とは異なり、^ に値を直接割り当てることができます。

int ^num;
num = 4;

これは C++ では機能しません。

int *num2;
num2 = new int[1];
num2 = 10;

この動作が観察されるのはなぜですか? また、Microsoft Webpageでは、オブジェクトのメンバーを指すことはできず、ポインター演算はサポートされていないと述べています。したがって、次のコード スニペットはどちらもコンパイルに失敗します。

int ^num3 = gcnew int[10];

for(int i = 0; i<10; i++)
    %(num3 + i) = i

また

for(int i = 0; i<10; i++)
    (num3 + i) = i

どうして???

それは私に最後の質問をもたらします: C++/CLI で次の int ネイティブ/通常の C++ コード スニペットに相当するものは何ですか?

int *array1;
array1 = new int[ 10];

for( int i = 0; i < 10; i++)
     *(array1 + i ) = i;
4

2 に答える 2

4

int^ボックス化された整数への参照を意味します。
通常の整数へのポインタではありません。

CLR の参照型へのハンドルは、ポインターと同等ではありません。似ています。

どちらもオブジェクトを「指しています」が、類似点はそこまでです。これは、C++ のshared_ptr
によく似ています。

とにかく、ボックス化された整数は整数をラップするオブジェクトです。
int^ボックス化されたオブジェクトへの参照であるため、値を保持するだけでなく、null にすることもできます (参照であるため)。

int^ = 4;ボックス化されたオブジェクトのコンストラクターを実行すると、値が 4 のボックス化されたオブジェクトが構築されます。したがって
、C++ ポインターとは異なり、アドレス "4" を指しているのではなく、たまたま値 4 を含むオブジェクトを "指している" ことになります。 .

于 2013-01-12T21:12:27.273 に答える
1

^*は、クラス オブジェクトを処理する目的で (new/gcnew、パラメーターとして渡す、クラス定義の一部として格納するなど) と同等です。ポインター演算は、C++/CLI と同じではありません。

コードスニペットに相当するものは次のとおりです。

array<int>^ array1;
array1 = gcnew array<int>(10);

for (int i = 0; i < 10; i++)
    array1[i] = i;

array<int>^: これはマネージド参照で、スタックに格納されます。

array1 = gcnew array<int>(10): これは、マネージ ヒープ上に ("array" という名前のクラスから) マネージ オブジェクトを作成し、スタック上のローカル変数への参照を割り当てています。

array1[i] = i: バックグラウンドで、これは「配列」クラスのメソッドを呼び出し、それにインデックスと新しい値 (iこの場合は両方) を渡します。

于 2013-01-12T21:11:45.070 に答える