首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++/CLI 简单介绍

C++/CLI 简单介绍

作者头像
田春峰-JCJC错别字检测
发布2019-02-14 11:47:45
1K0
发布2019-02-14 11:47:45
举报

C++/CLI简介

托管的C++(MC++)饱受诟病的一个地方就是语法格式和普通的编程语言差别很大,很多人都评价为: ugly 和 twisted 语法。

因为.net 的基础之一Common Language Infrastructure CLI是提交给了ECMA标准委员会。为了改进现有的MC++ ECMA在 2003年10月份起动了一个新的工作小组,其任务是为ISO标准的C++和CLI之间的交互操作提供一组新的语言扩展。这也就是C++/CLI的由来。

改进前的MC++有如下缺点:

1、 语法格式不雅观,比如很多双下划线的关键字;

2、 托管的C++在和CLI交互是并不能使用全部的功能,比如在C#或者VB.NET中可以使用 for-each 等语法,而MC++不可以;

3、 MC++提供不了一些标准C++的语言特性,比如:C++中的模板,和CLI的内存收集(garbage collection);

4、 非托管的指针和托管的引用指针在语法上都用*表示,容易混淆;

5、 MC++的编译器的效果不好。

现在的C++/CLI也就是Whidbey中的MC++,完全解决了上面的ugly 和 twist的问题。

下面我们来介绍一些特性:

还是从HelloWord 开始吧:

void _tmain()

{

//^ 号是新引进的语法,表示一个handler

String^ str = "Hello World";

Console::WriteLine(str);

}

上免得 ^str handler就表示指向一个托管对象的引用。

Handler 和 C++中的指针的区别如下:

1、 语法上 用 ^和*区别;

2、 Handler是建立在托管堆上的一个被(CLI)管理的引用,而指针指向一个物理的内存地址;

3、 指针不受垃圾回收器的影响,而handler实际指向的内存地址则收垃圾回收器的管理;

4、 使用指针必须用声明使用delete来释放内存,而handler可以使用也不可以使用;

5、 Handler是类型安全的,每个指向托管对象的handler都对应一个具体的类型,而指针则没有要求,比如可以使用void * 指针;

6、 语法上使用new返回一个指针,而gcnew返回一个handler。

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

请看下面的例子:

void _tmain()

{

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

Object^ o1 = gcnew Object();

Console::WriteLine(str);

}

上例gcnew用来在CLR堆上初始化一个托管对象并返回一个handler。这样的语法可以和指针的声明很清楚的区别开来。

看一个具体的例子:

using namespace System;

interface class IDog

{

void Bark();

};

ref class Dog : IDog

{

public:

void Bark()

{

Console::WriteLine("汪汪");

}

};

void _tmain()

{

Dog^ d = gcnew Dog();

d->Bark();

}

看起来很舒服,是吧

田春峰

2004-10-14

原文地址: 这里 http://www.winterdom.com/cppclifaq/ 9月17日Stan Lippman访谈录文字节选

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2004年10月14日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档