C ++ / CLI句柄操作符

时间:2013-01-12 21:06:21

标签: visual-c++ c++-cli

我只是对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;

2 个答案:

答案 0 :(得分:3)

int^表示对 boxed 整数的引用 它不是指向常规整数的指针。

CLR中引用类型的句柄不等同于指针。它很相似。

两者都指向一个物体,但这是关于相似性结束的地方 它更像是C ++ shared_ptr

无论如何,盒装整数是一个包装整数的对象 int^是对盒装对象的引用,因此除了保存值之外,它可以为null(因为它是引用)。

当您执行int^ = 4;时,盒装对象的构造函数构造一个值为4的盒装对象。
因此,与c ++指针不同,您没有指向地址“4”,而是指向恰好包含值4的对象。

答案 1 :(得分: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)。