You are on page 1of 25

Universidad Nacional de Ingeniera

Programa de Iniciacin Tecnolgica (PIT)


CTIC
Curso: Lenguaje C++

Prof.: Lic. Csar Martn Cruz Salazar


Introduccin
En C++ podemos definir varias funciones con el mismo nombre,
con la nica condicin de que el nmero y/o el tipo de los
parmetros sean distintos. El compilador decide cual de las
versiones de la funcin usar despus de analizar el nmero y el
tipo de los parmetros. Si ninguna de las funciones se adapta a los
parmetros indicados, se aplicarn las reglas implcitas de
conversin de tipos.
Nota: Esta propiedad slo existe en C++, no en C.

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 1


Ejemplo de sobrecarga de Funciones
Ejemplo1:
Hacer un programa que calcule el mayor de dos nmeros si son
enteros, reales y caracteres.

#include <iostream>
using namespace std;
int mayor(int a, int b);
char mayor(char a, char b);
double mayor(double a, double b);
int main() {
cout << mayor('a', 'f') << endl;

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 2


Ejemplo de sobrecarga de Funciones
cout << mayor(15, 35) << endl;
cout << mayor(10.254, 12.452) << endl;
return 0;
}
int mayor(int a, int b) {
if(a > b) return a; else return b;
}
char mayor(char a, char b) {
if(a > b) return a; else return b;
}

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 3


Ejemplo de sobrecarga de Funciones
double mayor(double a, double b) {
if(a > b) return a; else return b;
}

Ejemplo2:
Hacer un programa que encuentre cual es el mayor entre varios
nmeros.

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 4


Ejemplo de sobrecarga de Funciones
#include <iostream>
using namespace std;
int mayor(int a, int b);
int mayor(int a, int b, int c);
int mayor(int a, int b, int c, int d);
int main() {
cout << mayor(10, 4) << endl;
cout << mayor(15, 35, 23) << endl;
cout << mayor(10, 12, 12, 18) << endl;
cin.get();
return 0;
}

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 5


Ejemplo de sobrecarga de Funciones
int mayor(int a, int b) {
if(a > b) return a; else return b;
}
int mayor(int a, int b, int c) {
return mayor(mayor(a, b), c);
}
int mayor(int a, int b, int c, int d) {
return mayor(mayor(a, b), mayor(c, d));
}
El primer ejemplo ilustra el uso de sobrecarga de funciones para
operar con objetos de distinto tipo. El segundo muestra cmo se
puede sobrecargar una funcin para operar con distinto nmero
de objetos.
Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 6
Sobrecarga de Operadores
Anlogamente a las funciones sobrecargadas, los operadores
tambin pueden sobrecargarse.
En realidad la mayora de los operadores en C++ estn
sobrecargados. Por ejemplo el operador + realiza distintas
acciones cuando los operandos son enteros, o de coma flotante.
En otros casos esto es ms evidente, por ejemplo el operador *
se puede usar como operador de multiplicacin o como operador
de indireccin.
C++ permite al programador sobrecargar a su vez los operadores
para sus propios usos.
Sintaxis:
Prototipo:
<tipo> operator <operador> (<argumentos>);
Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 7
Sobrecarga de Operadores
Definicin:
<tipo> operator <operador> (<argumentos>)
{
<sentencias>;
}

Tambin existen algunas limitaciones para la sobrecarga de


operadores:
Se pueden sobrecargar todos los operadores excepto ".", ".*", "::"
y "?:".

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 8


Sobrecarga de Operadores
Los operadores "=", "[]", "->", "()", "new" y "delete", slo pueden
ser sobrecargados cuando se definen como miembros de una
clase.
Los argumentos deben ser tipos enumerados o estructurados:
struct, union o class.

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 9


Sobrecarga de Operadores
Ejemplo:
Realizar sobrecarga de operadores para suma de 2 nmeros
complejos.
#include <iostream>
using namespace std;
struct complejo {
float a,b;
};
/* Prototipo del operador + para complejos */
complejo operator +(complejo a, complejo b);
int main() {
complejo x = {10,32};
complejo y = {21,12};
complejo z;
Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 10
Sobrecarga de Operadores
/* Uso del operador sobrecargado + con complejos */
z = x + y;
cout << z.a << "," << z.b << endl;
cin.get();
return 0;
}
/* Definicin del operador + para complejos */
complejo operator +(complejo a, complejo b) {
complejo temp = {a.a+b.a, a.b+b.b};
return temp;
}

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 11


Sobrecarga interna y sobrecarga
externa
Casi todos los operadores son sobrecargables.
La sobrecarga de operadores puede ser realizado:
Sea al exterior:
Complejo operator+(Complejo, Complejo)
Sea al interior
Class Complejo{
Public:
Complejo operator+(Complejo)
}
de la clase a la cual ellos se aplican.
Los operadores externos son funciones; los operadores internos
son mtodos.
Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 12
Sobrecarga interna de Operadores
Para sobrecargar un operador Op en una clase NomClasse, es
necesario aadir el mtodo operatorOp en la clase en cuestin :
class NomClase {
...
// prototipo del operador Op
tipo_retorno operatorOp(tipo_parametro);
...
};
// definicin del operador Op
tipo_retorno NomClase::operatorOp(tipo_parametro)
{
...
}
Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 13
Sobrecarga de operadores externa
Ejemplo:
Sobrecarga del operador + para que sume nmeros complejos.

Complejo z1;
Complejo z2;
Complejo z3;
// ...
z3 = z1 + z2;

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 14


Sobrecarga de operadores externa

Forma bsica :
Complejo operator+(Complejo z1, Complejo z2);
Forma optimizada :
const Complejo operator+(Complejo const& z1, Complejo
const& z2);
Forma avanzada y C++11 :
const Complejo operator+(Complejo z1, Complejo
const& z2);

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 14


Sobrecarga de Operadores
Ejercicio:
Con sobrecarga del operador + en forma externa y usando una
clase complejo, calcule la suma de dos nmeros complejos.
#include <iostream>
using namespace std;
class Complejo {
public:
Complejo(double abscisa, double ordenada)
: x(abscisa), y(ordenada) {}
Complejo()
: x(0), y(0) {}
// ...
double get_x() const
{ return x;}
Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 16
Sobrecarga de Operadores
double get_y() const
{ return y;}
// ...
private:
double x;
double y;
};
const Complejo operator+(Complejo z1, Complejo const& z2)
{
Complejo z3( z1.get_x() + z2.get_x(),
z1.get_y() + z2.get_y() );
return z3;
}
1
ccs
Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 17
Sobrecarga de Operadores
int main() {
Complejo z1(10,32);
Complejo z2(21,12);
Complejo z3;
/* Uso del operador sobrecargado + con complejos */
z3 = z1 + z2;
cout << z3.get_x() << "," << z3.get_y() << endl;
return 0;
}

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 18


Sobrecarga de Operadores Externo
Ejercicio 1:
Utilizar la sobrecarga externa(fuera de la clase) del operador << para
mostrar en pantalla la suma de nmeros complejos en el siguiente
formato:
Resultado de suma de complejos: (31,44)

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 19


Sobrecarga Externa/friend
A veces, puede ser necesario permitir el acceso a los operadores
externos a algunos elementos privados de la clase.
(Pero preferira que acceda por la funcin correspondiente de
acceso.)
En este caso, agregar, en la definicin de la clase, al prototipo
precedido por la palabra reservada: friend
friend const Complejo operator+(Complejo, Complejo);
La palabra reservada friend significa que estas funciones, aunque
no forman parte de la clase, pueden acceder a los atributos y
mtodos privados.

Nota: las definiciones restan fuera de la clase (y sin la palabra


clave friend)
Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 20
Sobrecarga Externa/friend
Ejercicio:
Con sobrecarga del operador externo +, usando una clase
complejo y la palabra reservada friend calcule la suma de dos
nmeros complejos.
#include <iostream>
using namespace std;
class Complejo {
public:
Complejo(double abscisa, double ordenada)
: x(abscisa), y(ordenada) {}
Complejo()
: x(0), y(0) {}
friend const Complejo operator+(Complejo, Complejo);
// ...
Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 21
Sobrecarga Externa/friend
double get_x() const
{ return x;}
double get_y() const
{ return y;}
private:
double x;
double y;
};
const Complejo operator+(Complejo z1, Complejo z2)
{
Complejo z3( z1.x + z2.x, z1.y + z2.y );
return z3;
}

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 22


Sobrecarga Externa/friend
int main() {
Complejo z1(10,32);
Complejo z2(21,12);
Complejo z3;
/* Uso del operador sobrecargado + con complejos */
z3 = z1 + z2;
cout <<"Resultado de suma de complejos :"<< z3.get_x() << "," <<
z3.get_y() << endl;
return 0;
}

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 23


Sobrecarga Externa/friend
Ejercicio 2:
Utilizar la sobrecarga externa(fuera de la clase) del operador << y
friend para mostrar en pantalla la suma de nmeros complejos en el
siguiente formato:
Resultado de suma de complejos: (31,44)

Lic. Martn Cruz Salazar Lenguaje C++ - CTIC 24

You might also like