C++ implementa el concepto de sobrecarga para operadores y funciones, en este apartado revisamos la sobrecarga de funciones.
La sobrecarga de funciones y operadores son temas exclusivos de C++, no existen en la definición de C estándar
La sobrecarga de funciones es la asignación del mismo nombre a una función que tienen definiciones distintas. Sobrecargar funciones nos permite crear múltiples funciones con el mismo nombre, siempre y cuando tengan diferentes parámetros o que difieran en el tipo de dato de los parámetros.
Existen algunas consideraciones que se deben tener al sobrecargar funciones:
La mejor forma de comprender la sobrecarga es con un ejemplo sencillo.
// cpp_70_sobrecargaFunciones.cpp
// Se ilustra la sobrecarga de funciones
// 2019, Por http://about.me/carlosgbr
// Versión 1
// Revisa todo el código del tutorial en: https://github.com/carlosgbr/
// Compilado en https://www.onlinegdb.com/online_c++_compiler
#include <iostream>
using namespace std;
// Sobrecarga de la función imprime, observa que el tipo de retorno es el mismo en todos, solo varía el tipo del argumento
void imprime(int a){
cout << "Entero" << endl;
}
void imprime(float a){
cout << "Flotante" << endl;
}
void imprime(double a){
cout << "Doble" << endl;
}
int main() {
imprime(42);
imprime(42.0f);
imprime(42.1);
return 0;
}
Como puedes observar, definimos 3 funciones con el mismo nombre, mismo tipo de retorno y mismo número de parámetros. Sin embargo para el compilador son 3 objetos completamente distintos. Esta posibilidad te permite definir funciones genéricas que pueden responder de distinta forma con un mismo conjunto de parámetros. De hecho varias funciones de las librerías de C++ están definidas de esta forma, por dar un ejemplo tenemos la función pow(x,y) de la librería cmath(1)
float pow (float x, float y)
double pow (double x, double y)
La sobrecarga de funciones te permite utilizar diferente número de parámetros en las funciones sobrecargadas, de modo que puedes definir “una” función para diferentes casos.
Consideremos el cálculo del área de un triángulo. El triángulo es un caso en sí mismo, para calcular el área de un triángulo podemos hacerlo de acuerdo a la información con la que contemos (lados, ángulos, altura), y de acuerdo a esta información utilizaremos una fórmula u otra. Si quisiéramos implementar una función universal para calcular el área del triángulo terminaríamos con una función compleja, con muchos parámetros e incluso tal vez con algunos “switches” para activar o desactivar ciertas opciones.
En lugar de hacer esto, podemos definir funciones con el mismo nombre que para el usuario serán “una” aunque la implementación sean varias.
Para ilustrar este tema definimos los 3 casos más conocidos cuando se requiere calcular el área de un triángulo:
(sqrt, es la función para obtener la raíz cuadrada del argumento), para utilizarla debes incluir la biblioteca cmath
área = ( (sqrt(3)/4) * (a * a) )
Para este caso solo necesitamos conocer un lado, nuestro prototipo de función podemos definirlo de la siguiente forma:
double trianguloarea(double a);
área = (b * (sqrt ((a * a) – ( (b * b) / 4 ) ) ) ) / 2
Para este caso necesitamos conocer un lado y el valor de la base, nuestro prototipo de función podemos definirlo de la siguiente forma:
double trianguloarea(double a, double b);
Para este cálculo se utiliza la fórmula de Herón. Utilizando la notación de computadora, la fórmula de Herón la fórmula que utilizaremos queda:
area = sqrt( (p* (p – a) * (p – b) * (p – c)) )
Para este caso necesitamos conocer los 3 lados del triángulo, nuestro prototipo de función podemos definirlo de la siguiente forma:
double trianguloarea(double a, double b, double c);
Nuestro programa queda de la siguiente manera.
// cpp_71_sobrecargaTriangulo.cpp
// Se ilustra la sobrecarga de funciones para el cálculo del área de un triángulo
// 2019, Por http://about.me/carlosgbr
// Versión 1
// Revisa todo el código del tutoral en: https://github.com/carlosgbr/
// Compilado en https://www.onlinegdb.com/online_c++_compiler
#include <iostream>
#include <cmath> // Para utilizar sqrt()
using namespace std;
double trianguloarea(double);
double trianguloarea(double, double);
double trianguloarea(double, double, double);
int main()
{
// El número de parámetros que pasamos determinar el tipo de triángulo que
// calculamos, 1 parámetro = Equilátero, 2 parámetros = isóceles
// 3 parámetros = escaleno.
double a = 2;
double b = 4;
double c = 5;
cout << "Triángulo. Lado = " << a << " :" << trianguloarea(a) << endl;
cout << "Triángulo. Lado = " << a << ", Base = : " << b << " :" << trianguloarea(a, b) << endl;
cout << "Triángulo. Lado 1 = " << a << ", Lado 2 = " << b << ", Lado 3 = "
<< c << " :" << trianguloarea(a, b, c) << endl;
return 0;
}
double trianguloarea(double a)
// area = ( (sqrt(3)/4) * (a * a) )
{
cout << "Calculando área de triángulo equilátero: " << endl;
return ( (sqrt(3)/4) * (a * a) );
}
double trianguloarea(double a, double b)
{
cout << "Calculando área de triángulo isóceles: " << endl;
return (b * (sqrt ((a * a) - ( (b * b) / 4 ) ) ) ) / 2;
}
double trianguloarea(double a, double b, double c)
{
double p;
p = ( (a + b + c) / 2 );
cout << "Calculando área de triángulo escaleno: " << endl;
return sqrt( (p* (p - a) * (p - b) * (p - c)) );
}
La salida para nuestro programa la podemos ver a continuación.
Si intentáramos crea un función que contemplara los 3 tipos de triángulos, llegaríamos a una función compleja y extensa es buena idea que lo intentes), utilizando sobrecarga de funciones, simplificamos en gran medida el desarrollo de “una función” (para el usuario) que realice este trabajo.
Los operadores son unos tokens con propiedades muy particulares, pero a final de cuentas también son funciones en C++, los operadores también se pueden sobre cargar, pero para poder revisar este tema nos faltan algunas herramientas, posteriormente se abordará su estudio.
Si tienes alguna duda, plantéala en la sección de preguntas.
Sobrecarga de Funciones by Roberto C. González is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional License.
C++ implementa el concepto de sobrecarga para operadores y funciones, en este apartado revisamos la sobrecarga de funciones.
La sobrecarga de funciones y operadores son temas exclusivos de C++, no existen en la definición de C estándar
La sobrecarga de funciones es la asignación del mismo nombre a una función que tienen definiciones distintas. Sobrecargar funciones nos permite crear múltiples funciones con el mismo nombre, siempre y cuando tengan diferentes parámetros o que difieran en el tipo de dato de los parámetros.
Existen algunas consideraciones que se deben tener al sobrecargar funciones:
La mejor forma de comprender la sobrecarga es con un ejemplo sencillo.
// cpp_70_sobrecargaFunciones.cpp
// Se ilustra la sobrecarga de funciones
// 2019, Por http://about.me/carlosgbr
// Versión 1
// Revisa todo el código del tutorial en: https://github.com/carlosgbr/
// Compilado en https://www.onlinegdb.com/online_c++_compiler
#include <iostream>
using namespace std;
// Sobrecarga de la función imprime, observa que el tipo de retorno es el mismo en todos, solo varía el tipo del argumento
void imprime(int a){
cout << "Entero" << endl;
}
void imprime(float a){
cout << "Flotante" << endl;
}
void imprime(double a){
cout << "Doble" << endl;
}
int main() {
imprime(42);
imprime(42.0f);
imprime(42.1);
return 0;
}
Como puedes observar, definimos 3 funciones con el mismo nombre, mismo tipo de retorno y mismo número de parámetros. Sin embargo para el compilador son 3 objetos completamente distintos. Esta posibilidad te permite definir funciones genéricas que pueden responder de distinta forma con un mismo conjunto de parámetros. De hecho varias funciones de las librerías de C++ están definidas de esta forma, por dar un ejemplo tenemos la función pow(x,y) de la librería cmath(1)
float pow (float x, float y)
double pow (double x, double y)
La sobrecarga de funciones te permite utilizar diferente número de parámetros en las funciones sobrecargadas, de modo que puedes definir “una” función para diferentes casos.
Consideremos el cálculo del área de un triángulo. El triángulo es un caso en sí mismo, para calcular el área de un triángulo podemos hacerlo de acuerdo a la información con la que contemos (lados, ángulos, altura), y de acuerdo a esta información utilizaremos una fórmula u otra. Si quisiéramos implementar una función universal para calcular el área del triángulo terminaríamos con una función compleja, con muchos parámetros e incluso tal vez con algunos “switches” para activar o desactivar ciertas opciones.
En lugar de hacer esto, podemos definir funciones con el mismo nombre que para el usuario serán “una” aunque la implementación sean varias.
Para ilustrar este tema definimos los 3 casos más conocidos cuando se requiere calcular el área de un triángulo:
(sqrt, es la función para obtener la raíz cuadrada del argumento), para utilizarla debes incluir la biblioteca cmath
área = ( (sqrt(3)/4) * (a * a) )
Para este caso solo necesitamos conocer un lado, nuestro prototipo de función podemos definirlo de la siguiente forma:
double trianguloarea(double a);
área = (b * (sqrt ((a * a) – ( (b * b) / 4 ) ) ) ) / 2
Para este caso necesitamos conocer un lado y el valor de la base, nuestro prototipo de función podemos definirlo de la siguiente forma:
double trianguloarea(double a, double b);
Para este cálculo se utiliza la fórmula de Herón. Utilizando la notación de computadora, la fórmula de Herón la fórmula que utilizaremos queda:
area = sqrt( (p* (p – a) * (p – b) * (p – c)) )
Para este caso necesitamos conocer los 3 lados del triángulo, nuestro prototipo de función podemos definirlo de la siguiente forma:
double trianguloarea(double a, double b, double c);
Nuestro programa queda de la siguiente manera.
// cpp_71_sobrecargaTriangulo.cpp
// Se ilustra la sobrecarga de funciones para el cálculo del área de un triángulo
// 2019, Por http://about.me/carlosgbr
// Versión 1
// Revisa todo el código del tutoral en: https://github.com/carlosgbr/
// Compilado en https://www.onlinegdb.com/online_c++_compiler
#include <iostream>
#include <cmath> // Para utilizar sqrt()
using namespace std;
double trianguloarea(double);
double trianguloarea(double, double);
double trianguloarea(double, double, double);
int main()
{
// El número de parámetros que pasamos determinar el tipo de triángulo que
// calculamos, 1 parámetro = Equilátero, 2 parámetros = isóceles
// 3 parámetros = escaleno.
double a = 2;
double b = 4;
double c = 5;
cout << "Triángulo. Lado = " << a << " :" << trianguloarea(a) << endl;
cout << "Triángulo. Lado = " << a << ", Base = : " << b << " :" << trianguloarea(a, b) << endl;
cout << "Triángulo. Lado 1 = " << a << ", Lado 2 = " << b << ", Lado 3 = "
<< c << " :" << trianguloarea(a, b, c) << endl;
return 0;
}
double trianguloarea(double a)
// area = ( (sqrt(3)/4) * (a * a) )
{
cout << "Calculando área de triángulo equilátero: " << endl;
return ( (sqrt(3)/4) * (a * a) );
}
double trianguloarea(double a, double b)
{
cout << "Calculando área de triángulo isóceles: " << endl;
return (b * (sqrt ((a * a) - ( (b * b) / 4 ) ) ) ) / 2;
}
double trianguloarea(double a, double b, double c)
{
double p;
p = ( (a + b + c) / 2 );
cout << "Calculando área de triángulo escaleno: " << endl;
return sqrt( (p* (p - a) * (p - b) * (p - c)) );
}
La salida para nuestro programa la podemos ver a continuación.
Si intentáramos crea un función que contemplara los 3 tipos de triángulos, llegaríamos a una función compleja y extensa es buena idea que lo intentes), utilizando sobrecarga de funciones, simplificamos en gran medida el desarrollo de “una función” (para el usuario) que realice este trabajo.
Los operadores son unos tokens con propiedades muy particulares, pero a final de cuentas también son funciones en C++, los operadores también se pueden sobre cargar, pero para poder revisar este tema nos faltan algunas herramientas, posteriormente se abordará su estudio.
Si tienes alguna duda, plantéala en la sección de preguntas.
Sobrecarga de Funciones by Roberto C. González is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional License.
El comando dnsenum es una herramienta de línea de comandos para realizar enumeración de DNS…
En esta entrada te presento 24 de las listas negras más comunes que los servidores…
ZoomIt es una herramienta de anotación y zoom de pantalla para presentaciones técnicas que incluyen…
WinObj es el visor de espacios de nombres de Object Manager definitivo. Es la primera…
Whois realiza el registro de registro para el nombre de dominio o la dirección IP…
VolumeID – Esta utilidad, le permite cambiar los identificadores de los discos FAT y NTFS…