2009-07-28 4 views
2

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

class Foo 
{ 
    private: 
     int bar; 

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

ответ

16

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

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

return this->bar == other.bar; 

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

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

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

+0

О, хорошо, это имеет смысл. Спасибо за объяснение! – jkeys

+3

+1 для ответа на вопрос о stackoverflow.com с «Вы получите переполнение стека» :-) – Josh

Смежные вопросы