扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:佚名 来源:中国IT实验室 2007年12月11日
关键字:
四、指针与句柄
对于扩展的托管C++来说,一个主要的限制是C++语言没有变化,两种不同的事情使用相同的符号。“*”的意思要根据代码的上下文而定,试着看看下行代码:
Foo* pf = new Foo(); |
Foo对象在那里创建?内存是否会被自动清除?是否可以象下面代码那样对于指针使用如下算法:
pf++; |
答案依赖于foo是否使用__gc关键词声明,如果它是一个垃圾收集对象,它只能在托管堆上创建,而不能在本地堆、不能在栈上创建。另一方面,如果没有使用__gc关键词声明,这行代码将在本地堆上给对象分配内存,这时候你必须记住使用“delete”来释放它。
一旦编译器的作者拥有了修改语言的自由,正如C++/CLI已经发生的那样,你大可不必担心类对象来自那里,它在哪里存在。你完全可以通过不同的语法来告之对象它应该存在在哪里。
Foo^ hf = gcnew Foo(); |
这叫做一个句柄,起初绝大多数C++开发组将^这个符号称为“脱字符号或帽子”,现在都叫做帽子。就象指针那样,你从处理*或->符号中解脱出来。这种变化带来的冲击绝大部分是在你的头脑里,你只要看实例的声明就能判断对象生命期的管理,而不用返回查看类的声明。
说到类的声明,__gc and __nogc已经不再存在,在它们的位置上是一些比较“Cool”的、带有空格的关键词,带空格的关键词虽然看上去是两个词,但实际上是含有空格的一个词。例如:
ref class R |
你可能认为“ref”是C++/CLI中的一个新关键词,但实际上它不是,“Ref class”是一个关键词,其他的一些类似关键词是:“value class”,“interface class”和“enum class”。因为以前几乎写的每一个C++程序都含有一个叫“Value”的变量,我非常高兴它没有变成一个关键词。
一个ref class是一个托管类,一个生存在托管堆上并由垃圾收集器管理的类。正如我先前说的,你可以在栈上创建实例,编译器将通过一个隐藏的灵巧的指针来管理该对象。
五、属性
C++的属性变化非常大,因为我在文章的开篇讲述了托管C++中属性的尴尬,现在就让我们以简洁的C++/CLI版本来结束吧!
|
属性是否是关键词,从某种意义上可以这么说,它是一个定位型的关键词,所以你可以毫无冲突地将一个变量或函数称为属性,就象上面的代码那样,它只是在类的定义中有特殊的含义。现在的C++/CLI语言支持将属性定义为一个单独的单元,相对与以往的方式,我更喜欢这种方式,相信你也是这样。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者