Что происходит, когда вы сравниваете два объекта?

Если бы я написал оператор == для класса Foo (в C++), что именно произойдет? Сравнивает ли он каждый элемент данных друг с другом?

class Foo
{
   private:
      int bar;

   public:
      bool operator==(const Foo other&)
      {
         return *this == other; //what?
         //is this the same as bar == bar?
      }
}

1 ответ

Решение

Приведенный выше код будет вызывать себя рекурсивно до тех пор, пока вы не получите переполнение стека (snicker) и не произойдет сбой программы. Сам метод (тот, который вы написали) является оператором равенства, который затем снова вызывается в теле.

Идея переопределения оператора равенства (operator==является то, что вы можете решить для себя, как должно осуществляться равенство. Так что вы, вероятно, захотите, чтобы тело вашего метода делало что-то вроде:

return this->bar == other.bar;

Который будет делать то, что вы, скорее всего, хотите.

Одна из причин того, что вы не хотите, чтобы C++ "умел" относиться к равенству и автоматически проводил сравнение по элементам, заключается в том, что у вас могут быть совершенно разные представления о том, что означает "равенство", чем тело стандартов C++.

Например, вы можете считать класс с членом-указателем равным только в том случае, если указатели указывают на один и тот же объект, или вы можете считать их равными, только если указатели на объекты равны по элементам. Или они могут (Примечание: плохая практика здесь, но люди все еще делают это), указывая на некоторый случайный адрес, поскольку они еще не были инициализированы, и разыменование их приведет к сбою ("вы" можете знать это из-за некоторой переменной флага, но C++ этого не сделал, когда пытался "услужливо" разыменовать его).

Другие вопросы по тегам