2009-07-28 3 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

위의 코드는 자신을 재귀 적으로 호출합니다. 메서드 자체 (작성한 메서드)는 동등 연산자이며,이 연산자는 본문 내에서 명시 적으로 다시 호출됩니다.

평등 연산자 (operator==)를 재정의하는 아이디어는 평등성을 구현하는 방법을 스스로 결정할 수 있다는 것입니다. 따라서 메소드 몸체를 다음과 같이 만들려는 것이 좋습니다.

return this->bar == other.bar; 

가장 가능성이있는 것은 사용자가 원하는 것입니다.

C++이 평등성에 대해 "똑똑하다"는 것을 원하지 않는 이유 중 하나는 구성원 별 비교를 자동으로 수행한다는 것입니다. C++ 표준 본문보다 "평등성"이 무엇을 의미하는지에 대해 매우 다른 아이디어가있을 수 있습니다.

예를 들어 포인터가 똑같은 개체를 가리키는 경우에만 포인터 멤버가있는 클래스를 같거나 포인터가있는 개체가 memberwise와 동일한 경우에만 같다고 생각할 수 있습니다 . 또는 그들은 아직 초기화되지 않았기 때문에 무작위로 주소를 가리키며 역 참조를 사용하면 충돌이 발생할 수 있습니다 ("당신"은 플래그 변수가 있기 때문에 이것을 알 수 있습니다. 그러나 C++은 그것을 "유익하게"역 참조하려고 시도하지 않았습니다.)

+0

오, 알겠습니다. 설명 주셔서 감사합니다! – jkeys

+3

"스택 오버플로가 발생합니다"라는 질문에 대한 stackoverflow.com의 질문에 대한 답변 :-) – Josh