Titulo.jpg (10742 bytes)
FlechaI.jpg (2886 bytes) casa.jpg (31539 bytes) FlechaD.jpg (2791 bytes)

Transferencia de par�metros

por valor

por referencia

par�metros impl�citos


Transferencia de par�metros por valor.

Dentro de los par�ntesis de las funciones se situ�n los datos que teniendo su origen fuera de la funci�n quieren ser utilizados en ella. 

Esos datos puedes ser transferidos por valor o por referencia.

En el primer caso como su nombre lo indica se traslada solo el valor del dato mientras que en el segundo caso lo que se traslada a la funci�n es la direcci�n de memoria donde se encuentra el dato. En esta segunda variante cuando se realizan cambios en el valor dentro de la funci�n estos cambios se reflejan en el lugar de origen del dato, mientras que en el primer caso el valor transferido permanece sin cambios en su lugar de origen.

Un ejemplo de la transferencia por valor se muestra en la funci�n que aparece a continuaci�n en la que se calcula que por ciento es un n�mero de otro.

  1. float calculo_porciento(float numero, float denominador )

  2. {   return (numerador/denominador*100);

  3. }

En la l�nea 10 se declara la funci�n �calculo_porciento� , y se incluye en el par�ntesis la declaraci�n de dos datos; en este caso denominador y numerador ambos de  tipo float.

Es muy importante, cuando se haga la llamada a este tipo de funci�n con m�s de un par�metro, que los valores se sit�en en el orden correcto, ya que la transferencia no se hace teniendo en cuenta la coincidencia o no de los nombres de los datos, sino la posici�n en que ellos se encuentran.  No existe limite para la cantidad de par�metros a transferir a una funci�n, es solo un problema de claridad en la programaci�n.

En la siguiente funci�n utilizamos la misma variable donde son transferidos los valores para realizar operaciones en la funci�n sin alterar el dato original dado que la transferencia se hace por valor.

En esta funci�n elevamos un n�mero a una potencia dada, siendo ambos transferidos por valor.  El valor de la potencia se pone como implicito igual a 2.

float potencia(float base, int dato=2)

{  base = pow(base,dato);

   return (base);

}

Se declara la funci�n potencia, contenida en la biblioteca math.h de C++.  En este caso los par�metros que se usan son de distinto tipo, pero pow no tiene restricciones en este sentido, tambi�n su segundo parametro puede ser float.

Se utiliza el nombre de una de las variables definidas en el par�ntesis de la funci�n para asignarle el valor de pow(), lo cual muestra c�mo el cambio de su valor dentro de �potencia� no afecta para nada el que tiene esa variable en su lugar de origen.

Transferencia de valores por referencia

No siempre es de inter�s que el valor de las variables que se trans�fieren de una funci�n a otra se mantenga y, muy por el contrario, se quiere que lo que ocurra en una funci�n repercuta en la otra.

Por otra parte, en la forma conocida hasta ahora cada funci�n solo retorna un valor y muchas veces se necesita que se regresen m�s valores de una sola funci�n.  

Para casos as� se utiliza la transferencia de valores por referencia.  As� en el siguiente programa se realiza la suma y el promedio de dos valores.

float calculos(float nr1,float &promedio)
{  float suma;
   suma = nr1 + promedio;
   promedio = suma/2;
   return (suma);
}

void main()
{  float nr1 = 2.5, nr2 = 5.5;
   cout << "La suma es " << calculos(nr1,nr2) << " y el promedio " << nr2;
}

 Al declarar la funci�n �calculos�, se coloca delante del nombre de la variable �promedio� el signo &, que indica que el par�metro que aparece a continuaci�n de �l se transfiere por referencia.  Esto significa que lo que se est� pasando a la funci�n es la direcci�n de la variable, y no su valor como hasta ahora.  De esta forma cuando se asigna a �promedio� un nuevo valor,  este ser� situado en la direcci�n de memoria de �nr2� con lo que quedar� modificado su valor.

As� que cuando se pone en pantalla el valor de �nr2�, lo que aparecer� es el promedio de �nr1� y �nr2� , y no su valor original.

Cuando en el ep�grafe referido a tipos de datos propios se estudiaron los arreglos, analizamos que las variables que contienen un arreglo son una sucesi�n de valores de un mismo tipo. 

Cabe preguntar, entonces,. cu�ndo se pone el nombre de la variable �a qu� dato nos estamos refiriendo?.

La respuesta es que cuando en un programa aparece el nombre de una variable que contiene un arreglo, simplemente se est� indicando la direcci�n del primer dato del arreglo.  Si queremos referirnos al valor de un dato espec�fico se debe poner a continuaci�n del nombre de la variable el signo [] para encerrar el n�mero del dato que se necesita.

Es por esto que cuando se transfiere un arreglo siempre se est� transfiriendo la direcci�n del primer dato.

 Otra ventaja, en extremo importante, de las transferencias de datos por referencia, o por direcci�n, es que solo se transfiere un dato de dos bytes entre las funciones; mientras que s�, por ejemplo,  en el caso de los arreglos, se tuviera que pasar todos los valores contenidos dentro de una variable, ser�a necesario pasar decenas y hasta cientos de valores entre dos funciones, con la consiguiente demora de la ejecuci�n del programa.

Al igual que la palabra que define una variable que contiene un arreglo es una direcci�n; la palabra que define una funci�n es una direcci�n.  De esa manera, puede transferirse como par�metro el nombre de una funci�n,   lo que va a permitir realizar operaciones sobre funciones, a�n y cuando no conozcamos de cu�l funci�n se trata.

El siguiente programa transfiere por referencia un par�metro que es el nombre de una funci�n.

double inverso(double x )
{  double dato;
      dato = 1.0/x;
      return(dato);
} 

double valor_medio(double f(double ), float dato)
{ return(f(dato)/2);
}

 void main()
{   float entrada = 0.5;
     cout << “La mitad del inverso de su numero es “
     cout << valor_medio(inverso,entrada);
     cout << “La mitad del seno de su numero es “
     cout << valor_medio(sin,entrada);
     getch();
}

Al definir la funci�n valor_medio, se ha tomado como primer par�metro f, al que se le pasa el nombre de la funci�n que se pretende utilizar.  Si a la funci�n  f se le pretende pasar un par�metro, se debe poner entre par�ntesis el tipo de dato que se le pasar�, como se ha  hecho en este caso.

En la llamada a la funci�n valor_medio y como par�metro se le est� pasando el nombre de un funci�n definida por el operador, en este caso, inverso.  Al llamar a valor_medio se pasa el nombre de la funci�n sin , que es definida por C++ En ambos casos valor_medio identifica a qu� funci�n se le quiere calcular la mitad de su resultado, y act�a en consecuencia.

No cabe duda de que esta es una ventaja grande del paso de par�metros por referencia. As� se preparan funciones que calculen integrales, sumatorias, derivadas, sin necesidad de conocer previamente qu� funci�n le va a ser transferida.

Resulta �til tener definidas funciones tales que --seg�n la necesidad-- se puedan usar con par�metros o no. Tendremos as� par�metros impl�citos.

Transferencia de par�metros impl�citos.

El siguiente programa nos permita calcular cualquier por ciento de un n�mero.

 

float calculo_porciento(float numero, float por ciento = 10)
{ por ciento = por ciento /100.0;
  return (numero*porciento);
}

Esta funci�n calcular� siempre el 10%, si al llamarla se hace solo con un par�metro.  Esto es:

calculo_porciento(25);

Sin embargo, si se quiere variar el porciento que calcula, se puede hacer 

calculo_porciento(25,5);

y el resultado devuelto ahora ser� el 5 por ciento de 25, y no el 10, como en el primer caso.

Observe que el dato que se da como impl�cito es el �ltimo. Los datos que se quieran dar como impl�citos deben estar a la extrema derecha del par�ntesis de la declaraci�n de la funci�n

En una funci�n puede haber varios par�metros de este tipo, o incluso que todos lo sean.  Ahora bien si no todos los par�metros son implicitos, los implicitos deben ser situados a la derecha en forma continua.

arriba.jpg (2978 bytes) casa.jpg (31539 bytes)
Hosted by www.Geocities.ws

1