programación en C++ desde cero.
y entérate de las novedades o deja un comentario.
Ültima modificación: 13-07-2018.
Visitas este mes: 1
Visitas el mes pasado:
Mi agradecimiento a los siguientes sitios en los que me he basado para la elaboración de los manuales.:
En los distintos manuales incluimosm más webgrafía especifica de cada sección.
Si este sitio te parece interesante puedes contribuir con una pequeña aportación.
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.
Puede haber sobrecarga de funciones si éstas tienen distinto número de parámetros, veamos el siguiente ejemplo:
#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; }
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.
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 :
#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; }
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.
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í.
#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.
Sugerencias:
aprendeweb@aprende-web.net. Envia un
Visita nuestro blog par saber en qué estamos trabajando: Aprende Web Blog
Más sobre anyelguti en http://anyelguti.16mb.com