工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 微软开发专栏 > Visual Studio.net专栏 > VC.net > 正文
体验Visual Studio 2005中C++语言
[文章信息]
作者:刘涛
时间:2005-03-10
出处:天极网
责任编辑:方舟
[文章导读]
Viusal Studio2005极大地丰富了它的库,可以说是科研背后的清障机和加速器
advertisement
热点推荐
· 在VC程序中实现控件的动态生成与响应
· 抢先感受金山毒霸2005强大功能
· 网易POPO最新版昨晚发布
· 十年MFC经历认识的Microsoft技术
· 轻松合并不同格式的视频文件
[正文]

上一页  1 2  

  三、析构和终结

  当你书写一个可以被其他语言使用的垃圾收集对象时,将发生什么?你针对这个对象是否已经写了一个析构函数?当你正在使用C++,你可以在堆上创建对象,当超出作用域范围后,对象的析构函数将自动运行。当C#或VB应用(不能在堆上创建垃圾收集对象)使用这个对象时将发生什么?这种情况被以一种精巧的方法实时处理。它将对象的析构函数转换为Dispose()方法来使用,所以,拥有析构函数的C++/CLI对象都可以任意使用。

  如果你用C#或VB写了一个带有Dispose()方法的类,你可能已经写了一个终结函数,对于终结函数C++/CLI也有一种非常简单的语法。就象foo对象的析构函数叫做~Foo()一样,foo对象的终结函数叫做!Foo(),这两种方法都提醒你他们与构造函数相反。

  当一个对象在托管堆上创建后,终结函数开始运行但从不被处理(因为执行的Dispose的级别要高于终结函数)。从某种意义上说,它是一个防护网,使你确信对象能释放其占用的非托管资源。即使使用对象的开发人员忘记了处理它。

  四、指针与句柄

  对于扩展的托管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
{
 private:
  int m_a;
 public:
  R(int a): m_a(a) {}
};

  你可能认为"ref"是C++/CLI中的一个新关键词,但实际上它不是,"Ref class"是一个关键词,其他的一些类似关键词是:"value class",""interface class"和"enum class"。因为以前几乎写的每一个C++程序都含有一个叫"Value"的变量,我非常高兴它没有变成一个关键词。

  一个ref class 是一个托管类,一个生存在托管堆上并由垃圾收集器管理的类。正如我先前说的,你可以在栈上创建实例,编译器将通过一个隐藏的灵巧的指针来管理该对象。

  五、属性

  C++的属性变化非常大,因为我在文章的开篇讲述了托管C++中属性的尴尬,现在就让我们以简洁的C++/CLI版本来结束吧。

ref class R
{
 private:
  int m_Size;
 public:
  property int Size
  {
   int get() { return m_Size; }
   void set(int val){m_Size = val;}
  }
};
R r;
r.Size = 42;

  属性是否是关键词,从某种意义上可以这么说,它是一个定位型的关键词,所以你可以毫无冲突地将一个变量或函数称为属性,就象上面的代码那样,它只是在类的定义中有特殊的含义。现在的C++/CLI语言支持将属性定义为一个单独的单元,相对与以往的方式,我更喜欢新的方式,相信你也是这样。

上一页  1 2  

发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • 超越C++:下一代C++——C++/CLI简介
  • Visual C++ 2005中混合代码的初始化
  • 体验Visual C++.NET 2005中的STL
  • 托管C++应用程序开发之概述
  • 用VC.NET制作启动屏幕的新方法
  • 军队信息化诞生新领域 电子军务呼之欲出
  • 世界经济论坛公布信息化程度全球最新排名
  • 2004政务绩效评估:政府门户尚处于发展阶段
  • 甲骨文出资5.15亿美元 意图收购RetekInc
  • 技术并购:帮你突破传统增长的“天花板”
  • 微软推跨电话和PC网络新软件 意在企业客户
  • 掌门人远避天涯 和光商务引爆深圳担保圈
  • 北京移动承诺话费误差双倍返还 四月底实施
  • Advertisement