2017-09-19 4 views
0

Je suis nouveau en C++ et j'appelle appel par référence maintenant.Pourquoi nous devons passer les valeurs au lieu de l'adresse dans une fonction "appel par référence" en C++?

j'ai appris ce bloc de code sur mon matériel:

void callByRef(&a, &b); 

int main(){ 
    int k = 12; 
    int m = 4; 
    callByRef(k, m) //QUESTION HERE 
    return 0; 
} 

void callByRef(&a, &b){ 
    a += 3; 
    b -= 2; 
    return; 
} 

Donc, ma question est lors de la déclaration callByRef, nous utilisons les adresses des a et b les paramètres, donc quand nous appelons callByRef dans la principale, pourquoi faut-il passer (k, m) au lieu de (& k, m)?

C'est fondamental, mais je veux juste obtenir la bonne image pour mes études futures. Merci les gars!

+2

"nous utilisons les adresses de a et b comme paramètres" Quoi? La déclaration devrait ressembler à 'void callByRef (int & a, int & b)', et c'est __not__ en prenant l'adresse des paramètres, c'est les déclarer comme références. – tkausl

+1

'void callByRef (& a, & b)' [n'est pas légal C++] (https://ideone.com/dpTUvj). Si c'est ce que contient votre matériel de cours, vous devriez vous plaindre et réclamer votre argent. –

Répondre

0

La fonction callByRef() passe les références en tant qu'arguments de sorte que vous n'avez pas besoin d'envoyer la référence explicite à la fonction. Avoir une lecture à travers cela pour comprendre un peu mieux.

Tutorial

+0

Merci pour votre réponse hahahakebab! Le lire maintenant. – Hang

2

L'opérateur de &a désigne l'adresse d'une variable, l'opérateur de *a signifie que le contenu de la mémoire adressée par la variable a. Maintenant, la définition de la fonction suit:

void callByRef(int &a, int &b){ 
    a += 3; 
    b -= 2; 
    return; 
} 

int &a signifie que sera un reference à une variable de type int. Par conséquent, à chaque fois que vous appelez la fonction, vous devez passer la variable elle-même plutôt que son adresse, donc callByRef(a, b) et non callByRef(&a, &b).

La raison de cette déclaration est la suivante, les paramètres passés à la fonction, transmis par valeur, à savoir le contenu de la variable copiée littéralement dans la variable de fonction, donc aucun changement dans la fonction n'aura d'effet. Par exemple:

void callByVal(int a, int b){ 
    a += 3; 
    b -= 2; 
    return; 
} 

et ayant:

x = 5; 
y = 10; 

appelant callByVal(x, y) aura pas d'effet sur x et y. Pour y remédier, vous devez passer des paramètres par référence ou int &a ou comme alternative, vous pouvez passer le pointeur et la mémoire de mise à jour directement:

void callByPtr(int *a, int *b){ 
    *a += 3; 
    *b -= 2; 
    return; 
} 

Et maintenant il judicieux de passer des variables adresses, par exemple callByPtr(&a, &b).

0

Vous ne transmettez pas la valeur. Les références en C++ ne sont pas exactement comme des pointeurs. Pensez à eux comme étant simplement un autre nom pour un objet.

Naturellement, vous devez lier ce nom à un objet pour que la référence s'y réfère. Ainsi, lorsque nous écrivons int &i = k;, nous disons que la variable déjà nommée k peut être appelée i. Pour lier la référence, nous devons nommer l'autre objet. Et le nom de l'objet est k, pas &k.

La même chose s'applique aux paramètres de fonction et aux arguments.La fonction callByRef est spécifiée pour opérer sur deux objets, elle appellera a et b. Lorsque vous appelez cette fonction, vous devez nommer les objets d'origine auxquels il se référera. Et les objets d'origine sont nommés k et m, et non &k et &m.