1. Conceptos Generales.-
Permite al programador dar nuevos significados a los símbolos de operadores existentes en C++.
En la mayoría de los lenguajes existen formas de sobrecarga de operadores integradas en el propio lenguaje. Así como por ejemplo, en el lenguaje BASIC o en el Pascal el operador + puede ser utilizado para realizar tres operaciones muy diferentes: suma de enteros, suma de números reales y concatenación de cadenas.
C++ difiere de otros lenguajes en que se permite a los programadores sobrecargar a los operadores para tipos de datos abstractos. El resultado puede ser la creación de un cogido más fácil de leer y depurar.
La sobre carga de operadores es una de las características más excitantes de C++ y por ende de la programación orientada a objetos. La sobrecarga permite redefinir el lenguaje C++ y proporciona a los programadores una herramienta que les facilitara manipular los tipos definidos por el usuario y nuevos tipos abstractos de datos.
Tipos de operadores existentes: Operador not (!) es unitario, ya que se requiere un solo argumento; los operadores ++ y -- son también operadores unitarios, ya que incrementan o decrementan el valor del argumento.; Un operador binario es aquel que actúa sobre dos argumentos; por ejemplo, el operador + es un operador binario, ya que suma dos valores.
1.1 ¿Cómo conocer el compilador qué función operador se utiliza?
Las funciones operadores sobrecargadas son elegidas por el compilador utilizando el mismo mecanismo que se utiliza para elegir entre diferentes funciones sobrecargadas. Cuando se encuentra un operador no intrínseco, el compilador busca una función operador que tenga parámetros que se correspondan con los operandos que se encuentran.
1.2 ¿Cuál es la prioridad de las funciones operador?
Las funciones operador tienen la misma prioridad que las operaciones intrínsecas que se utilizan el mismo operador. Por ejemplo el operador *siempre tiene prioridad sobre el operador +. No se puede cambiar la prioridad de los operadores.
1.3 Restricciones en los operadores sobrecargados.
Las restricciones usuales son:
1.- No se puede construir sus propios operadores. Se pueden sobrecargar solo los operadores definidos en C++
2.- La sobrecarga de operadores funciona solo cuando se aplica a objetos de una clase.
3.- No se puede cambiar la precedencia o asociatividad de los operados en C++ (idéntica a las reglas de C ANSI)
4.- No se puede cambiar un operador binario para funcionar con un único objeto.
5.- No se puede cambiar un operador unitario para funcionar con dos objetos.
6.- No se sobrecargar un operador que funcione exclusivamente con punteros.
7.- Para los operadores ++ y -- no pueden distinguir si se aplican de forma prefija o posfija. Por ejemplo, si el operador de incremento (++) esta sobrecargado por las mismas acciones sobre tipos de datos no intrínsecos, la notación
X = y++ ;
Será exactamente la misma cosa que
X = ++y ;
El compilador no puede distinguir entre el uso prefijo y posfijo en operadores sobrecargados, al contrario que sucede con los tipos de datos intrínsecos.
1.4 El mecanismo de sobrecarga de operadores
La clave para la sobrecarga de un operador es una función incorporada a C++ que permite al programador sustituir una función definida por el usuario para uno de los operadores existentes.
1.5 Declaración de funciones operador
Las funciones operador u operadores sobrecargados pueden ser o no miembros de una clase. De este modo, se pueden sobrecargar funciones miembro de una clase, así como funciones amigas.
Una función amiga tiene un argumento para un operador unitario y dos argumentos para un operador binario, mientras que una función miembro tiene cero argumentos para un operador unitario y un argumento para un operador binario.
1.6 Funciones operador amigas
Un ejemplo hipotético de los operadores aritméticos sobrecargados es la declaración de la clase llamada calculo
Class calulo {
Public:
Friend calculo operator +(calculo a, calculo b);
Friend calculo operator - (calculo a, calculo b);
Friend calculo operator *(calculo a, calculo b);
Friend calculo operator /(calculo a, calculo b);
// … otros miembros
} ;
Calulo declara cuatro funciones operador sobrecargadas: operator+, operator-, operator* y operator/. Como las funciones se declaran como amigas, proporcionan acceso a los miembros protegidos y privados. Las funciones devuelven un tipo calculo (pueden devolver otro tipo). Para llamar a las funciones hay que enviarle dos parámetros: a y b.
2. Sobrecarga de operadores unitarios
Son aquellos que actúan sobre un único operando.
Un operador unitario se puede definir bien como un amigo o un argumento, o bien como una función de miembro sin argumento, que es el caso más frecuente pero nunca las dos a la vez.
2.1 Versiones prefija y posfija de los operadores ++ y --
En las declaraciones y definiciones de operator ++() y operator --(), el compilador distingue entre las versiones prefija y posfija de esos operadores, llamando a las funciones operador sin argumento o con un argumento “int”, respectivamente. La versión prefija del operador de incremento se sobrecarga mediante una función que no es miembro, definiendo una versión de ++ con un parámetro; la versión posfija se sobrecarga, sin embargo, definiendo una versión de ++ con dos parámetros, siendo el segundo argumento de tipo “int”.
Cuando los operadores ++ y -- se sobrecargan como miembros de una clase, las versiones prefijas no tienen ningún parámetro explicito, mientras que las versiones posfijas tienen un parámetro explicito (de tipo “int”)
La única diferencia entre las dos definiciones es el parámetro de tipo “int” de la versión posfija”.
3. Sobrecarga de operadores binarios
Los operadores binarios pueden ser sobrecargados tan fácilmente como los operadores unitarios. Se pueden sobrecargar pasando a la función dos argumentos. El primer argumento es el operando izquierdo del operador sobrecargado y el segundo argumento es el operando derecho, si la función no es miembro de clase.
Un operador binario puede, por consiguiente, ser definido:
• Bien como una función de dos argumentos
• Bien como una función miembro de un argumento, y es el caso más frecuente
• Pero nunca los dos a la vez.
[ Read More ]
Permite al programador dar nuevos significados a los símbolos de operadores existentes en C++.
En la mayoría de los lenguajes existen formas de sobrecarga de operadores integradas en el propio lenguaje. Así como por ejemplo, en el lenguaje BASIC o en el Pascal el operador + puede ser utilizado para realizar tres operaciones muy diferentes: suma de enteros, suma de números reales y concatenación de cadenas.
C++ difiere de otros lenguajes en que se permite a los programadores sobrecargar a los operadores para tipos de datos abstractos. El resultado puede ser la creación de un cogido más fácil de leer y depurar.
La sobre carga de operadores es una de las características más excitantes de C++ y por ende de la programación orientada a objetos. La sobrecarga permite redefinir el lenguaje C++ y proporciona a los programadores una herramienta que les facilitara manipular los tipos definidos por el usuario y nuevos tipos abstractos de datos.
Tipos de operadores existentes: Operador not (!) es unitario, ya que se requiere un solo argumento; los operadores ++ y -- son también operadores unitarios, ya que incrementan o decrementan el valor del argumento.; Un operador binario es aquel que actúa sobre dos argumentos; por ejemplo, el operador + es un operador binario, ya que suma dos valores.
1.1 ¿Cómo conocer el compilador qué función operador se utiliza?
Las funciones operadores sobrecargadas son elegidas por el compilador utilizando el mismo mecanismo que se utiliza para elegir entre diferentes funciones sobrecargadas. Cuando se encuentra un operador no intrínseco, el compilador busca una función operador que tenga parámetros que se correspondan con los operandos que se encuentran.
1.2 ¿Cuál es la prioridad de las funciones operador?
Las funciones operador tienen la misma prioridad que las operaciones intrínsecas que se utilizan el mismo operador. Por ejemplo el operador *siempre tiene prioridad sobre el operador +. No se puede cambiar la prioridad de los operadores.
1.3 Restricciones en los operadores sobrecargados.
Las restricciones usuales son:
1.- No se puede construir sus propios operadores. Se pueden sobrecargar solo los operadores definidos en C++
2.- La sobrecarga de operadores funciona solo cuando se aplica a objetos de una clase.
3.- No se puede cambiar la precedencia o asociatividad de los operados en C++ (idéntica a las reglas de C ANSI)
4.- No se puede cambiar un operador binario para funcionar con un único objeto.
5.- No se puede cambiar un operador unitario para funcionar con dos objetos.
6.- No se sobrecargar un operador que funcione exclusivamente con punteros.
7.- Para los operadores ++ y -- no pueden distinguir si se aplican de forma prefija o posfija. Por ejemplo, si el operador de incremento (++) esta sobrecargado por las mismas acciones sobre tipos de datos no intrínsecos, la notación
X = y++ ;
Será exactamente la misma cosa que
X = ++y ;
El compilador no puede distinguir entre el uso prefijo y posfijo en operadores sobrecargados, al contrario que sucede con los tipos de datos intrínsecos.
1.4 El mecanismo de sobrecarga de operadores
La clave para la sobrecarga de un operador es una función incorporada a C++ que permite al programador sustituir una función definida por el usuario para uno de los operadores existentes.
1.5 Declaración de funciones operador
Las funciones operador u operadores sobrecargados pueden ser o no miembros de una clase. De este modo, se pueden sobrecargar funciones miembro de una clase, así como funciones amigas.
Una función amiga tiene un argumento para un operador unitario y dos argumentos para un operador binario, mientras que una función miembro tiene cero argumentos para un operador unitario y un argumento para un operador binario.
1.6 Funciones operador amigas
Un ejemplo hipotético de los operadores aritméticos sobrecargados es la declaración de la clase llamada calculo
Class calulo {
Public:
Friend calculo operator +(calculo a, calculo b);
Friend calculo operator - (calculo a, calculo b);
Friend calculo operator *(calculo a, calculo b);
Friend calculo operator /(calculo a, calculo b);
// … otros miembros
} ;
Calulo declara cuatro funciones operador sobrecargadas: operator+, operator-, operator* y operator/. Como las funciones se declaran como amigas, proporcionan acceso a los miembros protegidos y privados. Las funciones devuelven un tipo calculo (pueden devolver otro tipo). Para llamar a las funciones hay que enviarle dos parámetros: a y b.
2. Sobrecarga de operadores unitarios
Son aquellos que actúan sobre un único operando.
Un operador unitario se puede definir bien como un amigo o un argumento, o bien como una función de miembro sin argumento, que es el caso más frecuente pero nunca las dos a la vez.
2.1 Versiones prefija y posfija de los operadores ++ y --
En las declaraciones y definiciones de operator ++() y operator --(), el compilador distingue entre las versiones prefija y posfija de esos operadores, llamando a las funciones operador sin argumento o con un argumento “int”, respectivamente. La versión prefija del operador de incremento se sobrecarga mediante una función que no es miembro, definiendo una versión de ++ con un parámetro; la versión posfija se sobrecarga, sin embargo, definiendo una versión de ++ con dos parámetros, siendo el segundo argumento de tipo “int”.
Cuando los operadores ++ y -- se sobrecargan como miembros de una clase, las versiones prefijas no tienen ningún parámetro explicito, mientras que las versiones posfijas tienen un parámetro explicito (de tipo “int”)
La única diferencia entre las dos definiciones es el parámetro de tipo “int” de la versión posfija”.
3. Sobrecarga de operadores binarios
Los operadores binarios pueden ser sobrecargados tan fácilmente como los operadores unitarios. Se pueden sobrecargar pasando a la función dos argumentos. El primer argumento es el operando izquierdo del operador sobrecargado y el segundo argumento es el operando derecho, si la función no es miembro de clase.
Un operador binario puede, por consiguiente, ser definido:
• Bien como una función de dos argumentos
• Bien como una función miembro de un argumento, y es el caso más frecuente
• Pero nunca los dos a la vez.