2012-01-19 27 views
6

Tengo un problema con las referencias. Considere este código:Referencias como argumentos de funciones?

void pseudo_increase(int a){a++;} 
int main(){ 
    int a = 0; 
    //.. 
    pseudo_increase(a); 
    //.. 
} 

En este caso, el valor de la variable a no va a aumentar a medida que un clon o traspasó copia del mismo y no variable misma.
Consideremos ahora otro ejemplo:

void true_increase(int& a){a++;} 
int main(){ 
    int a = 0; 
    //.. 
    true_increase(a); 
    //.. 
} 

Aquí se dice valor de a aumentará - pero ¿por qué?

Cuando se llama true_increase(a), se pasará una copia de a. Será una variable diferente. Por lo tanto, &a será diferente de la dirección verdadera de a. Entonces, ¿cómo se incrementa el valor de a?

Corrígeme donde estoy equivocado.

+1

Probablemente deba utilizar identificadores diferentes para el argumento de función y la variable que se le pasa para que no se confunda aún más. – AusCBloke

+1

Pasar por referencia no crea una copia. Es una referencia a la misma variable. – jweyrich

+0

Te sugiero que primero aprendas acerca de los punteros sobre cómo las referencias pueden reducir el dolor de objetos no inicializados y punteros no válidos, etc. ¡Elige cualquiera de tus libros de C/C++ favoritos! – sarat

Respuesta

6

Consideremos el siguiente ejemplo:

int a = 1; 
int &b = a; 
b = 2; // this will set a to 2 
printf("a = %d\n", a); //output: a = 2 

Aquí b puede ser tratado como un alias para a. Lo que asigne a b, se le asignará a a también (porque b es una referencia a a). Pasando un parámetro by reference no es diferente:

void foo(int &b) 
{ 
    b = 2; 
} 

int main() 
{ 
    int a = 1; 
    foo(a); 
    printf("a = %d\n", a); //output: a = 2 
    return 0; 
} 
5

Cuando true_increase (a) se llama, copia de 'a' se pasará

Ahí es donde estás equivocado. Se hará una referencia a a. Para eso está el & junto al tipo de parámetro. Cualquier operación que sucede con una referencia se aplica al referente.

1

en su true_increase (un int &) función, lo que el código dentro está recibiendo no es una copia del valor entero de que ha especificado. es una referencia a la misma ubicación de memoria en la que reside su valor entero en la memoria de la computadora. Por lo tanto, cualquier cambio hecho a través de esa referencia pasará al entero real que usted declaró originalmente, no a una copia de este. Por lo tanto, cuando la función retorna, cualquier cambio que haga a la variable a través de la referencia se reflejará en la variable original. Este es el concepto de pasar valores por referencia en C++.

En el primer caso, como ha mencionado, se utiliza una copia de la variable original y, por lo tanto, lo que haya hecho dentro de la función no se refleja en la variable original.

Cuestiones relacionadas