12: Sobrecarga de operadores

Tabla de contenidos

12.1. Precaución y tranquilidad
12.2. Sintaxis
12.3. Operadores sobrecargables
12.4. Operadores no miembros
12.5. Sobrecargar la asignación
12.6. Conversión automática de tipos
12.7. Resumen
12.8. Ejercicios

La sobrecarga de operadores es solamente «azúcar sintáctico», lo que significa que es simplemente otra manera de invocar funciones.

La diferencia es que los argumentos para estas funciones no aparecen entre paréntesis, sino que rodean o siguen a los caracteres que siempre pensó como operadores inalterables.

Hay dos diferencias entre el uso de un operador y el de una llamada a función normal. La sintaxis es diferente: un operador es a menudo «llamado» situándolo entre (o después de) los argumentos. La segunda diferencia es que el compilador determina qué «función» llamar. Por ejemplo, si está usando el operador + con argumentos de punto flotante, el compilador «llama» a la función para realizar una suma de punto flotante (esta «llamada» normalmente consiste en insertar código en linea, o una instrucción de punto flotante del procesador). Si usa el operador + con un número de punto flotante y un entero, el compilador «llama» a una función especial para convertir el int a un float,y entonces «llama» a la función de suma en punto flotante.

Sin embargo, en C++ es posible definir nuevos operadores que trabajen con clases. Esta definición es exactamente como la definición de una función ordinaria, excepto que el nombre de la función consiste en la palabra reservada operator seguida del operador. Siendo esta la única diferencia, el operador se convierte en una función como otra cualquiera que el compilador llama cuando ve el prototipo adecuado.

12.1. Precaución y tranquilidad

Es tentador convertirse en un super-entusiasta de la sobrecarga de operadores. Son un juguete divertido, al principio. Pero recuerde que es sólo un endulzamiento sintáctico, otra manera de llamar a una función. Mirándolo desde esa perspectiva, no hay razón para sobrecargar un operador excepto si eso hace al código implicado con la clase más sencillo e intuitivo de escribir y especialmente de leer. (Recuerde, el código se lee mucho más que se escribe). Si éste no es el caso no se moleste.

Otra reacción cmún frente al uso de la sobrecarga de operadores es el pánico: de repente, los operadores de C pierden su significado familiar.«¡Todo ha cambiado y mi código C por completo hará cosas diferentes!». Esto no es verdad. Todos los operadores usados en expresiones que contienen solo tipos de datos incorporados no pueden ser cambiados. Nunca podrá sobrecargar operadores así:

1 << 4;

para que se comporten de forman diferente, o que

1.414 << 2;

tenga significado. Sólo una expresión que contenga tipos de datos definidos por el usuario podrá tener operadores sobrecargados.