我只是对C ++ / CLI句柄(^)以及它是如何工作感到好奇。例如:
我无法理解的第一件事是,over here接受的答案说,插入符号是*(指针)的托管等价物。但是,与*不同,我可以直接将值赋给^。
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 native / normal C ++代码片段会有什么用呢?
int *array1;
array1 = new int[ 10];
for( int i = 0; i < 10; i++)
*(array1 + i ) = i;
答案 0 :(得分:3)
int^
表示对 boxed 整数的引用
它不是指向常规整数的指针。
CLR中引用类型的句柄不等同于指针。它很相似。
两者都指向一个物体,但这是关于相似性结束的地方 它更像是C ++ shared_ptr 。
无论如何,盒装整数是一个包装整数的对象
int^
是对盒装对象的引用,因此除了保存值之外,它可以为null(因为它是引用)。
当您执行int^ = 4;
时,盒装对象的构造函数构造一个值为4的盒装对象。
因此,与c ++指针不同,您没有指向地址“4”,而是指向恰好包含值4的对象。
答案 1 :(得分:1)
^
等同于*
。指针运算在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
)。