为什么在以下代码中关于Object Class的Point之后使用^运算符

时间:2012-02-22 06:34:15

标签: .net object c++-cli msdn

这是来自MSDN的.NET Framework中对象类的示例。

using namespace System;

// The Point class is derived from System.Object.
ref class Point
{
public:
    int x;
public:
    int y;

public:
    Point(int x, int y)
    {
        this->x = x;
        this->y = y;
    }

public:
    virtual bool Equals(Object^ obj) override
    {
        // If this and obj do not refer to the same type,
        // then they are not equal.
        if (obj->GetType() != this->GetType())
        {
            return false;
        }

        // Return true if  x and y fields match.
        Point^ other = (Point^) obj;
        return (this->x == other->x) && (this->y == other->y);
    }

    // Return the XOR of the x and y fields.
public:
    virtual int GetHashCode() override 
    {
        return x ^ y;
    }

    // Return the point's value as a string.
public:
    virtual String^ ToString() override 
    {
        return String::Format("({0}, {1})", x, y);
    }

    // Return a copy of this point object by making a simple
    // field copy.
public:
    Point^ Copy()
    {
        return (Point^) this->MemberwiseClone();
    }
};

int main()
{
    // Construct a Point object.
    Point^ p1 = gcnew Point(1, 2);

    // Make another Point object that is a copy of the first.
    Point^ p2 = p1->Copy();

    // Make another variable that references the first
    // Point object.
    Point^ p3 = p1;

    // The line below displays false because p1 and 
    // p2 refer to two different objects.
    Console::WriteLine(
        Object::ReferenceEquals(p1, p2));

    // The line below displays true because p1 and p2 refer
    // to two different objects that have the same value.
    Console::WriteLine(Object::Equals(p1, p2));

    // The line below displays true because p1 and 
    // p3 refer to one object.
    Console::WriteLine(Object::ReferenceEquals(p1, p3));

    // The line below displays: p1's value is: (1, 2)
    Console::WriteLine("p1's value is: {0}", p1->ToString());
}

// This code produces the following output.
//
// False
// True
// True
// p1's value is: (1, 2)

我不明白为什么在^之后使用Point运算符。 有人请解释。

3 个答案:

答案 0 :(得分:3)

这是C ++ / CLI,而不仅仅是普通的C ++。

^基本上是普通*的.NET等价物,但它定义了句柄,而不是指针。句柄可以为空,就像指针一样。

因此Point^Point类实例的句柄。

你可以read more about it on MSDN

答案 1 :(得分:1)

^运算符是托管C ++创建句柄的方式。见here

答案 2 :(得分:1)

这是C ++ / CLI,以前称为托管C ++代码,您可以在其中混合标准C ++并使用.Net库。

^ hat运算符将变量声明为Garbage Collected Handle,而不是标准C样式指针*或C ++引用&