4.5.- Sobrecarga de funciones


En la mayoría de los casos, los identificadores ó nombres de los objetos deben ser únicos, esto es, que dos objetos dentro del mismo ámbito no deben tener el mismo nombre. Una de las excepciones la constituyen las funciones, que pueden compartir el mismo nombre entre varias de ellas, dando la impresión de que a una sola función se le ha "sobrecargado de tareas", razón por la cual se les llama funciones sobrecargadas.

Por ejemplo, supongamos que deseamos una función que sirva para sumar números. Lo ideal sería contar con una sola función que realizara la suma de números de diferentes tipos y que retornara un valor de acuerdo al tipo de resultado. El Lenguaje C++ permite resolver este problema por medio de la sobrecarga de funciones.

A continuación se muestran los prototipos para cada una de las funciones que comparten el nombre suma :

int    suma(int,int);       // Recibe enteros, devuelve entero

float  suma(float,float);   

double suma(double,double);

Aquí surge la pregunta: ¿ cómo distingue el compilador entre cada una de las funciones suma() ?.

Debido a que varias funciones sobrecargadas pueden usar el mismo identificador, C++ utiliza el concepto de nombres ampliados para controlar cada función individualmente. El nombre ampliado de una función se construye tomando como base el nombre de la función y los tipos de los argumentos. El tipo de retorno de la función no se utiliza en la formación del nombre ampliado. La composición del nombre ampliado ocurre a nivel del compilador, no al nivel del enlazador. El enlazador resuelve fácilmente las referencias externas para sobrecargar las funciones debido a que éstas tienen nombres ampliados únicos.

Las reglas básicas usadas en Borland C++ para los nombres ampliados son relativamente simples como se observa a continuación :

  1. Se utiliza primero el nombre de la clase, precedido por el carácter @.
  2. Enseguida viene el nombre de la función, precedido por el carácter @.
  3. Si la función no es parte de una clase, el nombre ampliado empieza con el símbolo @ seguido por el nombre de la función. Se respetan las reglas establecidas para la creación de identificadores.
  4. El nombre de la función está seguido por una secuencia $q ; las letras minúsculas que le siguen designan cada tipo de argumento declarado.

La tabla 4.1 muestra una lista de las letras que se utilizan para manejar los tipos predefinidos de C++ en la formación de los nombres ampliados.

Tipo de argumentoLetras
voidv
void*pv
unsigned charuc
unsigned char*puc
unsigned char&ruc
signed charzc
signed char*pzc
signed char&rzc
inti
int*pi
int&ri
unsigned intui
unsigned int*pui
unsigned int&rui
longl
long*pl
long&rl
unsigned longul
unsigned long*pul
unsigned long&rul
floatf
float*pf
float&rf
doubled
double*pd
double&rd

Tabla 4.1.- Letras para los tipos de argumentos en la creación de nombres ampliados.


Utilizando la tabla 4.1, se pueden predecir fácilmente los nombres ampliados de las funciones, como se muestra a continuación:

Declaración de funcionesNombre ampliado
void imprim(void);@imprim$qv
void imprim(int);@imprim$qi
void imprim(int,int,int);@imprim$qiii
int redim(long,unsigned int*);@redim$qlpui
void despliega(char*);@despliega$qpzc
int suma(int,int);@suma$qii
float suma(float,float);@suma$qff
double suma(double,double);@suma$qdd
Página anterior Página siguiente