实例解析C++/CLI之开篇

论坛 期权论坛     
选择匿名的用户   2021-6-2 18:49   490   0
<div align="center">
<strong>实例解析C&#43;&#43;/CLI</strong>
<strong>之开篇</strong>
</div>
<div>
  
</div>
<div>
  
</div>
<div>
          C&#43;&#43;/CLI可以说是标准C&#43;&#43;语言一种新的“方言”,它是Microsoft为充分利用CLI(Common Language Infrastructure)平台而开发出来的。那么,它在语言方面有何新颖独到之处呢,下面,就让我们一起开始奇妙的C&#43;&#43;/CLI语言之旅(文中所有示例代码,均以Visual Studio.NET 2005 Professional编译通过,所有的讲解内容,也均以Visual Studio.NET 2005环境为基础)。
</div>
<div>
  
</div>
<div>
  
</div>
<div>
<strong>         </strong>
<strong>程序集与元数据</strong>
</div>
<div>
          传统的C&#43;&#43;编译模式包括把单独的源文件编译为目标文件(obj),再把目标文件与库函数链接在一起,以生成可执行程序。而CLI模式却大不相同,它涉及到程序集的创建与使用。
</div>
<div>
          简单来说,在不计输入源文件数目的基础上,程序集即为单次编译的输出。如果输出带有一个进入点函数(例如main函数),它即为一个.exe文件;如果没有,它则为一个.dll文件。任何引用外部程序集而生成的编译,必须要访问所依赖的程序集,此时也没有类似传统链接时用到的头文件机制,而是通过编译器在所依赖的程序集内部查找,来访问所需的外部信息。
</div>
<div>
          程序集包含了元数据,其描述了包含在那里的类型与函数,还有CIL(Common Intermediate Language)指令——Microsoft称其为“MSIL”。元数据与指令能通过平台独立的VES(Virtual Execution System)来执行。
</div>
<div>
  
</div>
<div>
  
</div>
<div>
<strong>         CLI</strong>
<strong>类型</strong>
</div>
<div>
          例1是一个模拟二维点的类。此处不得不提到命名空间,所有的CLI标准库类型都属于System命名空间,或嵌套在其内部的某个命名空间之下,例如System::Object和System::String,还有System::IO、 System::Text、System::Runtime::CompilerOptions等等。标记1可避免在程序中一直使用namespace限定词。
</div>
<div>
  
</div>
<div>
例1:
</div>
<div>
/*1*/
</div>
<div>
using namespace System;
</div>
<div>
  
</div>
<div>
/*2*/
</div>
<div>
public ref class Point
</div>
<div>
{
</div>
<div>
     int x;
</div>
<div>
     int y;
</div>
<div>
public:
</div>
<div>
  
</div>
<div>
//定义用于读写X与Y实例属性
</div>
<div>
  
</div>
<div>
/*3a*/ property int X
</div>
<div>
     {<!-- -->
</div>
<div>
/*3b*/
       int get() { return x; }
</div>
<div>
/*3c*/
       void set(int val) { x &#61; val; }
</div>
<div>
     }
</div>
<div>
  
</div>
<div>
/*4a*/ property int Y
</div>
<div>
     {<!-- -->
</div>
<div>
/*4b*/
       int get() { return y; }
</div>
<div>
/*4c*/
       void set(int val) { y &#61; val; }
</div>
<div>
    }
</div>
<div>
//定义实例构造函数
</div>
<div>
  
</div>
<div>
/*5a*/  Point()
</div>
<div>
     {<!-- -->
</div>
<div>
/*5b*/
       X &#61; 0;
</div>
<div>
/*5c*/
       Y &#61; 0;
</div>
<div>
     }
</div>
<div>
  
</div>
<div>
/*6a*/ Point(int xor, int yor)
</div>
<div>
     {<!-- -->
</div>
<div>
/*6b*/
       X &#61; xor;
</div>
<div>
/*6c*/
       Y &#61; yor;
</div>
<div>
     }
</div>
<div>
//定义实例方法
</div>
<div>
  
</div>
<div>
/*7a*/ void Move(int xor, int yor)
</div>
<div>
     {<!-- -->
</div>
<div>
/*7b*/
       X &#61; xor;
</div>
<div>
/*7c*/
       Y &#61; yor;
</div>
<div>
     }   
</div>
<div>
  
</div>
<div>
/*8a*/ virtual bool Equals(Object^ obj) override
</div>
<div>
     {<!-- -->
</div>
<div>
/*8b*/
       if (obj &#61;&#61; nullptr)
</div>
<div>
         {<!-- -->
</div>
<div>
             return false;
</div>
<div>
         }
</div>
<div>
/*8c*/
       if (this &#61;&#61; obj)    //我们在测试自己吗?
</div>
<div>
         {<!-- -->
</div>
<div>
             return true;
</div>
<div>
         }
</div>
<div>
/*8d*/
       if (GetType() &#61;&#61; obj-&gt;GetType())
</div>
<div>
         {<!-- -->
</div>
<div>
/*8e*/
           Point^ p &#61; static_cast&lt;Point^&gt;(obj);
</div>
<div>
/*8f*/
           return (X &#61;&#61; p-&gt;X) &amp;&amp; (Y &#61;&#61; p-&gt;Y);
</div>
<div>
         }
</div>
<div>
         return false;
</div>
<div>
     }
</div>
<div>
  
</div>
<div>
/*9*/
    virtual int GetHashCode() override
</div>
<div>
     {<!-- -->
</div>
<div>
         return X ^ (Y &lt;&lt; 1);
</div>
<div>
     }
</div>
<div>
  
</div>
<div>
/*10a*/ virtual String^ ToString() override
</div>
<div>
     {<!-- -->
</div>
<div>
/*10b*/
      return String::Concat(&#34;(&#34;, X, &#34;,&#34;, Y, &#34;)&#34;);
</div>
<div>
     }
</div>
<div>
};
</div>
<div>
  
</div>
<div>
          在标记2中,我们定义了一个称为Point的引用类(ref class),一个引用类是一个CLI引用类型,当两者一起使用时,ref与class(中间有空格)表示了一个新
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP