¿Es una mala idea sobrecargar & &, || o el operador de coma y por qué?¿Sobrecarga de operadores lógicos considerados malas prácticas?
Respuesta
No sobrecargaría operator&&
o operator||
. Incluso si define una clase que da lugar a un álgebra de Boole (conjuntos finitos, por ejemplo), probablemente sería una mejor opción sobrecargar operator&
y operator|
.
La razón es que los programadores de C++ esperan semántica especial para operator&&
y operator||
: son cortocircuitado, es decir, no evalúan su argumento de la derecha si no es necesario. No puede obtener este comportamiento por sobrecarga, ya que definirá una función.
Sobrecarga operator,
se ha realizado en p. la biblioteca Boost.Assign. Este es también el único ejemplo de sobrecarga que sé, y nunca he considerado sobrecargarlo yo mismo. Será mejor que tengas un caso de uso muy específico donde ningún otro operador sea adecuado.
buen punto. Entonces, parece que es mejor proporcionar un operador para la conversión a bool en tal caso ('operator bool()')? – davka
@davka: Sí, defina 'operator bool' si su clase tiene una semántica de lógica booleana, que le da un cortocircuito de forma gratuita. Defina 'operator &' y 'operator |' si tiene semántica de álgebra booleana, como lo hacen los conjuntos finitos (donde intersección es '&', unión es '|'). –
@Downvoter: por favor explique. –
Para sobrecargar los operadores lógicos en C++, se deben evaluar los operandos, que no es la manera en que normalmente funcionan las cosas con el cortocircuito de los tipos incorporados.
Mire el siguiente enlace.
Esto no dice una palabra acerca de los operadores en cuestión. – davka
Vaya. Mi error. Lo siento. Yo malinterpreté la pregunta. –
@Todo: Editó la respuesta –
Su mala idea excepto situaciones en sus clases representa una entidad lógica, porque los operadores sobrecargados se desorientan y pueden causar nuevos errores en el código.
Incluso cuando está definiendo "entidades lógicas" (álgebras booleanas), otros operadores son más adecuados. –
Yo diría que depende de lo que estén haciendo las sobrecargas. Por ejemplo, & & y || se espera que funcionen como condiciones lógicas, por lo que si su semántica de sobrecarga funciona de manera diferente, pueden confundir a otras personas (o incluso a usted mismo, si no las usa por un tiempo y olvida lo que hacen). Considere lo que esperaría que hicieran los operadores si no supiera cómo están sobrecargados y si sería más claro simplemente usar métodos normales.
Como han dicho los demás, la falta de evaluación diferida es la principal razón para evitar sobrecargar operadores lógicos.
Sin embargo, hay una muy buena razón para sobrecargarlas: Expression templates. La biblioteca Boost.Lambda hace esto, ¡y es muy útil!
Por lo general, es una mala idea: esos tres operadores tienen un efecto de secuencia que se pierde al sobrecargarlos. Perder ese efecto de secuencia puede causar daño al brazo (es decir, errores extraños) a aquellos que no lo esperan.
Hay casos con expresiones de plantilla donde puede mantener el efecto de secuencia, en esos casos no veo ningún problema en sobrecargarlos.
Las sobrecargas de operator,
que conozco tienen otro problema: funcionan de tal manera que las aparentes cadenas de operación no son reales. Por lo general, se usan en contexto cuando no hace ninguna diferencia, pero una vez en una luna azul, esa es otra fuente de errores extraños.
No debe sobrecargar ningún operador de forma sorprendente.:-)
Si puede hacerlo de una manera que tenga sentido (no solo para usted), está bien hacerlo.
Como otros han dicho, los operadores lógicos son especiales ya que tienen el efecto de evaluación perezosa. Por lo tanto, sus sobrecargas probablemente deberían preservar este efecto diferido, como con las plantillas de expresión, o solo deben usarse donde las personas no esperan este efecto de todos modos.
- 1. Operadores lógicos y lógicos y controles nulos
- 2. Búsqueda SQL con operadores lógicos
- 3. ¿Conmutador de JavaScript con operadores lógicos?
- 4. precedencia de operadores lógicos en C
- 5. Los operadores lógicos en plantillas de cierre
- 6. Sobrecarga de múltiples operadores
- 7. sobrecarga de operadores ->
- 8. sobrecarga de operadores en C#
- 9. Sobrecarga de operadores para enumeraciones
- 10. La sobrecarga de los operadores
- 11. sobrecarga de operadores en C
- 12. Malas prácticas en Ruby on Rails
- 13. Operadores lógicos ("y", "o") en el lote de DOS
- 14. Prioridad de operadores lógicos con NAND, NOR, XNOR
- 15. sobrecarga de operadores << - C++
- 16. sobrecarga de operadores en genéricos Métodos
- 17. Sobrecarga de operadores Plugin para Java
- 18. Operadores de sobrecarga en la clase derivada
- 19. C++ typedefs y la sobrecarga de operadores
- 20. mano corta para encadenar operadores lógicos en javascript?
- 21. sobrecarga << operadores y clases heredadas
- 22. Postres de base de datos: ¿buenas o malas prácticas?
- 23. ¿Por qué las variables globales se consideran malas prácticas?
- 24. Está utilizando el sistema. * Espacios de nombres en sus propias clases considera malas prácticas?
- 25. sobrecarga de operadores de sufijo y el prefijo
- 26. Sobrecarga de operadores de corchetes para aceptar el valor
- 27. La sobrecarga de operadores y espacios de nombres
- 28. ¿Qué operadores lógicos de C++ usa: y, o, no, y los operadores de estilo il o C? ¿por qué?
- 29. sobrecarga de operadores borrar en una clase base
- 30. typedef y la sobrecarga de operadores en C++
esto se siente como una pregunta del examen final;) – defbyte