Entendido.

Este sitio utiliza cookies para analizar la navegación.Si continúa navegando se entiende que acepta su uso. Ver más detalles.

Logo

Aprende Web C++

Aprende a programar en C++ con Aprende-Web

Nociones Básicas

programación en C++ desde cero.


Buscar en Aprende Web

Traducir página

Visita nuestro blog:

bolg.aprende-web.net

y entérate de las novedades o deja un comentario.

Dudas y sugerencias:

aprendeweb@aprende-web.net



Sobre ésta página

Ültima modificación: 13-07-2018.

Visitas este mes: 1

Visitas el mes pasado:

logo
WEB-GRAFÍA

Mi agradecimiento a los siguientes sitios en los que me he basado para la elaboración de los manuales.:

cplusplus.com
Sitio oficial de C++: Informacion, Referencias, Tutorial, Foro. (En inglés)
Minidosis.org
Curso de C++ con videos y lecturas.
conclase.net
Curso de C++
programar ya
Curso de C++ desde cero
cprogramming.com
C++ Tutorial (inglés).
Entorno de desarrollo integrado
fergarciac.wordpress.com
Compiladores, intérpretes y Máquinas virtuales.
latecladeescape.com
el hacker.net
Programación
Desarrollo web
Manual de iniciación a la programación.

En los distintos manuales incluimosm más webgrafía especifica de cada sección.


Donativos

Si este sitio te parece interesante puedes contribuir con una pequeña aportación.





5. Funciones

5.5. Sobrecarga

Definición

Logo C++ Basico

Se llama sobrecarga al hecho de poder tener varios elementos con el mismo nombre. Esto puede ocurrir con las funciones en algunos casos.

Aunque por norma general el lenguje C++ no admite dos elementos con el mismo nombre, hay casos en los que esto no es así, y puede ser útil tener varios elementos con el mismo nombre.

Uno de estos casos es el de las funciones. Dos funciones pueden tener el mismo nombre si tienen parámetros diferentes, ya sea porque tienen parámetros de distintos tipos o porque tienen un número diferente de parámetros.


Sobrecarga con diferente número de parámetros

Puede haber sobrecarga de funciones si éstas tienen distinto número de parámetros, veamos el siguiente ejemplo:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
#include<iostream>
using namespace std;

int suma (int a, int b);
int suma (int a, int b, int c);
int suma (int a, int b, int c, int d);

int main() {
    int n1=1, n2=2, n3=3, n4=4;
    cout << "Tenemos estos numeros : ";
    cout << n1 << " , " << n2 << " , " << n3 << " , " << n4 << endl;
    cout << "Suma de los dos primeros : " << suma(n1,n2) << endl;
    cout << "Suma de los tres primeros : " << suma(n1,n2,n3) << endl;
    cout << "Suma de todos : " << suma(n1,n2,n3,n4) <<endl;
}

int suma(int a, int b){
    return a+b;
}
int suma(int a, int b, int c){
    return a+b+c;
}
int suma(int a, int b, int c, int d){
    return a+b+c+d;
}
ejemplo1

En este ejemplo tenemos tres funciones con el mismo nombre, pero cada una de ellas tiene distinto número de prámetros. Para cada función tenemos su declaración y su definición, como si fueran funciones independientes.

Al llamar a la función, el compilador distingue el número de argumentos que le hemos pasado, de manera que elige una u otra en función del número de parámetros que le pasamos.


Sobrecarga con parámetros de diferente tipo

También puede haber sobrecarga de funciones si éstas tienen parámetros de distinto tipo. El siguiente programa calcula el mayor de dos elementos para distintos tipos de valores :

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
#include<iostream>
using namespace std;

int mayor(int a, int b);
double mayor(double x, double y);
char mayor(char r, char s);
string mayor(string f, string g);

int main() {
    cout << "Mayor entre 10 y 12 : " << mayor(10,12) << endl;
    cout << "Mayor entre 13.12 y 17.73 : " << mayor ( 13.12, 17.73) << endl;
    cout << "Mayor entre a y e : " << mayor ('a', 'e') << endl;
    cout << "Mayor entre Carlos y Enrique : " << mayor ("Carlos", "Enrique") << endl;
}

int mayor(int a, int b) {
   if (a>b) return a;
   else return b;
}
double mayor (double x, double y) {
    if (x>y) return x;
    else return y;
}
char mayor(char r, char s) {
   if (r>s) return r;
   else return s;
}
string mayor(string f, string g) {
    if (f>g) return f;
    else return g;
}
ejemplo1

En este ejemplo tenemos cuatro funciones que realizan tareas similares, pero cada una de ellas con un tipo diferente de valores.

Al llamar a la función el compilador examina qué tipo de valor le estamos pasando en los parámetros, y éste eligirá la función que tenga el tipo de valor pasado.

Aunque aquí las cuatro funciones que hemos puesto hacen prácticamente lo mismo, podríamos hacer que cada una de ellas realizara una acción distinta, de manera que según los tipos de valores que pasemos, se realizará una acción u otra.


Plantillas

Volvamos al último ejemplo que hemos hecho. En este ejemplo tenemos cuatro funciones en las que cada una de ellas realiza la misma acción pero con diferentes tipos de valores. Si nos fijamos en las cuatro funciones, son prácticamente iguales, sólo cambia el tipo de valor y el nombre que le damos a las variables.

Veamos si podemos hacer que en lugar de utilizar cuatro funciones que son prácticamente iguales, podemos usar sólo una, pero que distinga el tipo de valor aplicado.

Para ello crearemos una plantilla o template (plantilla en inglés), que indica una nuevo tipo de valor. para ello delante de la declaración y de la definición de la función, antes de la declaración escribiremos:

template <class T>

Escribimos la palabra template para crear una nueva plantilla, y luego entre los signos mas-menos, ewscribimos la palabra class seguida del nombre que le damos a la plantilla, aquí la llamamos T.

A continuación escribimos la declaración, pero ahora como tipo de valor pondremos el nombre de la plantilla:

T mayor (T a, T b);

Escribimos después la definición. Esta irá detrás de la función principal o main, y llevará también la línea que indica la plantilla y el tipo definido en la plantilla. En nuestro ejemplo lo escribiremos así:

template <class T> T mayor(T a, T b) { if (a>b) return a; else return b; }

Por último, al llamar a la función debemos indicar el tipo de parámetros que estamos pasando. Eso se hace indicando el tipo entre los signos de mayor-menor. Por ejemplo, para pasar dos numeros enteros indicaremos, por ejemplo:

a=mayor<int>(10,12)

Llamamos aquí a la función y le pasamos dos argumentos enteros. Para ello indicamos que son enteros mediante la escritura de <int> después del nombre de la función.

Los compiladores modernos suelen deducir el tipo de dato que estamos pasando, por lo que si éste está claro se puede omitir la escritura del tipo de datos ( <int>), aunque esto no es así en todos los casos, por lo que siempre que se pueda es conveniente escribir el tipo de datos.

Tras lo visto hasta ahora, transformamos el ejemplo anterior, y las cuatro funciones que tiene las transformamos en una sola, a la cual le aplicamos una plantilla. El ejemplo se quedará así.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#include<iostream>
using namespace std;

template <class T>
T mayor (T a, T b);

int main() {
    cout << "Mayor entre 10 y 12 : " << mayor<int>(10,12) << endl;
    cout << "Mayor entre 13.12 y 17.73 : " << mayor<double>( 13.12, 17.73) << endl;
    cout << "Mayor entre a y e : " << mayor<char>('a', 'e') << endl;
    cout << "Mayor entre Carlos y Enrique : " << mayor<string>("Carlos", "Enrique") << endl;
}

template <class T>
T mayor(T a, T b) {
   if (a>b) return a;
   else return b;
}

Al compilar y ejecutar este ejemplo obtenemos lo mismo que en el ejemplo anterior. Es decir, el resultado es exactamente el mismo. La ventaja es que el programa es mucho más corto, ya que en lugar de usar cuatro funciones, una para cada tipo de valor, sólo usamos una con una plantilla.






En la siguiente página veremos funciones que se llaman a sí mismas.

Recursividad



Manual Básico de C++

Anterior siguiente ... Siguiente siguiente


imprimir esta página

Página creada por ANYELGUTI.

Sugerencias: aprendeweb@aprende-web.net. Envia un manda un correo

Visita nuestro blog par saber en qué estamos trabajando: Aprende Web Blog

Más sobre anyelguti en http://anyelguti.16mb.com