网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > DotNet > VC.NET > 超越C++下一代C++ —C++/CLI简介  

超越C++下一代C++ —C++/CLI简介

2006-04-18  作者:BitsCN整理  来源:中国网管联盟  点评 投稿 收藏

七、CLR对象示例

网管论坛bbs_bitsCN_com

void _tmain()

{

String^ str = gcnew String("Hello World");

Object^ o1 = gcnew Object();

Console::WriteLine(str);

} 网管u家bitscn.net 
网管联盟bitsCN_com

关键字gcnew用来实例化一个CLI对象,而且它返回一个指向在CLR堆上的对象的句柄,gcnew的优点在于它可以方便的让我们区分拖管和非拖管的实例对象。 网管朋友网www_bitscn_net

大部分情况下,gcnew关键字和^操作符提供了你用来进行BCL的一切手段,但是很明显你需要创建和声明属于自己的拖管类和接口。 网管联盟bitsCN_com

八、声明类型

中国网管联盟bitsCN.com

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

网管bitscn_com

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();

} 

网管u家u.bitscn@com

中国网管论坛bbs.bitsCN.com

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

九、装箱/拆箱操作 中国网管联盟bitsCN.com

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

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 
网管联盟bitsCN_com
网管u家bitscn.net

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

网管u家u.bitscn@com

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

中国网管联盟bitsCN.com

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 中国网管论坛bbs.bitsCN.com 
网管u家u.bitscn@com

因此不能对不同类型的对象进行去箱操作。 网管朋友网www_bitscn_net

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

} 
网管联盟bitsCN_com
网管朋友网www_bitscn_net

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

void Box2()

{

float y=45;

Object^ o1 = y;

} 

网管联盟bitsCN_com

网管u家u.bitscn@com

编译后的代码是:

网管u家u.bitsCN.com

.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 网管朋友网www_bitscn_net 
网管bitscn_com

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

网管论坛bbs_bitsCN_com

十、写在后面的话 网管有家www.bitscn.net

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

网管u家u.bitscn@com

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

网管联盟bitsCN@com

2、C++/CLI对于其他标准来说无意是具有毁灭性地; 网管u家u.bitsCN.com

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

4、所有在MFC中出现的下划线都已不再存在。 网管下载dl.bitscn.com

TAGs简介   超越   类型   指针   对象   代码   /CLI   托管    
 上一篇:VC++技术内幕(第四版)笔记   下一篇:基于Visual C++的Winsock API研究
超越C++下一代C++ —C++/CLI简介 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
最新推荐文章:
网管论坛交流: