快速业务通道

实例解析C++/CLI之值类型

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

值类型是一种轻量级的C++/CLI类机制,非常适合于小型的数据结构,且从语义的角度来看,与数值(Value)类似。

与之相比,引用类型的实例--包括那些声明在堆栈上的,是由垃圾回收器管理的,而值类型的实例却不是。一般来说,一个值类较好的实现应只有一些数据成员,而不需要继承性,这样,在函数传递及返回值、或是赋值操作时,不会带来巨大的数据开销。

值类初印像

请看例1中的Point类,可以通过替换ref为value,来把一个引用类变为值类;与引用类(ref)相似,值类(value)也是一个包含了空格的关键字。与大家想像的一样,值类(value)与值结构(value struct)之间唯一的区别就是,前者默认的可访问性为private,而后者则为public。

例1:

using namespace System;
public value class Point
{
  int x;
  int y;
  public:
   //定义属性X与 Y的读写实例
   property int X
   {
    int get() { return x; }
    void set(int val) { x = val; }
   }
   property int Y
   {
    int get() { return y; }
    void set(int val) { y = val; }
   }
   //定义实例构造函数
 
   Point(int xor, int yor)
   {
    X = xor;
    Y = yor;
   }
   void Move(int xor, int yor)
   {
    X = xor;
    Y = yor;
  }
  virtual bool Equals(Object^ obj) override
  {
   if (obj == nullptr)
   {
    return false;
   }
   if (GetType() == obj->GetType())
   {
    Point^ p = static_cast<Point^>(obj);
    return (X == p->X) && (Y == p->Y);
   }
   return false;
  }
  static bool operator==(Point p1, Point p2)
  {
   return (p1.X == p2.X) && (p1.Y == p2.Y);
  }
  // static bool operator==(Point% p1, Point% p2)
  // {
  // return (p1.X == p2.X) && (p1.Y == p2.Y);
  // }
  // static bool operator==(Point& p1, Point& p2)
  // {
  // return (p1.X == p2.X) && (p1.Y == p2.Y);
  // }
  virtual int GetHashCode() override
  {
   return X ^ (Y << 1);
  }
  virtual String^ ToString() override
  {
   return String::Concat("(", X, ",", Y, ")");
  }
};

值类自动继承自System::ValueType,而System::ValueType则继承自System::Object,但是,这却不能显式地声明。值类隐式表明了为"sealed",也就是说,它不能被作为一个基类,另外,为其类成员指定一个protected是没有任何意义,并且也是不允许的。如果想显式声明一个值类(或引用类),可像如下所示:

value class X sealed {/*...*/};

请注意,此处没有默认的构造函数。对一个值类来说,CLI本身把类实例中所有字段的位都设置为零,所以,不能提供自己的默认构造函数;然而,零、false、nullptr对其他类型来说,也许并不是合适的默认值,因此,对某些特定类型来说,就要用引用类型来取代值类型了。(遵从C++/CLI的实现会将false与nullptr表示为位全部为零。)

值类的另一个限制是它们带有一个默认的拷贝构造函数和一个赋值操作符,两者都会进行逐位复制,并不可被重载。

如果要实现Point类中的Equals函数,相比引用类中的而言要简单一些。请记住,我们正在重载定义System::Object中的这个版本,而其接受一个Object^,因为这种类型的参数很可能有一个nullptr值,在此,先可以省去检查是否为自身比较这一步,而对引用类的Equals实现来说,这一步是必需的,因为可有多个句柄引用同一对象。但是话说回来,在目前的这个值类中,没有两个值的实例可表示同一个实例,两个相同的值

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