почему оператор ^ используется после Point в следующем коде об объектном классе - PullRequest
3 голосов
/ 22 февраля 2012

Это пример из 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 ]

3 голосов
/ 22 февраля 2012

Это C ++ / CLI, а не просто C ++.

^ - это, в основном, .NET-эквивалент обычного *, но он определяет дескриптор, а не указатель.Дескрипторы могут быть нулевыми, как указатели.

Так что Point^ является дескриптором экземпляра класса Point.

Вы можете узнать больше об этом на MSDN .

1 голос
/ 22 февраля 2012

Это C ++ / CLI, ранее известный как Managed C ++ code, где вы можете смешивать стандартный C ++ и использовать библиотеки .Net.

Оператор шляпы ^ объявляет переменную дескриптором сбора мусора, а не стандартным указателем стиля C * или ссылкой C ++ &.

1 голос
/ 22 февраля 2012

Оператор ^ - это управляемый C ++ способ создания дескрипторов. Смотри здесь

...