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)?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top