托管对象,为什么不会(^)。编译?

时间:2011-06-29 00:16:29

标签: .net visual-studio pointers c++-cli

我最近需要考虑控制一个串口,所以我转向.net。我想,既然我正在使用视觉工作室,这很容易......我错了......

在搞清楚“^”和“gcnew”之后,我偶然发现了“->”,我仍然发现“(*).” (不知道这是由于我自己的无知)。

问题是:

如果“->”相当于“(*).” “^”相当于“*

那么为什么“(^).”在输入时不会编译,会显示自动完成?或者我在这里遗漏了什么?

3 个答案:

答案 0 :(得分:5)

C ++ / CLI中的帽子(^)和百分比(%)是星号(*)和&符号的偶然(1)( {C} in

&

^不用作运营商;你仍然使用*


(1)请注意,它们不是相同的等效的^%用于处理和引用垃圾收集堆上的对象(即托管对象)。 *&用于指向本机C ++对象的引用和引用(至少在大多数情况下)。

在C ++ / CLI中编程时要非常小心:永远不要忘记在单个源文件中使用了两个完全不同的对象模型。创建和销毁对象的方式以及如何在C ++中管理对象生存期与.NET中的工作方式完全不同。

答案 1 :(得分:0)

星号*比帽子^更通用。作为类型修饰符,T*表示C ++ - 指针,T^表示CLI引用。但是,取消引用运算符的符号的其他用法适用于这两种类型,而间接调用运算符->同样适用:

T * x = new T;
T ^ y = gcnew T;

*x = 5;
*y = 6;

x->foo();
y->foo();

这个想法是解除引用是一个独立于特定引用类型的一般概念,因此可以使用相同的符号来最小化语法扩散。

答案 2 :(得分:0)

如果您使用.net的唯一原因是使用串口,​​请不要。原生api更强大,更易于使用。