C++/CLI 简单介绍

2731人阅读 评论(2) 收藏 举报

C++/CLI简介

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

因为.net 的基础之一Common Language Infrastructure CLI是提交给了ECMA标准委员会。为了改进现有的MC++ ECMA 200310月份起动了一个新的工作小组,其任务是为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

 

请看下面的例子:

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访谈录文字节选

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场