【问题标题】:C++/CLI handle operatorC++/CLI 句柄运算符
【发布时间】:2015-02-24 23:37:12
【问题描述】:

我只是对 C++/CLI 句柄(^)及其工作原理感到好奇。例如:

我无法理解的第一件事是,over here 接受的答案说插入符号是 *(指针)的托管等效项。但是,与 * 不同的是,我可以直接为 ^ 赋值。

int ^num;
num = 4;

这在 C++ 中不起作用:

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

为什么会观察到这种行为? 此外,在 Microsoft Webpage 中,他们说您不能指向对象的成员,并且它不支持指针算术。所以下面的代码 sn-p 都会编译失败

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++ 代码 sn-p 相当于什么?

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    两者都“指向”一个对象,但这就是相似性结束的地方。
    它更像是一个 C++ shared_ptr

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

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

    【讨论】:

    • 你能解释一下盒装整数和普通整数的区别吗?
    • @Dwight : Microsoft 花钱请人写文档,SO 是由志愿者组成的——首先阅读文档,然后请无酬人花时间解释一些已经很容易理解的东西可用的。 ;-] Boxing (C++/CLI)
    • @Dwight :我添加了一些解释。还是请阅读链接。
    • @Yochai Timmer:感谢您对盒装整数的全面解释
    【解决方案2】:

    ^ 等同于*,用于处理类对象(new/gcnew、作为参数传递、作为类定义的一部分存储等)。指针算法在 C++/CLI 中是不一样的。

    这是您的代码 sn-p 的等价物:

    array<int>^ array1;
    array1 = gcnew array<int>(10);
    
    for (int i = 0; i < 10; i++)
        array1[i] = i;
    

    array&lt;int&gt;^:这是一个托管引用,存储在堆栈中。

    array1 = gcnew array&lt;int&gt;(10):这是在托管堆上创建一个托管对象(来自名为“array”的类),并将引用分配给堆栈上的局部变量。

    array1[i] = i:在幕后,它调用“数组”类的一个方法,将索引和新值传递给它(在本例中均为i)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多