2010-08-03 4 views
0

IBM explique le passage C++ par référence dans l'exemple ci-dessous (source incluse).C++ passe par le programme de référence

Si je changeais void swapnum... en void swapnum(int i, int j), passerait-il en valeur?

// pass by reference example 
// author - ibm 

#include <stdio.h> 

void swapnum(int &i, int &j) { 
    int temp = i; 
    i = j; 
    j = temp; 
} 

int main(void) { 
    int a = 10; 
    int b = 20; 

    swapnum(a, b); 
    printf("A is %d and B is %d\n", a, b); 
    return 0; 
} 

Source

Répondre

6

Toute permutation effectuée si vous passez par la valeur est seulement affectée ou vue dans la fonction dans laquelle ils sont passés et non le code appelant. En outre, une fois que vous revenez au principal, vous verrez que a et b n'ont pas changé. C'est pourquoi lors de l'échange de numéros, vous voulez passer par réf.

Si vous demandez simplement si c'est ce que cela s'appellerait, alors oui vous avez raison, vous passeriez en valeur.

est un exemple:

#include <stdio.h> 

void swapnum(int &i, int &j) { 
    int temp = i; 
    i = j; 
    j = temp; 
} 

void swapByVal(int i, int j) { 
    int temp = i; 
    i = j; 
    j = temp; 
} 

int main(void) { 
    int a = 10; 
    int b = 20; 

    swapnum(a, b); 
    printf("swapnum A is %d and B is %d\n", a, b); 

    swapByVal(a, b); 
    printf("swapByVal A is %d and B is %d\n", a, b); 

    return 0; 
} 

Exécutez ce code et vous devriez voir que les changements ne persistent que en échangeant par référence, qui est après que nous sommes revenus Retour à les valeurs sont permutées. Si vous passez par la valeur, vous verrez qu'appeler cette fonction et revenir à la main qu'en fait a et b n'ont pas permuté.

+0

Vous avez oublié de nommer votre deuxième méthode swapnum swapByVal – RickNotFred

+0

@RichNotFred - Je dirais que c'est encore assez proche de lundi alors s'il vous plaît pardonnez-moi :). Edité cependant. – JonH

3

Oui, mais cela signifie que swapnum ne fonctionnera plus comme son nom l'indique

+0

Merci, Mike. Donc je suppose que je peux aussi passer des pointeurs vers swapnum, mais je devrais passer leurs adresses? exemple: int * p, * q; swapnum (& p, & q) –

+0

@Kevin - C'est vrai que vous passeriez l'adresse du pointeur. – JonH

+0

Si vous avez réellement passé * p, * q, vous passeriez en valeur. – JonH

2

Oui. L'opérateur '&' spécifie que le paramètre doit pointer vers l'adresse mémoire de ce qui a été passé.

En supprimant cet opérateur, une copie de l'objet est faite et transmise à la fonction.

Questions connexes