实例解析C++/CLI之值类型
get新技能是需要付出行动的,即使看得再多也还是要动手试一试。今天图老师小编跟大家分享的是实例解析C++/CLI之值类型,一起来学习了解下吧!
值类型是一种轻量级的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_castPoint^(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 {/*...*