快速业务通道

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

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
你获知两个对象为同一类型,就可以安全地把Object句柄向上转换为一个Point句柄,进而执行数据比较,而不用担心发生错误的类型匹配这样的异常,在此,使用了static_cast。

为使哈希表(散列表)数据结构工作正常,在对象中必须有一个名为GetHashCode的函数。基本上,如果一个类型定义了Equals,它也应该同时定义GetHashCode,其是重载System::Object的版本,如标记9。

与相等性比较类似,值的格式化是通过一个重载System::Object的函数实现的,如标记10(a),而不是重载<<操作符。这个函数称为ToString,它的功能是创建并返回一个当前实例的字符串,它调用了System::String::Concat连接三个字符串及两个int,实现了所需功能。

毫无疑问,不可能对任一参数及类型的搭配,Concat都能有一个适当的重载版本,那么,Concat是怎样处理这些参数的呢?本例中使用的重载版本如下: static String^ Concat(... array<Object^>^ list);

圆括号中的参数声明(其必须有一托管的数组类型),表明可接受任意数量给定元素类型的参数,即,它是一个类型安全的varargs--参数数组,参数列表为一指向对象句柄托管数组的句柄。

那么这两个int--X与Y,是怎样转换为Object^的呢?其实,在基本数据类型对Object^的表达式中,都存在着一个隐式转换,这个过程称为"装箱",也就是包含基本数据类型值的对象,在托管堆上的分配。逆过程称为"解箱",这需要显式转换。

最后提一下命名约定。CLI指定了类、函数、属性必须以PascalCase模式来编写,也就是说,每个单词的首字母必须大写,而CLI标准库也遵循这条原则。

一个简单的示例程序

例2是一个使用了Point类的简单程序,下面以此为例简单讲解各方面的含义:

例2:

using namespace System;
int main()
{
  /*1*/ Point^ p1 = gcnew Point;
  /*2*/ Console::WriteLine("p1 = {0}, p1''s HashCode = {1}", p1, p1->GetHashCode());
  /*3*/ p1->Move(5, 7);
  /*4*/ Console::WriteLine("p1 = {0}, p1''s HashCode = {1}", p1, p1->GetHashCode());
  /*5*/ Console::WriteLine("p1 Equals Point(9, 1) = {0}",
  p1->Equals(gcnew Point(9, 1)));
}

分配托管内存:在标记1中,定义了一个指向Point类型的句柄,并用gcnew操作符返回的位置初始化它,gcnew操作符是一个关键字,它为一个新的Point对象在托管堆中,分配了相应的空间,与大家想的一样,此处还会调用默认的构造函数。在目前的C++/CLI版本中,引用类的对象只能驻留于堆栈或托管堆中,与其他CLI语言不同,C++/CLI可以让你编写能被传递,并通过复制构造函数或 = 操作符赋值的引用类,还可以重载Clone函数,实现虚拟(深度)赋值。 格式化输出:CLI提供了一系列的I/O类型--使用功能性注解的函数。最简单的例子就是System::Console Write和WriteLine(见标记2)的重载版本,其向标准输出设备输出文本,WriteLine会跟上一个新行,而Write则不会。

这类函数有许多重载的版本,然而,最常见的形式是接受一个包含文本的格式化字符串,并带有可选的格式指定符--由花括号进行分隔,其后紧接需要格式化其值的参数。格式指定符 {0} 对应于紧接着格式化字符串传递进来的第一个参数;而 {1} 则对应于第二个参数,以此类推。与Concat类似,也有一些接受几个固定参数的重载版本,或可接受几个固定参数并同时接受一个可变数目的参数,在本例中,使用了如下的版本:

static void WriteLine(String^ format, Object^ arg0, Object^ arg1);

字符串在此被隐式转换为String^。因为p1是一个Point^,且Point是从Object继承而来,所以p1是is关系。GetHashCode返回一个int,因此在被传递之前,会

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号