“= gcnew MyClass()”和“= %MyClass()”有啥区别?
Posted
技术标签:
【中文标题】“= gcnew MyClass()”和“= %MyClass()”有啥区别?【英文标题】:What is the difference between "= gcnew MyClass()" and "= %MyClass()"?“= gcnew MyClass()”和“= %MyClass()”有什么区别? 【发布时间】:2019-08-17 20:29:43 【问题描述】:有什么区别
MyClass ^myClass = gcnew MyClass();
和
MyClass ^myClass = %MyClass();
如果有的话?
两者似乎都有效,但不确定幕后发生了什么。
【问题讨论】:
完全不一样,第二条语句是使用“堆栈语义”的一种破坏方式。通常写为MyClass myClass;
,故意省略^ 帽子。最大的不同是对象自动放置在作用域块的末尾。如果您熟悉 C++,那么它相当于 RAII。如果您熟悉 C#,那么它相当于 using
语句。开始谷歌搜索,这很重要,查询“c++/cli stack semantics”。
@HansPassant 感谢您提供更专业的见解。我试图从在线 c++-cli 文档中推断问题,但我不是专家。您的回复更有用、更准确。
@HansPassant 谢谢。在this page 上,Microsoft 表示编译器会在内部在垃圾收集堆上创建实例(使用 gcnew),但不会创建复制构造函数。所以“MyClass myClass = MyClass();”除非我实现复制构造函数,否则不起作用,但是“MyClass ^myClass = %MyClass();”确实有效...所以我想我的相关问题是...为什么?
进一步澄清上述内容:我认为“MyClass ^myClass = %MyClass();”也可以写成“MyClass mc = MyClass(); MyClass ^myClass = %mc;”但似乎并非如此。
【参考方案1】:
修订:
Stack Semantics
上一个: 因此,在这两种情况下,新创建的对象的地址都分配给了一个指针。因此,这两个语句的工作方式似乎相同。
区别:
使用gcnew
分配具有垃圾收集的托管类型(引用)的内存。
使用%MyClass()
类似于使用&MyClass()
,后者没有垃圾回收功能。
gcnew: 托管类型(引用或值类型)的内存由 gcnew 分配,并通过垃圾回收器释放。
%MyClass(): 与标准 C++ 一样,该对象不会被垃圾回收。运算符重载的工作方式类似于标准 C++。每个 * 变成 ^,每个 & 变成 %。
'^'的含义: 句柄声明符(^,读作“帽子”)修改类型说明符,表示当系统确定对象不再可访问时,应自动删除声明的对象。
相关链接:Meaning of '%'
, Search "Operator Overloading"Meaning of gcnew
Meaning of '^'
【讨论】:
以上是关于“= gcnew MyClass()”和“= %MyClass()”有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
python累计求和,编写一个程序,从键盘输入两个整数m和n,求m和n之间(包括m和n)