Вышеупомянутый код будет называть себя рекурсивно, пока не получите переполнение стека (snicker), и программа выйдет из строя. Сам метод (тот, который вы написали) является оператором равенства, который затем снова вызывается явно внутри тела.
Идея переопределения оператора равенства (operator==
) заключается в том, что вы можете сами решить, как должно быть реализовано равенство. Таким образом, вы, вероятно, захотите сделать тело своего метода примерно таким:
return this->bar == other.bar;
Что будет делать то, что вы, скорее всего, захотите.
Одна из причин, по которой вы не хотите, чтобы C++ был «умным» в отношении равенства и автоматически проводил поэтапное сравнение, состоит в том, что у вас могут быть разные представления о том, что означает «равенство», чем тело стандартов C++.
В качестве примера вы можете рассмотреть класс с членом-указателем равным, только если указатели указывают на один и тот же объект, или вы можете считать их равными, если объекты, указывающие на объекты, равны по порядку равны , Или они могут быть (обратите внимание: плохая практика здесь, но люди все еще это делают), указывая на какой-то случайный адрес, поскольку они еще не были инициализированы, а разыменование их приведет к сбою («вы» могли бы это знать из-за некоторой переменной флага, но C++ не будет, когда он попытается «помочь» разыменовать его).
О, хорошо, это имеет смысл. Спасибо за объяснение! – jkeys
+1 для ответа на вопрос о stackoverflow.com с «Вы получите переполнение стека» :-) – Josh