Guía 7 1
Facultad: Ingeniería
Escuela: Computación
Asignatura: Programación II
Objetivos
Describir como redefinir (sobrecargar) operadores para que funcionen con nuevos tipos de
datos.
Diferenciar sobrecarga de operadores binarios y unarios.
Identificar cuando sobrecargar operadores.
Implementar programas en C++ que sobrecarguen operadores unarios.
Materiales y Equipo
Introducción
Recordemos que los operadores son un tipo de tokens que indican al compilador la realización
de determinadas operaciones sobre variables u otros objetos (los operandos).
Por ejemplo, cuando encontramos una expresión del tipo:
z = x + y; // suponemos que x, y, z son de tipo int (1)
Sabemos que la sentencia contiene dos operadores; el de suma (+) y el de asignación (=); que
estos operadores actúan (operan) sobre objetos de tipo int, y que sus reglas de uso y su
significado (que resultados se obtienen) están perfectamente definidos en el lenguaje.
Los operadores aceptan uno o varios operandos de tipo específico (alguno de los tipos básicos
preconstruidos en el lenguaje), produciendo y/o modificando un valor de acuerdo con ciertas
reglas.
Sin embargo, C++ permite redefinir la mayor parte de ellos. Es decir, permite que puedan
aceptar otro tipo de operandos (distintos de los tipos básicos) y seguir otro comportamiento, al
2 Programación II, Guía 7
tiempo que conservan el sentido y comportamiento originales cuando se usan con los
operandos normales.
Esta posibilidad, que recibe el nombre de sobrecarga del operador, es una consecuencia del
polimorfismo y hace posible que en la expresión:
c = d + e; // suponemos que c, d, e son de tipo UnaClase (2)
Sobrecarga de Operadores.
Es el proceso de asignar dos ó más operaciones al mismo operador.
En otras palabras, permite asignar una o más funciones adicionales a un operador estándar,
con el fin de que ésta sea llamada según el contexto en el cual se utilice el operador.
Un operador sobrecargado no puede tener parámetros predeterminados.
Para sobrecargar un operador, y aplicarlo en operaciones entre clases, se usa la función
especial operador.
Una función operador es una función cuyo nombre consta de la palabra reservada operator
seguida de un operador unitario o binario que se sobrecargará.
Programación II. Guía 7 3
La sintaxis para sobrecargar un operador es la siguiente:
<tipo de dato> <Nombre de clase> operator <#> (lista de parámetros)
{ //instrucciones que forman el cuerpo del operador
}
Donde:
• tipo de dato: indica el tipo de dato que produce el operador sobrecargado, por lo
general es la referencia del objeto.
• Nombre de clase: es el nombre de clase en la que estamos aplicando sobrecarga.
• operator: es una palabra reservada utilizada para realizar la sobrecarga
• #: operador que estamos sobrecargando.
• Lista de parámetros: es la lista de objetos (en referencia) o variables que se
procesarán en la sobrecarga, si la operación es unaria no tendrá parámetros, si la
operación es binaria tendrá un parámetro.
Operadores sobrecargables.
El lenguaje C++ permite redefinir la funcionalidad de los siguientes operadores:
+ - * / % ^ & ~ ! = < > += -= *= /= %= ^= &= |= <<
>> >>= <<= == != <= >= && || ++ -- ->* , -> [] () new new[] delete
delete[]
Los operadores +, -, * y & son sobrecargables en sus dos versiones, unaria y binaria.
Es decir: suma binaria +; más unitario +; multiplicación *; indirección *; referencia & y manejo
de bits &.
Es notable que C++ ofrezca casos de operadores sobrecargados incluso en su Librería
Estándar. Por ejemplo, los operadores == y != para la clase type_info.
Sin embargo, la posibilidad de sobrecarga no se extiende a todos los operadores.
Excepciones:
En la lista anterior, puede verificarse que todos los operadores pueden ser sobrecargados,
incluyendo new, new [ ], delete y delete [ ], excepto los siguientes:
• Selector directo de componente .
• Operador de indirección de puntero a miembro .*
• Operador de acceso a ámbito ::
• Condicional ternario ?:
4 Programación II, Guía 7
• Directivas de preprocesado # y # #
• sizeof: informa del tamaño de almacenamiento utilizado por cualquier objeto, sea un
tipo básico o derivado.
• typeid: identifica un operador con el que puede obtenerse el tipo de objetos y
expresiones en tiempo de ejecución. Permite comprobar si un objeto es de un tipo
particular, y si dos objetos son del mismo tipo.
Nota: recuerde la versión a parece recibir solo un argumento, pero en realidad recibe dos si se
considera el argumento implícito this, de forma que podría considerarse:
x.operator @ (C * this, y) siendo: C * this = &x
Observe que las funciones que se obtienen al sobrecargar los operadores se declaran como
amigas (friend) de la clase en la cual se insertaron. Esto es para que dichas funciones,
externas a la clase, puedan tener acceso a los miembros privados de la misma.
Procedimiento
Ejemplo 1:
En C++, el operador “+” no puede utilizarse para concatenar cadenas.
Sin embargo, si utilizamos una clase propia llamada Cadena, podríamos sobrecargar el
operador “+” para realizar la concatenación de cadenas, como se muestra en el siguiente
ejemplo:
6 Programación II, Guía 7
#include <iostream>
#include <string.h> // Para las funciones de manejo de cadenas: strcpy, strlen y strcat
class Cadena
{ private:
int longitud; // longitud de la cadena
char *ptrCadena; // Puntero a la cadena de caracteres
public:
Cadena (char [ ]= ""); //constructor predeterminado
Cadena (Cadena &); //constructor por copia
~Cadena(); //destructor
int long_cadena (); //devuelve longitud de la cadena
Cadena :: ~Cadena()
{ delete [ ] ptrCadena;
}
longitud += s.longitud;
ptrCadena = new char[longitud+1];
int main()
{ char cad1[20], cad2[20];
system("cls");
cout << "Introducir primer cadena: ";
gets(cad1);
cout << "Introducir segunda cadena: ";
gets(cad2);
cout << *s4 << endl << endl << "Longitud de s4: " << s4 -> long_cadena() << "
caracteres.";
system("pause>nul");
return 0;
}
Ejemplo 2:
En este ejemplo se sobrecargan los operadores aritméticos de la suma y la resta, de tal
manera que puedan operar datos de tipo Vector.
#include <iostream>
class Vector
{ private:
float CoordX; // Coordenada en eje x del vector
float CoordY; // Coordenada en eje y del vector
public:
Vector (float Va1 = 0, float Val2 =0); //constructor predeterminado
~Vector(){ }; //destructor
void ImprimeVector (); //Muestra el vector
/* Método en el cual se sobrecarga el operador "+"; por lo tanto se podrá utilizar para la
suma aritmética, como para suma de
vectores. Lo anterior da como resultado un objeto de tipo Vector */
Vector Vector :: operator + (Vector Vec)
{ return Vector(CoordX + Vec.CoordX, CoordY + Vec.CoordY);
}
/* Método en el cual se sobrecarga el operador "-"; por lo tanto se podrá utilizar para la
resta aritmética, como para resta de
vectores. Lo anterior da como resultado un objeto de tipo Vector */
Vector Vector :: operator - (Vector Vec)
{ return Vector(CoordX - Vec.CoordX, CoordY - Vec.CoordY);
}
int main()
{
system("cls");
Vector Vec1(3,1), Vec2(1,2), Vec3; //Creamos los objetos de tipo Vector
system("pause>nul");
return 0;
}
10 Programación II, Guía 7
Análisis de Resultados
Ejercicio 1:
Modifique el código del ejemplo No. 2, de tal manera que la solución se maneje a través de un
menú que contenga las siguientes opciones:
a) Crear los objetos de tipo vector, solicitando los datos al usuario.
b) Realizar la suma de vectores.
c) Realizar la resta de vectores.
d) Realizar el producto escalar de vectores.
e) Salir de la aplicación.
Ejercicio 2:
Tomar el código del ejemplo No. 1 como referencia y realizar los cambios que sean necesarios
para crear un programa que provea la funcionalidad necesaria para trabajar con cadenas de
caracteres.
La funcionalidad debe implementarse con un menú con las siguientes opciones:
Opción de menú 1: Ingresar las cadenas de caracteres (como mínimo dos).
Opción de menú 2: Concatenar cadenas.
Opción de menú 3: Comparación de cadenas de caracteres. Considerar la sobrecarga de los
operadores ==, <, >, !=
Opción de menú 4: Determinar si una cadena está vacía. Considerar la sobrecarga del
operador “ ! “
Opción de menú 5: Acceder a un carácter individual en una cadena, es decir, realizar una
Opción de menú 6: Determinar la longitud de una cadena.
Opción de menú 7: Salir del programa.
El menú deberá estar siempre activo, en la misma posición en pantalla, hasta que el usuario
seleccione la opción salir.
El programa debe estar debidamente comentado.
public:
Cadena (char []= ""); //constructor predeterminado
Cadena (Cadena &); //constructor por copia
~Cadena(); //destructor
int long_cadena (void); //devuelve longitud de la cadena
EVALUACIÓN
ACTITUD
Del 15% No tiene Actitud Tiene actitud
al 30% actitud propositiva y proactiva y
proactiva. con sus
propuestas no propuestas
aplicables al son
contenido de concretas.
la guía.
TOTAL 100%