funciones de C ++ que toman valores, donde deberían estar tomando referencias
-
22-09-2019 - |
Pregunta
Estoy aprendiendo C ++, y procedente de c, algunas llamadas de funciones que estoy viendo en el libro confundir mí:
char a;
cin.get(a);
En C, esto no podría trabajar, si lo hizo, no habría manera de obtener la salida, ya que está de paso por valor, y no por referencia, ¿por qué funciona esto en C ++? Se hace referencia y dereferncing hecho implícita (el compilador sabe que cin.get necesita un puntero, por lo que se hace referencia)?
Solución
C ++
Esto funciona en C ++ debido a que la firma de la función de get()
es probablemente la siguiente:
void get(char& a); // pass-by-reference
El símbolo denota &
después char
al compilador que cuando se pasa en un valor char
, que debe pasar en un referencia a la char
en lugar de hacer una copia del mismo.
Lo que esto significa básicamente es que los cambios realizados dentro get()
se reflejarán en el valor de a
fuera del método.
Si la firma de la función de get()
fue la siguiente:
void get(char a); // pass-by-value
entonces a
sería pasado por valor , lo que significa una copia de a
se hace antes de ser pasado en el método como un parámetro. Cualquier cambio en a
serían entonces sólo ser local el método, y se pierde cuando el método retorna.
C
La razón para que esto no funcionaría en C se debe a C sólo tiene el paso por valor . La única manera de emular pasar por referencia comportamiento en C es pasar su puntero por valor, y luego de-referencia el valor del puntero (accediendo así a la misma ubicación de memoria) al modificar el valor dentro de la método:
void get(char* a)
{
*a = 'g';
}
int main(int argc, char* argv[])
{
char a = 'f';
get(&a);
printf("%c\n", a);
return 0;
}
La ejecución de este programa es la salida:
g
Otros consejos
Referencia tipos de trabajo así (paso por referencia, en lugar de pasar por valor). Es similar a la que pasa un puntero (pase por puntero) en C, pero con una sintaxis más agradable y más seguridad (comprobaciones en tiempo de compilación). La aplicación pasa por el puntero interno.
C ++ permite que pase por referencia (observar la &
, lo que significa que se utiliza una referencia):
void foo(char& bar) {
bar = 42;
}
int main() {
char a;
foo(a);
// a == 42 here
}
Esto es por qué algunos programadores de C ++ no les gusta utilizar referencias por el estilo.
Se ve como un argumento de función -. Usted no tiene idea de la sintaxis si 'a' es modificado o no
Prefiero pasar referencias const (cuando se tiene un objeto grande y una copia sería caro) y devolver referencias o mejor de todos los punteros de paso.