4. Passage par valeur
Principe
Les arguments sont copiés dans des objets
temporaires qui sont crées lors du passage d'arguments
et qui sont détruit à la fin de l'exécution de la fonction .
Toutes les modifications effectuées sur ces objets
temporaires seront donc perdues à la fin de la fonction
et n'auront aucune incidence sur l'objet passé en
argument lors de l'appel de la fonction.
5. Passage par valeur
Exemple:
void incremente(int i) /* i est la copie de la valeur passée en
paramètre */
{
i++; /* Modifie i, mais pas la variable fournie par l'appelant. */
}
int main() {
int j = 12;
incremente(j); /* Le contenu de j est copié dans i. j n'est pas
modifié. Il vaut toujours 12. */
cout << j << endl; // Affiche 12
}
6. Passage par adresse
Notion d’adresse:
Tout objet manipulé par l'ordinateur est stocké dans
sa mémoire. On peut considérer que cette mémoire est
constituée d'une série de « cases », cases dans
lesquelles sont stockées les valeurs des variables ou les
instructions du programme. Pour pouvoir accéder à un
objet, c'est-à-dire au contenu de la case mémoire dans
laquelle cet objet est enregistré, il faut connaître le
numéro de cette case. Autrement dit, il faut connaître
l'emplacement en mémoire de l'objet à manipuler. Cet
emplacement est appelé l'adresse de la case mémoire.
7. Passage par adresse
Principe:
Les arguments sont des pointeurs qui contiennent
l'adresse en mémoire des objets que l'on veut
manipuler. Il n'y a donc plus de copie, plus de variable
locale. Toute modification du paramètre dans la
fonction appelée entraîne la modification de la
variable passée en paramètre.
8. Passage par adresse
Exemple:
void incremente(int * i) { /*incremente attend l’adresse d’un entier*/
(*i)++;
}
int main() {
int j = 12;
incremente(&j); /* On passe l'adresse de j en paramètre. */
cout << j << endl; // Affiche 13
}
9. Cependant, plusieurs problèmes se posent au niveau
syntaxique pour le passage par adresse :
la syntaxe est lourde dans la fonction, à cause de
l'emploi de l'opérateur * devant les paramètres ;
la syntaxe est dangereuse lors de l'appel de la fonction,
puisqu'il faut systématiquement penser à utiliser
l'opérateur & devant les paramètres.
10. Passage par référence
Notion de référence:
Les références sont des synonymes d'identificateurs.
Elles permettent de manipuler une variable sous un
autre nom que celui sous laquelle cette dernière a été
déclarée.
11. Passage par référence
Notion de référence:
Toute référence doit se référer à un identificateur : il
est donc impossible de déclarer une référence sans
l'initialiser. De plus, la déclaration d'une référence ne
crée pas un nouvel objet comme c'est le cas pour la
déclaration d'une variable par exemple. En effet, les
références se rapportent à des identificateurs déjà
existants.
12. Passage par référence
Principe:
La fonction appelée manipule directement l'objet qui
lui est passé par référence. Il n'y a pas de copie ni de
construction d'objet temporaire lors de ce type de
passage.
13. Passage par référence
Exemple:
void incremente(int & i) {
i++; // Modifie le paramètre passé en référence
}
int main() {
int j = 12;
incremente(j); // L'opérateur & n'est pas nécessaire pour appeler
incremente
cout << j << endl; // Affiche 13
}