Python

Sobrecarga de Funciones

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

¿Qué es la sobrecarga de funciones?

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:

  • El tipo de retorno debe ser el mismo
  • Los argumentos pueden ser de diferente tipo
  • La traducción de las funciones se realiza en tiempo de compilación

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;
}

Mismo nombre, diferentes funciones.

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)

Sobrecarga en funciones con diferentes parámetros

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

  1. Triángulo equilátero (3 lados iguales):
Área del triángulo equilátero

á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);
2. Triángulo isósceles. (2 lados iguales y 1 diferente)
Área del triángulo isósceles

á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);
3. Triángulo escaleno

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:

p = ( (a + b + c) / 2 )

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);

Cálculo del área de un triángulo utilizando sobrecarga de funciones

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.

Sobrecarga de función Triángulo

 

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.

Sobrecarga de operadores.

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.

 


Ethical Hack

Referencias

Fuente Imágenes

  • “Todas las demás imágenes de esta sección”: by Nala Systems

Código Fuente

 


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

¿Qué es la sobrecarga de funciones?

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:

  • El tipo de retorno debe ser el mismo
  • Los argumentos pueden ser de diferente tipo
  • La traducción de las funciones se realiza en tiempo de compilación

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;
}

Mismo nombre, diferentes funciones.

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)

Sobrecarga en funciones con diferentes parámetros

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

  1. Triángulo equilátero (3 lados iguales):
Área del triángulo equilátero

á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);
2. Triángulo isósceles. (2 lados iguales y 1 diferente)
Área del triángulo isósceles

á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);
3. Triángulo escaleno

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:

p = ( (a + b + c) / 2 )

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);

Cálculo del área de un triángulo utilizando sobrecarga de funciones

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.

Sobrecarga de función Triángulo

 

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.

Sobrecarga de operadores.

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.

 


Ethical Hack

Referencias

Fuente Imágenes

  • “Todas las demás imágenes de esta sección”: by Nala Systems

Código Fuente

 


Sobrecarga de Funciones by Roberto C. González is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional License.
eHack Blog

Compartir
Publicado por
eHack Blog

Entradas recientes

dnsenum

El comando dnsenum es una herramienta de línea de comandos para realizar enumeración de DNS…

1 año hace

Las 24 listas negras de IPv4 más comunes.

En esta entrada te presento 24 de las listas negras más comunes que los servidores…

2 años hace

ZoomIt – SysInternals

ZoomIt es una herramienta de anotación y zoom de pantalla para presentaciones técnicas que incluyen…

2 años hace

WinObj – SysInternals

WinObj es el visor de espacios de nombres de Object Manager definitivo. Es la primera…

2 años hace

WhoIs – SysInternals

Whois realiza el registro de registro para el nombre de dominio o la dirección IP…

2 años hace

VolumeID – SysInternals

VolumeID – Esta utilidad, le permite cambiar los identificadores de los discos FAT y NTFS…

2 años hace