Question

Je suis en train d'apprendre c ++, et provenant de c, certains appels de fonctions que je vois dans le livre me confondez:

char a;
cin.get(a);

En C, cela ne pouvait fonctionner éventuellement, si vous avez fait cela, il n'y aurait pas moyen d'obtenir la sortie, parce que vous passez par valeur et non par référence, pourquoi ce travail en c ++? Est-ce référencement et dereferncing fait implicite (le compilateur sait que cin.get a besoin d'un pointeur, il est donc référencé)?

Était-ce utile?

La solution

C ++

Cela fonctionne en C ++ parce que la signature de la fonction pour get() est probablement ceci:

void get(char& a); // pass-by-reference

Le symbole & après char indique au compilateur que lorsque vous passez une valeur char, il doit passer dans une référence à la char plutôt que de faire une copie de celui-ci.

Cela signifie essentiellement que toutes les modifications apportées à l'intérieur de get() seront pris en compte dans la valeur de a à l'extérieur du procédé.

Si la signature de fonction pour get() était ceci:

void get(char a); // pass-by-value

a serait ensuite transmise par valeur , ce qui signifie une copie de a est faite avant d'être passé dans le procédé en tant que paramètre. Toute modification apportée à a serait alors la méthode seulement locale, et perdu quand la méthode retourne.

C

La raison pour laquelle cela ne fonctionnerait pas en C est parce que C ne dispose que passer par valeur . Le seul moyen pour émuler passage par référence comportement en C est de passer son pointeur de valeur, puis de-référence la valeur du pointeur (accédant ainsi le même emplacement de mémoire) lors de la modification de la valeur dans la méthode:

void get(char* a)
{
    *a = 'g';
}

int main(int argc, char* argv[])
{
    char a = 'f';
    get(&a);
    printf("%c\n", a);

    return 0;
}

L'exécution de ce programme affichera:

g

Autres conseils

Les types de référence fonctionnent comme ça (passage par référence, au lieu de passer par valeur). Il est similaire à faire passer un pointeur (passer par le pointeur) en C, mais avec une syntaxe plus agréable et plus de sécurité (compilation chèques). La mise en œuvre passe par le pointeur interne.

C ++ permet passe par référence (noter la &, ce qui signifie que l'on utilise une référence):

void foo(char& bar) {
    bar = 42;
}

int main() {
    char a;
    foo(a);
    // a == 42 here
}

C'est pourquoi certains programmeurs C ++ n'aiment pas utiliser des références comme ça.
Il ressemble à une fonction arguement -. Vous n'avez pas la moindre idée de la syntaxe si « a » est modifié ou non

préfèrent passer des références const (lorsque vous avez un grand objet et une copie serait cher) et le retour des références ou le meilleur de tous les pointeurs qui passent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top