2011-05-30 4 views
1

Le code suivant compile et s'exécute mais je ne suis pas sûr de ce qui se passe exactement à un niveau inférieur. Une référence ne stocke-t-elle pas simplement l'adresse de l'objet référencé? Si oui, les deux fonctions de test reçoivent une adresse en tant que paramètre? Ou l'implémentation C++ est-elle capable de différencier ces types d'une autre manière?Comment fonctionne la surcharge de fonction dans les cas suivants?

int main() { 
    int i = 1; 
    cout << test(i) << endl; 
} 

char test(int &i) { 
    return 'a'; 
} 

char test(int *i) { 
    return 'b'; 
} 

Répondre

7

Comme int& et int* sont des types distincts et i peuvent être traités comme un int& mais pas comme int*, la résolution de surcharge est absolument sans ambiguïté ici.

Peu importe à ce stade, les références ne sont qu'un type de pointeur quelque peu dissimulé. D'un point de vue linguistique, ce sont des types distincts.

+0

ah ok cela rend les choses claires pour moi –

1

votre code correspond uniquement avec char test(int&i) puisque vous passez un int& à la fonction et qui ne peut être converti en int*

2

Les références en C++ sont plus proches d'un alias que d'un pointeur. Une référence n'est pas une variable séparée en soi, mais c'est un nouveau "nom" pour une variable existante. Dans votre exemple, le premier test est appelé car vous transmettez un entier à la fonction. Un pointeur est une variable séparée qui contient l'adresse d'une autre variable, de sorte que la deuxième fonction à appeler vous deviez appeler test avec un pointeur. Comme si .. test(&i); Alors qu'un peu déroutant l'opérateur & obtient l'adresse d'une variable tandis qu'une variable déclarée avec un & comme int &i déclare une référence.

Questions connexes