Pregunta ¿Sobrecargar '==' obtener '! ='?


Si sobrecargo manualmente el == operador para una estructura, ¿obtengo el != operador de forma gratuita (presumiblemente definido como el booleano opuesto), o tengo que sobrecargarlo manualmente (incluso si solo return !(this == rhs)?

Editar: la pregunta no es si PUEDO sobrecargar a los dos operadores, sino si debo sobrecargar la desigualdad si ya sobrecargué el operador de igualdad. De todos modos, se han dado buenas respuestas.


59
2017-11-03 19:10


origen


Respuestas:


Sobrecarga operator == no te da operator !=. Tienes que hacerlo manualmente y la forma canónica es implementarlo en términos de operator == como en !(left == right).

La semántica de los operadores no está dictada por el estándar. Podrías sobrecargar mucho operator == para decir igualdad aún sobrecarga operator != a algo diferente como la adición o incluso la igualdad de nuevo (No es que sea una buena práctica, de hecho, debería desalentarse. En caso de duda, haz lo que hacen los ints ...). [Consulte (1) a continuación]

En otros comentarios, Boost.Operators puede ayudarlo a proporcionar implementaciones canónicas para los operadores. También hay std::rel_ops con una implementación canónica para operator !=.

(1) Para saber más sobre esto, lea Tres reglas básicas de sobrecarga del operador en C ++.


76
2017-11-03 19:12



No, nada es gratis Usted paga por lo que usa en C ++ (en caso de sobrecarga del operador).
Solo obtienes el Operador que no sobrecargues nada más.

Además, es una buena práctica que si sobrecarga == operador, entonces debería sobrecargar != también porque los usuarios de su clase esperarán que esté disponible.

Sobrecarga del operador C ++ FAQ debe ser una buena lectura.


Respondiendo la pregunta actualizada:

La pregunta no es si PUEDO sobrecargar a los dos operadores, sino si debo sobrecargar la desigualdad si ya he sobrecargado el operador de igualdad.

NO.
No hay tal requisito que Debe sobrecarga != Si necesitas sobrecargar ==. Sin embargo, es una buena práctica que Debería operadores de sobrecarga relacionado el uno al otro.

¿Por qué es una buena práctica?
Piénselo desde la perspectiva del usuario de su clase. Si el usuario de tu clase puede usar ==(criterios de igualdad) para comparar objetos de su clase, naturalmente, van a esperar que puedan usar !=(Criterios de no igualdad) también, esto se debe al hecho de que estos dos operadores están estrechamente relacionados y son compatibles con todos los tonos incorporados.

¿Qué pasa si ignoras el should y no sobrecargar != cuando sobrecargas ==?
Si los usuarios de tu clase usan != obtendrán un error de compilación.
Ellos fruncirían un poco el ceño al no ser provistos != cuando se les proporciona == y tendrán que realinear su lógica para usar == en vez de !=.

Así que puedes vivir con eso, pero prepárate para esperar algunas ceños fruncidos y quejas de inconviniencia y no proporcionar una interfaz fácil de usar.


17
2017-11-03 19:12



Tienes que sobrecargar a cada operador. ! = y == no están vinculados.


9
2017-11-03 19:12



No, y afortunadamente es así. Por ejemplo, es posible que desee una estructura, donde tanto a! = B como a == a sean verdaderas. No son necesarios al revés, pueden ser lo que quieras.

Aumenta la creatividad :)

Por ejemplo, si no conoce el resultado de una comparación, o generalmente no se conoce, entonces sería razonable a a == b y a! = B devolver lo mismo.

Ejemplo: http://en.wikipedia.org/wiki/Three-valued_logic


1
2017-11-03 19:14