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