工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 微软开发专栏 > Visual Studio.net专栏 > VC.net > 正文
超越C++:下一代C++——C++/CLI简介
[文章信息]
作者:刘涛
时间:2005-03-08
出处:天极网
责任编辑:方舟
[文章导读]
当微软推出VS.NET7实现了可扩展的托管C++后,C++程序员们反映不一
advertisement
热点推荐
· Photoshop实例剖析:标本浸泡罐
· Excel动画教程:插入超链接
· 免费拥有QQ网络收藏夹
· 巧改参数让FlashGget提速
· 3月7日软件精选 Skype新版即将问世
[正文]

上一页  1 2  

  八、声明类型

  CLR类型有一个形容词前缀用来说明类型的种类,下面是C++/CLI中的类型声明示例:

  1、 CLR types

o Reference types
§ ref class RefClass{...};
§ ref struct RefClass{...};

  2、 Value types

§ value class ValClass{...};
§ value struct ValClass{...};
o Interfaces
§ interface class IType{...};
§ interface struct IType{...};
o Enumerations
§ enum class Color{...};
§ enum struct Color{...};

  3、 Native types

o class Native{...};
o struct Native{...};

  示例:

using namespace System;
interface class IDog
{
 void Bark();
};
ref class Dog : IDog
{
 public:
  void Bark()
  {
   Console::WriteLine("Bow wow wow");
  }
};
void _tmain()
{
 Dog^ d = gcnew Dog();
 d->Bark();
}

  上述程序中的代码与老的C++语言相比看上去非常简洁,在以往的C++代码中,至少要用到-gc和-interface这两个关键词。

  九、装箱/拆箱操作

  在C++/CLI中,加箱是隐含的,而且类型是安全的,一个二进制的拷贝被执行并在CLR堆上形成一个对象,去箱是显式的,仅仅需要使用reinterpret_cast操作符来解除引用。

void _tmain()
{
 int z = 44;
 Object^ o = z; //implicit boxing

 int y = *reinterpret_cast<int^>(o); //unboxing
 Console::WriteLine("{0} {1} {2}",o,z,y);
 z = 66;
 Console::WriteLine("{0} {1} {2}",o,z,y);
}

  // 输出结果如下:
  // 44 44 44
  // 44 66 44

  在上述代码中,"o"对象是一个加箱的拷贝,从第二个语句Console::WriteLine.的输出可以很明显地看到,它并没有涉及到int类型的整数值。

  当你对一种数值类型进行加箱操作时,返回的对象记住了最初的数值类型。

void _tmain()
{
 int z = 44;
 float f = 33.567;
 Object^ o1 = z;
 Object^ o2 = f;
 Console::WriteLine(o1->GetType());
 Console::WriteLine(o2->GetType());
}
// Output
// System.Int32
// System.Single

  因此不能对不同类型的对象进行去箱操作。

void _tmain()
{
 int z = 44;
 float f = 33.567;
 Object^ o1 = z;
 Object^ o2 = f;
 int y = *reinterpret_cast<int^>(o2);//System.InvalidCastException
 float g = *reinterpret_cast<float^>(o1);//System.InvalidCastException
}

  如果你非尝试这么做,那么你将得到一个System.InvalidCastException。让我们来探讨一下完美的类型安全性,如果你要看内部代码,你将看到微软的内部箱在实际中的运用。例如:

void Box2()
{
 float y=45;
 Object^ o1 = y;
}

  编译后的代码是:

.maxstack 1
.locals (float32 V_0, object V_1)
ldnull
stloc.1
ldc.r4 45.
stloc.0
ldloc.0
box [mscorlib]System.Single
stloc.1
ret

  根据微软的内部文档,箱操作将未加工的类型转换为一个具体类型的实例,这项工作的完成通过创建一个新的对象并将数据拷贝到这个新分配的对象。

  十、写在后面的话

  为什么很多人已经可以使用C、C++、.NET来开发程序但还在积极学习C++/CLI呢,我想有四个方面的原因:

  1、从编译器直到内层都还在支持C++代码;

  2、C++/CLI对于其他标准来说无意是具有毁灭性地;

  3、与生俱来的内部支持胜过所有其他CLI语言

  4、所有在MFC中出现的下划线都已不再存在。

上一页  1 2  

发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • Visual C++ 2005中混合代码的初始化
  • 体验Visual C++.NET 2005中的STL
  • 托管C++应用程序开发之概述
  • 用VC.NET制作启动屏幕的新方法
  • Visual Studio 2005中C++的变化
  • VC++.NET中定义和使用MFC DLL
  • VC.NET的Direct3D极速入门宝典
  • VC++.NET开发环境整合技巧
  • Visual C++.NET DirectShow编程
  • 盛大董事长陈天桥:参股新浪只是一个开始
  • 6C联盟降低DVD收费标准 国内厂商持观望态度
  • 熊猫易美崩盘后无人打理 贴牌模式弊端显现
  • 盛大新浪遭口水突袭 分析称有背后集团操纵
  • 百度发布首款可检索中英文双语硬盘搜索软件
  • 电脑报:涉嫌赌博 盛大“劫天牢”调查
  • 英特尔日本“回扣风波”未了 又遭欧盟调查
  • 黄宏生建议国家投1500亿美元搞10年科技会战
  • Advertisement