![]() |
|---|
![]() |
![]() |
![]() |
Transferencia de par�metros
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.
|
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.
float calculos(float nr1,float
&promedio) void main() |
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.
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 valor_medio(double f(double ), float dato) void main() |
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) |
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.
![]() |
![]() |