¿Por qué el ejemplo call-by-value no modifica el parámetro de entrada?

En el siguiente ejemplo de call-by-value, no puedo entender por qué este código no está cambiando el valor de 5 a a 6.

La línea 11 llama a la función changeValue que tiene el valor 6, así que habría pensado que se debería dar salida a 6, sin embargo, 5 sigue emitiéndose.

#include  using namespace std; void changeValue(int value); int main() { int value = 5; changeValue(value); cout << "The value is : " << value << "." << endl; return 0; } void changeValue(int value) { value = 6; } // This doesn't change the value from 5 to 6. 5 is output? 

Cuando pasa un argumento de función por valor, una copia del objeto pasa a la función y no al objeto original. A menos que especifique explícitamente, los argumentos a las funciones siempre se pasan por valor en C / C ++.

Tu función:

 void changeValue(int value) 

recibe el argumento por valor, en resumen, se crea una copia del value en main() y se pasa a la función, la función opera en ese valor y no el value en main() .

Si desea modificar el original, debe usar pasar por referencia .

 void changeValue(int &value) 

Ahora se pasa una referencia (alias) al value original a la función y la función opera sobre ella, reflejando así los cambios en main() .

El valor del value no cambia porque su int que pasa a la función se está copiando en el marco de la stack de la función, luego se cambia y cuando la función sale se destruye la copia. El original en el fotogtwig de la stack main no ha cambiado, ya que se copió en changeValue .

Si desea cambiarlo, debe pasar una referencia a un int , como void changeValue(int& value) , que dice que el valor no se copia en la función, sino que simplemente se pasa un alias al original.

El comportamiento observado actualmente se debe a que pasar por valor significa que una copia del valor (nuevo entero con valor de valor) se pasa realmente a la función.

Tienes que pasar por referencia. Para eso la función changeValue se verá así:

 void changeValue(int& value) 

El rest del código seguirá siendo el mismo.

Pasar una variable por referencia significa que el mismo int value declarado en main se pasa a la función changeValue .

Alternativamente, puede pasar un puntero al value de la función changeValue . Sin embargo, eso requerirá cambios en la forma de llamar a la función también.

 int main() { int value = 5; changeValue(&value); ... return 0; } void changeValue(int* value) { *value = 6; } 

Incluyo esta respuesta como otra forma de pensar acerca de escribir funciones y pasar parámetros por valor.

También podría haber escrito este código de la siguiente manera. Eso es pasar el parámetro por valor, modificar la copia local en la función, que no altera el valor original, y devolver el valor alterado.

 int changeValue(int val) { val = 6; return val; } int main() { int value = 5; value = changeValue(value); cout << "The value is : " << value << "." << endl; return 0; } 

No estoy de ninguna manera indicando que mi sugerencia para su progtwig es mejor que pasar por referencia. En cambio, es solo la forma en que el aprendizaje de un lenguaje de progtwigción funcional (Clojure) afecta la forma en que pienso.

Además, en idiomas como Python, no puede modificar un parámetro escalar. Solo puedes devolver un nuevo valor. Entonces mi respuesta es más un ejercicio para pensar las cosas de manera diferente en C / C ++.

Y:

la copia tiene asignado 6, pero el cambio no se devuelve.

necesita alguna referencia o puntero si quiere cambiar el valor:

intente usar una firma de método como:

 void changeValue(int& value) 

eso probablemente hará lo que esperabas

Esto se debe a que el cambio en la función changeValue () es local. Cuando puede changeValue (value) el contenido del value de la variable en main se copia en el argumento formal denominado value (mismo nombre) de la función. El mismo nombre no significa que ambos son iguales. El valor al que está accediendo dentro de la función es una copia del valor que tenía en el principal.

Para cambiarlo, o bien debe pasarlo por referencia o un puntero

 void changeValue (int *val) { *val = 6; } 

llamar con changeValue (&value) en main

Esto funciona porque se pasa la dirección del value de la variable en main y este valor de dirección se copia en val de la función. Al hacer *val podemos obtener los contenidos de la dirección que se copió en val , que en realidad son los contenidos de value en main.

O

 void changeValue (int &val) { val = 6; }