Vous êtes sur la page 1sur 6

El paso de parmetros en C++ se puede hacer de dos formas:

1. Paso de parmetros por valor.


2. Paso de parmetros por referencia.
1. Paso de parmetros por valor.
Pasar parmetros por valor significa que a la funcin se le pasa una copia del valor
que contiene el parmetro actual.
Los valores de los parmetros de la llamada se copian en los parmetros de la
cabecera de la funcin. La funcin trabaja con una copia de los valores por lo
que cualquier modificacin en estos valores no afecta al valor de las variables
utilizadas en la llamada.
Aunque los parmetros actuales (los que aparecen en la llamada a la funcin) y los
parmetros formales (los que aparecen en la cabecera de la funcin) tengan el mismo
nombre son variables distintas que ocupan posiciones distintas de memoria.
Por defecto, todos los argumentos salvo los arrays se pasan por valor.
Ejemplo de paso de parmetros por valor
El siguiente programa lee un nmero entero y llama a una funcin que invierte las
cifras del nmero:
#include <iostream>
using namespace std;
int invertir (int);
int main()
{ int num;
int resultado;
cout << "Introduce un numero entero: ";
cin >> num;
resultado = invertir(num);
cout << "Numero introducido: " << num << endl;
cout << "Numero con las cifras invertidas: " << resultado << endl;
system("pause");
}
int invertir(int num)
{
int inverso = 0, cifra;
while (num != 0)
{
cifra = num % 10;
inverso = inverso * 10 + cifra;
num = num / 10;
}
return inverso;
}
La salida de este programa es:

En la llamada a la funcin el valor de la variable num se copia en la variable num de la


cabecera de la funcin. Aunque tengan el mismo nombre, se trata de dos variables
distintas.
Dentro de la funcin se modifica el valor de num, pero esto no afecta al valor de num
en main. Por eso, al mostrar en main el valor de num despus de la llamada aparece
el valor original que se ha ledo por teclado.

2. Paso de parmetros por referencia.


El paso de parmetros por referencia permite que la funcin pueda modificar el valor
del parmetro recibido.
Vamos a explicar dos formas de pasar los parmetros por referencia:
2.1 Paso de parmetros por referencia basado en punteros al estilo C.
2.2 Paso de parmetros por referencia usando referencias al estilo C++.
2.1 Paso de parmetros por referencia utilizando punteros.
Cuando se pasan parmetros por referencia, se le enva a la funcin la direccin
de memoria del parmetro actual y no su valor. La funcin realmente est
trabajando con el dato original y cualquier modificacin del valor que se realice
dentro de la funcin se estar realizando con el parmetro actual.
Para recibir la direccin del parmetro actual, el parmetro formal debe ser un
puntero.
Ejemplos de paso de parmetros por referencia
Ejemplo 1:
Programa c++ que lee dos nmeros por teclado y los enva a una funcin para que
intercambie sus valores.
#include <iostream>
using namespace std;
void intercambio(int *, int *);
int main( )
{
int a, b;
cout << "Introduce primer numero: ";
cin >> a;
cout << "Introduce segundo numero: ";

cin >> b;
cout << endl;
cout << "valor de a: " << a << " valor de b: " << b << endl;
intercambio(&a, &b);
cout << endl << "Despues del intercambio: " << endl << endl;
cout << "valor de a: " << a << " valor de b: " << b << endl;
system("pause");
}
void intercambio(int *x, int *y)
{
int z;
z = *x;
*x = *y;
*y = z;
}
La salida de este programa es:

En la llamada, a la funcin se le enva la direccin de los parmetros. El operador que


obtiene la direccin de una variable es &.
intercambio(&a, &b);
En la cabecera de la funcin, los parmetros formales que reciben las direcciones
deben ser punteros. Esto se indica mediante el operador *
void intercambio(int *x, int *y)
Los punteros x e y reciben las direcciones de memoria de las variables a y b. Al
modificar el contenido de las direcciones x e y, indirectamente estamos modificando
los valores a y b. Por tanto, pasar parmetros por referencia a una funcin es
hacer que la funcin acceda indirectamente a las variables pasadas.
Ejemplo 2:
En el siguiente ejemplo, se lee una hora (hora, minutos y segundos) y se calcula la
hora un segundo despus. El programa utiliza una funcin segundo_despues que
recibe la hora, minutos y segundos ledos y los modifica de forma que al finalizar
contienen la hora un segundo despus.
// Hora un segundo despus
#include <iostream>
#include <iomanip>
using namespace std;
void segundo_despues(int *, int *, int *);
int main()
{ int horas, minutos, segundos;
do
{
cout << "Introduce hora: ";
cin >> horas;

}while(horas<0 || horas > 23);


do
{
cout << "Introduce minutos: ";
cin >> minutos;
}while(minutos<0 || minutos > 59);
do
{
cout << "Introduce segundos: ";
cin >> segundos;
}while(segundos<0 || segundos > 59);
//llamada a la funcin
segundo_despues(&horas, &minutos, &segundos);
cout << setfill('0');
cout << endl << "Hora un segundo despues: ";
cout << setw(2) << horas << ":";
cout << setw(2) << minutos << ":";
cout << setw(2) << segundos << endl;
system("pause");
}
//function c++ que recibe una hora expresada en
//horas, minutos y segundos y calcula la hora
//un segundo despus
void segundo_despues(int *h, int *m, int *s)
{
(*s)++;
if(*s == 60)
{
*s = 0;
(*m)++;
if(*m == 60)
{
*m = 0;
(*h)++;
if(*h == 24)
{
*h = 0;
}
}
}
}
Esta funcin no devuelve nada (aparece void como tipo devuelto), por lo que no es
necesario poner la instruccin return.
Mediante return una funcin solo puede devolver un valor. En casos como la funcin
anterior en los que es necesario devolver ms de un valor, habr que hacerlo pasando
los parmetros por referencia.
Este paso de parmetros por referencia basado en punteros es el utilizado por C y por
tanto tambin puede usarse en C++. Pero C++ incorpora una nueva forma de paso de
parmetros que no hace uso de punteros.

Es el paso de parmetros utilizando referencias.


2.2 Paso de parmetros utilizando referencias.
Una referencia es un nombre alternativo (un alias, un sinnimo) para un objeto. Una
referencia no es una copia de la variable referenciada, sino que es la misma
variable con un nombre diferente.
Utilizando referencias, las funciones trabajan con la misma variable utilizada en la
llamada. Si se modifican los valores en la funcin, realmente se estn modificando los
valores de la variable original.
Ejemplo:
El primer ejemplo del punto anterior utilizando referencias lo podemos escribir as:
#include <iostream>
using namespace std;
void intercambio(int &, int &);
int main( )
{ int a, b;
cout << "Introduce primer numero: ";
cin >> a;
cout << "Introduce segundo numero: ";
cin >> b;
cout << endl;
cout << "valor de a: " << a << " valor de b: " << b << endl;
intercambio(a, b);
cout << endl << "Despues del intercambio: " << endl << endl;
cout << "valor de a: " << a << " valor de b: " << b << endl;
system("pause");
}
void intercambio(int &x, int &y)
{
int z;
z = x;
x = y;
y = z;
}
En la declaracin de la funcin y en la definicin se coloca el operador referencia a &
en aquellos parmetros formales que son referencias de los parmetros actuales:
void intercambio(int &, int &); //declaracin de la funcin
void intercambio(int &x, int &y) //definicin de la funcin
Cuando se llama a la funcin:
intercambio(a, b);
se crean dos referencias (x e y) a las variables a y b de la llamada. Lo que se haga
dentro de la funcin con x e y se est haciendo realmente con a y b.
La llamada a una funcin usando referencias es idntica a la llamada por valor.
Ejemplo:
El segundo ejemplo anterior, utilizando referencias:
// Hora un segundo despus
#include <iostream>

#include <iomanip>
using namespace std;
void segundo_despues(int &, int &, int &);
int main()
{ int horas, minutos, segundos;
do
{
cout << "Introduce hora: ";
cin >> horas;
}while(horas<0 || horas > 23);
do
{
cout << "Introduce minutos: ";
cin >> minutos;
}while(minutos<0 || minutos > 59);
do
{
cout << "Introduce segundos: ";
cin >> segundos;
}while(segundos<0 || segundos > 59);
segundo_despues(horas, minutos, segundos);
cout << setfill('0');
cout << endl << "Hora un segundo despues: ";
cout << setw(2) << horas << ":";
cout << setw(2) << minutos << ":";
cout << setw(2) << segundos << endl;
system("pause");
}
void segundo_despues(int &h, int &m, int &s)
{
s++;
if(s == 60)
{
s = 0;
m++;
if(m == 60)
{
m = 0;
h++;
if(h == 24)
{
h = 0;
}
}
}
}