Что происходит, когда вы сравниваете два объекта?
Если бы я написал оператор == для класса 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++ этого не сделал, когда пытался "услужливо" разыменовать его).