Sobrecarga de operadores lógicos (Programación)

Sobrecarga de operadores lógicos (Programación)
Información sobre la plantilla
Concepto:Se llama sobrecarga de operadores cuando reutilizando el mismo operador con un número de usos diferentes, y el compilador decide como usar ese operador dependiendo sobre qué opera.

Sobrecarga de operadores lógicos (Programación). Los operadores lógicos suelen ser representados por sus nombres en inglés (mayúsculas): AND (&&); OR (||) y NOT (!). Los dos primeros son binarios, mientras que el último es unario, lo que significa que AND y OR aceptan dos argumentos, mientras que la negación NOT, acepta solo uno. Los operandos de las versiones globales de estos operadores son convertidos a un tipo bool, y que el resultado es también un tipo bool de valor cierto/falso (true/false).

Permanencia de las leyes formales

El lenguaje C++ no impone ninguna restricción en la forma que adopte la sobrecarga de un operador. De forma que se puede conseguir que incluso operadores básicos como la suma (+), la asignación (=) o la identidad (==) adquieran para los tipos abstractos un carácter totalmente distinto del que adoptan para los tipos básicos. No obstante, lo normal, lógico, y aconsejable, es mantener la máxima homogeneidad conceptual en el polimorfismo. Es decir, que el efecto básico de los operadores (la imagen mental de su significado) se mantenga, aunque su implementación concreta varíe de una clase a otra. Por ejemplo, las definiciones de suma (+), asignación (=) e identidad (==) para los elementos de una clase C deberían garantizar que después de ejecutada la sentencia c = d; sobre instancias c y d de dicha clase, el resultado de (c == d) fuese true. El resultado de aplicar el constructor-copia para crear un objeto a partir de otro debería producir un nuevo objeto igual que el modelo.

Sobrecarga del operador NOT

El operador NOT de negación lógica ( ! ) está relacionado con su contrario (que no tiene nombre ni representación). Para explicar el significado de esta afirmación, supongamos un objeto c de una clase C. Según hemos señalado, un intento de utilizarlo, por ejemplo, la expresión: if (!c) { /* ... */ } Genera un error de compilación: 'operator!' not implemented in type 'C'..., en el que se indica que el operador NOT de negación lógica no está definido para objetos de la clase. Sin embargo, podemos observar que un intento análogo sin el operador: if (c) { /* ... */ } También produce un error, aunque en este caso la indicación es más ambigüa: Illegal structure operation in function...(Borland) o: conditional expression of type 'class C' is illegal (Visual C++). En este último caso el compilador está indicando que no sabe como convertir la expresión entre paréntesis (c) a un tipo bool. Recuerde que la sentencia if(<condicion>)... espera recibir una expresión <condicion> que se resuelva en un bool.

Sobrecarga de operadores AND y OR

Si se dispone de una conversión de usuario que garantice la conversión de un objeto c de tipo C a tipo bool, entonces no es realmente necesario sobrecargar los operadores AND ni OR para poder utilizarlos. Por ejemplo, suponiendo la definición (§3.2) y los vectores (§3.3) anteriores, las sentencias:

if (p3 && p1) cout << "p3 y p1 Ok.";
else          cout << "p3 y p1 NOT ok.";
if (p3 || p1) cout << "p3 o p1 Ok.";
else          cout << "p3 o p1 NOT Ok.";

Producen las siguientes salidas:

p3 y p1 NOT ok.
p3 o p1 Ok.

Puede Consultar

Fuente