Está en la página 1de 15

Universidad Nacional Mayor de San Marcos

Universidad del Per, Decana de Amrica


Facultad de Ciencias Matemticas
E.P. Matemtica

CURSO: PROGRAMACION DE
COMPUTADORAS II

Prof. Luis Vicente Bazalar Guerrero


Introduccin

Se vio anteriormente que se obtuvieron servicios de objetos mediante el envo


de mensajes (en forma de llamadas a funciones miembro) a los objetos. Esta
notacin de llamadas a funciones es incmoda para ciertos tipos de clases
(como las clases matemticas). Adems, muchas manipulaciones comunes se
llevan a cabo con los operadores ( por ejemplo, entrada y salida).

Podemos usar el extenso conjunto de operadores integrados de C++ para


especificar las manipulaciones de objetos comunes. Veremos a continuacin
cmo permitir que los operadores de C++ trabajen con objetos; a este proceso se
le conoce como sobrecarga de operadores.

Es un proceso simple y natural extender a C++ con estas nuevas herramientas,


pero debe hacerse con cuidado.
Introduccin

Un ejemplo de un operador sobrecargado integrado en C++ es <<, el cual se usa


como operador de insercin de flujo y como operador de desplazamiento a la
izquierda a nivel de bits. De manera similar, >> tambin est sobrecargado; se
utiliza como operador de extraccin de flujo y como operador de
desplazamiento a la derecha a nivel de bits.

Ambos operadores estn sobrecargados en la Biblioteca estndar de C++.

Aunque la sobrecarga de operadores suena como una herramienta extica, la


mayora de los programadores utilizan operadores sobrecargados de manera
implcita con frecuencia. Por ejemplo, el mismo lenguaje C++ sobrecarga los
operadores de suma (+) y de resta (). Estos operadores tienen un desempeo
distinto, dependiendo de su contexto en la aritmtica de enteros, de punto
flotante y de apuntadores.
Introduccin

C++ nos permite sobrecargar la mayora de los operadores, para que sean
sensibles al contexto en el que se utilizan; el compilador genera el cdigo
apropiado con base en el contexto.

Algunos operadores se sobrecargan con frecuencia, en especial los operadores


de asignacin, relacionales y varios operadores aritmticos como + y . Los
trabajos que desempean los operadores sobrecargados tambin se pueden
llevar a cabo mediante llamadas explcitas a funciones, pero la notacin de los
operadores es comnmente ms clara y familiar para los programadores.

Figura 1.
Fundamentos de la sobrecarga de
operadores
La programacin en C++ es un proceso sensible y enfocado a los tipos. Los
programadores pueden usar los tipos fundamentales y definir nuevos tipos. Los
tipos fundamentales se pueden utilizar con la extensa coleccin de operadores
de C++.

Los operadores proporcionan a los programadores una notacin concisa para


expresar manipulaciones de datos de tipos fundamentales.

Los programadores pueden usar operadores con tipos definidos por el usuario
tambin. Aunque C++ no permite crear nuevos operadores, s permite
sobrecargar la mayora de los operadores existentes para que, cuando stos se
utilicen con objetos, tengan un significado apropiado. sa es una poderosa
herramienta.
Fundamentos de la sobrecarga de
operadores
Para sobrecargar un operador, se escribe la definicin de una funcin miembro
no static o la definicin de una funcin global como se hace normalmente,
excepto que el nombre de la funcin se convierte ahora en la palabra clave
operator, seguida del smbolo del operador que se va a sobrecargar.

Por ejemplo, el nombre de funcin operator+ se utilizara para sobrecargar el


operador de suma (+). Cuando los operadores se sobrecargan como funciones
miembro, deben ser no static, debido a que se deben llamar en un objeto de la
clase y deben operar en ese objeto.

Para usar un operador en objetos de clases, ste debe sobrecargarse; hay tres
excepciones a esto. El operador de asignacin (=) se puede usar con cualquier
clase para realizar la asignacin a nivel de bits de los miembros de datos de la
clase; cada miembro de datos se asigna del objeto origen al objeto destino de
la asignacin.
Fundamentos de la sobrecarga de
operadores
Los operadores direccin (&) y coma (,) tambin pueden usarse con objetos de
cualquier clase sin sobrecargarse. El operador direccin devuelve la direccin
del objeto en memoria. El operador coma evala la expresin a su izquierda, y
despus la expresin a su derecha. Ambos operadores tambin se pueden
sobrecargar.

La sobrecarga es en especial apropiada para las clases matemticas. A menudo,


estas clases requieren que se sobrecargue un conjunto sustancial de operadores
para asegurar la consistencia con la forma en que se manejan estas clases
matemticas en el mundo real.

La sobrecarga de operadores proporciona las mismas expresiones concisas y


familiares para los tipos definidos por el usuario que C++ proporciona con su
vasta coleccin de operadores para los tipos fundamentales. La sobrecarga de
operadores no es automtica; el programador debe escribir funciones de
sobrecarga de operadores para realizar las operaciones deseadas.
Restricciones acerca de la sobrecarga de
operadores
La mayora de los operadores de C++ se pueden sobrecargar. stos se muestran
en la figura 2 y en la figura 3 se muestran los operadores que no se pueden
sobrecargar.

Figura 2.
Restricciones acerca de la sobrecarga de
operadores
La mayora de los operadores de C++ se pueden sobrecargar. stos se muestran
en la figura 2 y en la figura 3 se muestran los operadores que no se pueden
sobrecargar.

Figura 3.

Precedencia, asociatividad y nmero de operandos


La precedencia de un operador no se puede cambiar mediante la sobrecarga.
Sin embargo, se pueden utilizar parntesis para forzar el orden de evaluacin de
los operadores sobrecargados en una expresin.

La asociatividad de un operador (es decir, si el operador se aplica de derecha a


izquierda o de izquierda a derecha) no se puede cambiar mediante la
sobrecarga.
Las funciones de operadores como clase
miembro vs. funciones globales
Las funciones de operadores pueden ser funciones miembro o funciones
globales; por lo general, las funciones globales se hacen friend por cuestiones de
rendimiento. Las funciones miembro utilizan el apuntador this de manera
implcita para obtener uno de los argumentos de los objetos de su clase (el
operando izquierdo para operadores binarios).

Los argumentos para ambos operandos de un operador binario deben listarse


de manera explcita en la llamada a una funcin global.

Operadores que deben sobrecargarse como funciones miembro


Al sobrecargar (), [ ], > o cualquiera de los operadores de asignacin, la
funcin de sobrecarga de operadores debe declararse como una clase miembro.

Para los otros operadores, las funciones de sobrecarga de operadores pueden ser
clases miembro o funciones globales.
Las funciones de operadores como clase
miembro vs. funciones globales
Operadores como funciones miembro y funciones globales
Ya sea que una funcin de operador se implemente como funcin miembro o
como funcin global, el operador se sigue utilizando de la misma forma en las
expresiones. Entonces, cul implementacin es mejor? Cuando una funcin de
operador se implementa como funcin miembro, el operando de ms a la
izquierda (o el nico) debe ser un objeto de la clase del operador.

Si el operando izquierdo debe ser un objeto de una clase distinta o de un tipo


fundamental, esta funcin de operador se debe implementar como una funcin
global. Una funcin de operador global puede convertirse en friend de una
clase, si esa funcin debe aceptar directamente miembros private o protected
de esa clase.

Las funciones miembro de operador de una clase especfica se llaman (de


manera implcita por el compilador) slo cuando el operando izquierdo de un
operador binario es especficamente un objeto de esa clase, o cuando el nico
operando de un operador unario es un objeto de esa clase.
Las funciones de operadores como clase
miembro vs. funciones globales
Por qu los operadores de insercin de flujo y de extraccin de flujo
sobrecargados se sobrecargan como funciones globales
El operador de insercin de flujo (<<) sobrecargado se utiliza en una expresin
en la que el operando izquierdo tiene el tipo ostream &, como en cout <<
objetoClase.

Para usar el operador de esta manera en donde el operando derecho es un


objeto de una clase definida por el usuario, debe sobrecargarse como una
funcin global.

Para ser una funcin miembro, el operador << tendra que ser una clase
miembro ostream.

Esto no es posible para las clases definidas por el usuario, ya que no se nos
permite modifi car las clases de la Biblioteca estndar de C++.
Las funciones de operadores como clase
miembro vs. funciones globales
Por qu los operadores de insercin de flujo y de extraccin de flujo
sobrecargados se sobrecargan como funciones globales
De manera similar, el operador de extraccin de flujo sobrecargado (>>) se
utiliza en una expresin en la que el operando izquierdo tiene el tipo istream &,
como en cin >> objetoClase, y el operando derecho es un objeto de una clase
definida por el usuario, por lo que tambin debe ser una funcin global.

Adems, cada una de estas funciones de operador sobrecargadas pueden


requerir acceso a los miembros de datos private del objeto de la clase que se va a
enviar o recibir, por lo que estas funciones de operador sobrecargadas se pueden
convertir en funciones friend de la clase, por cuestiones de rendimiento.

Es posible sobrecargar un operador como una funcin no friend global, pero


dicha funcin que requiera acceso a los datos private o protected de una clase
tendra que usar las funciones set o get que se proporcionen en la interfaz
public de esa clase. La sobrecarga de llamar a estas funciones podra provocar
un rendimiento pobre, por lo que estas funciones se pueden poner en lnea para
mejorar el rendimiento.
Las funciones de operadores como clase
miembro vs. funciones globales
Operadores conmutativos
Otra razn por la que podramos elegir una funcin global para sobrecargar un
operador sera para permitir que el operador fuera conmutativo.

Por ejemplo, suponga que tenemos un objeto llamado nmero de tipo long int,
y un objeto llamado enteroGrande1 de la clase EnteroEnorme.

El operador de suma (+) produce un objeto EnteroEnorme temporal como la


suma de un EnteroEnorme y un long int, o como la suma de un long int y un
EnteroEnorme.
Las funciones de operadores como clase
miembro vs. funciones globales
Operadores conmutativos
Por ende, requerimos que el operador de suma sea conmutativo. El problema es
que el objeto de la clase debe aparecer del lado izquierdo del operador de suma,
si ese operador se va a sobrecargar como funcin miembro.

Por lo tanto, sobrecargamos el operador como una funcin global para permitir
que el EnteroEnorme aparezca del lado derecho de la suma.

La funcin operator+, que lidia con el EnteroEnorme a la izquierda, puede


seguir siendo una funcin miembro. La funcin global simplemente
intercambia sus argumentos y llama a la funcin miembro.