快速业务通道

实例解析C++/CLI之开卷有益

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30

C++/CLI可以说是标准C++语言一种新的"方言",它是Microsoft为充分利用CLI(Common Language Infrastructure)平台而开发出来的。那么,它在语言方面有何新颖独到之处呢,下面,就让我们一起开始奇妙的C++/CLI语言之旅(文中所有示例代码,均以Visual Studio.NET 2005 Professional编译通过,所有的讲解内容,也均以Visual Studio.NET 2005环境为基础)。

程序集与元数据

传统的C++编译模式包括把单独的源文件编译为目标文件(obj),再把目标文件与库函数链接在一起,以生成可执行程序。而CLI模式却大不相同,它涉及到程序集的创建与使用。

简单来说,在不计输入源文件数目的基础上,程序集即为单次编译的输出。如果输出带有一个进入点函数(例如main函数),它即为一个.exe文件;如果没有,它则为一个.dll文件。任何引用外部程序集而生成的编译,必须要访问所依赖的程序集,此时也没有类似传统链接时用到的头文件机制,而是通过编译器在所依赖的程序集内部查找,来访问所需的外部信息。

程序集包含了元数据,其描述了包含在那里的类型与函数,还有CIL(Common Intermediate Language)指令--Microsoft称其为"MSIL"。元数据与指令能通过独立的VES(Virtual Execution System)来执行。

CLI类型

例1是一个模拟二维点的类。此处不得不提到命名空间,所有的CLI标准库类型都属于System命名空间,或嵌套在其内部的某个命名空间之下,例如System::Object和System::String,还有System::IO、 System::Text、System::Runtime::CompilerOptions等等。标记1可避免在程序中一直使用namespace限定词。

例1:

/*1*/
using namespace System;
/*2*/
public ref class Point
{
  int x;
  int y;
  public:
   //定义用于读写X与Y实例属性
   /*3a*/ property int X
   {
    /*3b*/ int get() { return x; }
    /*3c*/ void set(int val) { x = val; }
   }
   /*4a*/ property int Y
   {
    /*4b*/ int get() { return y; }
    /*4c*/ void set(int val) { y = val; }
   }
   //定义实例构造函数
   /*5a*/ Point()
   {
    /*5b*/ X = 0;
    /*5c*/ Y = 0;
   }
   /*6a*/ Point(int xor, int yor)
   {
    /*6b*/ X = xor;
    /*6c*/ Y = yor;
   }
   //定义实例方法
   /*7a*/ void Move(int xor, int yor)
   {
    /*7b*/ X = xor;
    /*7c*/ Y = yor;
   }
   /*8a*/ virtual bool Equals(Object^ obj) override
   {
    /*8b*/ if (obj == nullptr)
    {
     return false;
    }
    /*8c*/ if (this == obj) //我们在测试自己吗?
    {
     return true;
    }
    /*8d*/ if (GetType() == obj->GetType())
    {
     /*8e*/ Point^ p = static_cast<Point^>(obj);
     /*8f*/ return (X == p->X) && (Y == p->Y);
    }
    return false;
   }
   /*9*/ virtual int GetHashCode() override
   {
    return X ^ (Y << 1);
   }
   /*10a*/ virtual String^ ToString() override
   {
    /*10b*/ return String::Concat("(", X, ",", Y, ")");
   }
};

在标记2中,我们定义了一个称为Point的引用类(ref class),一个引用类是一个CLI引用类型,当两者一起使用时,ref与class(中间有空格)表示了一个新的关键词。

public前缀表明了类型在它的父类程序集之外可见--即可访问(只有两种类型的可见性,public和private,类型默认为private),另外,只有类型才能有可见性属性,

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号