[PDF] [PDF] Chapitre 9 Passage de paramètres

par adresse (existe aussi dans le langage C) ▫ par référence (uniquement dans les langages C++ et Java1) 1 Java : passage par valeur pour les primitifs et 



Previous PDF Next PDF





[PDF] Chapitre 9 Passage de paramètres

par adresse (existe aussi dans le langage C) ▫ par référence (uniquement dans les langages C++ et Java1) 1 Java : passage par valeur pour les primitifs et 



[PDF] INF 321 Les fonctions, passage par valeur/référence, types produits

10 mai 2012 · Passage par valeur/référence Ce que l'on voudrait, c'est passer la référence aux variables a et b plutôt que simplement leurs valeurs; pour 



[PDF] /* Exercice 1 Echange de deux valeurs Ecrire une fonction Echange

Ecrire une fonction Echange qui réalise l'échange de deux valeurs entières passées en argument */ #include void Echange(int *, int *); int main( void) 



[PDF] Chapitre 3 : Procédures et fonctions

Il existe deux types de passage de paramètres : par valeur et par variable (dite aussi par référence ou encore par adresse) Page 5 Initiation à l'algorithmique –  



[PDF] LES VARIABLES : - u-psudfr

La fonction ne modifiera donc jamais le contenu de la variable qu'on lui passe 2- Le passage par référence : En plus du passage par valeur, le C définit le



[PDF] Programmation C++ (débutant)/Les pointeurs

passage de paramètres par référence • Dans cet exemple, la fonction minmax possède 4 paramètres : 2 entiers i et j passés par valeur et 2 entiers min



[PDF] Algorithmes et langage C - Ecole Mohammadia dingénieurs

C'est la valeur qui se trouve à la tête du ruban qui sera attribuée à la variable à lire Une fois, la lecture est 5 2 PASSAGE PAR ADRESSE (PAR REFERENCE)



[PDF] Les fonctions et les procédures en C

Passage de paramètre par valeur – On passe la valeur du paramètre – Implique que le Carré avec passage de paramètres par adresse void carre2(int a, 



[PDF] Sémantique dun programme impératif C++

4 Variables globales / Locales 5 État d'un programme : Pile d'appel 6 Passage de paramètres Passage par valeur Passage par référence Les pointeurs



[PDF] Les procédures

Passage de paramètres : par référence Les passages en mode in, out et in out imposent une recopie de valeur Cette recopie peut être pénalisante lorsque les  

[PDF] passage par référence c++ open classroom

[PDF] acting out psychanalyse

[PDF] le salaire du sniper analyse

[PDF] le salaire du sniper texte pdf

[PDF] le salaire du sniper questionnaire

[PDF] redaction le salaire du sniper

[PDF] le salaire du sniper personnage principal

[PDF] passé composé terminaison

[PDF] passé composé cm2

[PDF] passé composé exercices pdf

[PDF] passé composé utilisation

[PDF] passé composé etre et avoir

[PDF] passé composé cm1

[PDF] passé composé exemple

[PDF] exercices passé composé fle ? imprimer

Chapitre 9 : Passage de paramètres 103

© Mohamed N. Lokbani v1.01 POO avec C++

Chapitre 9

Passage de paramètres

Chapitre 9 : Passage de paramètres 104

© Mohamed N. Lokbani v1.01 POO avec C++

1. Référence

- Référence est un alias à un espace mémoire. - Syntaxe: Type& var = valeur; #include using namespace std ; int main() { int i=0,j=20; int& valeur =i; cout << "i: " << i << " valeur: " <Chapitre 9 : Passage de paramètres 105

© Mohamed N. Lokbani v1.01 POO avec C++

- Les variables de référence doivent être initialisées au moment de leurs déclarations.

#include using namespace std ; int main() { int i=0; int& valeur; // Erreur valeur a été déclarée comme référence mais n'a // pas été initialisée. La manière correcte est // int& valeur = i; cout << valeur << " " << i << endl; return 0;

Chapitre 9 : Passage de paramètres 106

© Mohamed N. Lokbani v1.01 POO avec C++

- Ne peuvent être réaffectées (réassignées) comme alias à d'autres variables. #include using namespace std ; int main() { int i=0, j=20; int& valeur = i; valeur = j; cout << valeur << " " \ << i << " " << j << endl; return 0; La valeur a été déclarée comme référence alias à la variable i Cette valeur n'a pas été réaffectée à j, elle est toujours alias de i. Cette ligne sert uniquement à affecter 20 (donc le contenu de j) à valeur (donc i) \ permet de dire au compilateur que la ligne qui suit fait partie de l'instruction

Chapitre 9 : Passage de paramètres 107

© Mohamed N. Lokbani v1.01 POO avec C++

- Une fois que la référence est déclarée alias d'une autre variable, toutes les opérations que l'on croit

effectuer sur l'alias (c'est à dire la référence) sont en fait exécutées sur la variable d'origine.

#include using namespace std ; int main() { int i=0; int& valeur = i; valeur++; cout << i << endl ; return 0; valeur = i =0 valeur = 1 affiche: 1

Chapitre 9 : Passage de paramètres 108

© Mohamed N. Lokbani v1.01 POO avec C++

- Danger ... // bugref.cpp #include using namespace std ; int main() { double i=0; int& valeur = i; valeur = 250; cout << i << endl ; return 0; valeur = i =0 valeur = 250 affiche: 0 - Le compilateur compile le programme sans erreurs et génère les warnings suivants: bugref.cpp: In function `int main()': bugref.cpp:5: warning: converting to `int' from `double' bugref.cpp:5: warning: initializing non- const `int &' with `double' will use a temporary

Chapitre 9 : Passage de paramètres 109

© Mohamed N. Lokbani v1.01 POO avec C++

- Le compilateur a créé une variable temporaire (signalée dans le second warning), comme suit:

double i=0; int temp = i; int& valeur = temp; conversion double vers int et initialisation de temp avec la valeur de i valeur est une référence à temp (mais pas i) - Modifier valeur revient à modifier temp mais pas i car il n'y a aucun lien entre i et temp.

- De ce fait, faire attention de déclarer le type de la référence identique à la variable référencée, pour éviter

des surprises lors de l'exécution de votre programme.

Utilité

- En général, pour éviter d'utiliser les pointeurs.

- En particulier, lors des passages de paramètres (des classes, des structures) afin d'éliminer la surcharge

causée par la copie de grandes quantités de données.

Chapitre 9 : Passage de paramètres 110

© Mohamed N. Lokbani v1.01 POO avec C++

2. Passage de paramètres

- Pour rappel, il y a 2 types de paramètres: ▪ paramètres réels: dans l'appel de fonction ▪ paramètres formels: dans l'entête de la fonction - En C++, 3 types de passage de paramètres: ▪ par valeur (existe aussi dans les langages C et Java 1) ▪ par adresse (existe aussi dans le langage C) ▪ par référence (uniquement dans les langages C++ et Java 1)

1 Java : passage par valeur pour les primitifs et par référence pour les objets.

Chapitre 9 : Passage de paramètres 111

© Mohamed N. Lokbani v1.01 POO avec C++

2.1. Passage de paramètres par valeurs

#include using namespace std ; void increment(int n,int z) { n=n+z; int main() { int k=7; increment(k,3); cout << k << endl; // affiche 7 mais pas 10 (i.e. 7+3) return 0; Aucun lien entre paramètre formel et paramètre réel. k = 7 //////////////// n = 7 z = 3

Pile d'exécution

Paramètre formel

n est initialisé avec la valeur du paramètre réel k=7. increment(k,3) // k=7

Devient

10 (7+3)

Chapitre 9 : Passage de paramètres 112

© Mohamed N. Lokbani v1.01 POO avec C++

2.2. Passage de paramètres par adresses

- Pour modifier le paramètre réel, on passe son adresse plutôt que sa valeur. #include using namespace std ; void increment(int *n,int z) { *n= *n + z; int main() { int k=7; increment(&k,3); cout << k << endl; // affiche 10 car c'est l'adresse qui a été passée. return 0;

Chapitre 9 : Passage de paramètres 113

© Mohamed N. Lokbani v1.01 POO avec C++

- Il y a un lien entre paramètre formel et paramètre réel. k = 7 ///////////////// n z=3

Pile d'exécution

- Paramètre formel n est initialisé avec le contenu de l'adresse pointant sur k.

- Il y a un lien potentiel entre les paramètres formels de la fonction et les paramètres réels.

- La gestion des adresses est effectuée par le programmeur (lourde et difficile à lire). increment(k,3) // k=7 devient

10 (7+3)

Adresse pointant

Chapitre 9 : Passage de paramètres 114

© Mohamed N. Lokbani v1.01 POO avec C++

2.3. Passage de paramètres par référence

- En C++ le compilateur peut se charger lui même de la gestion des adresses. - Le paramètre formel est un alias de l'emplacement mémoire du paramètre réel. #include using namespace std; void increment(int& n,int z) { n= n + z; int main() { int k=7; increment(k,3); cout << k << endl; // affiche 10 car c'est l'adresse qui a été passée. return 0;

Chapitre 9 : Passage de paramètres 115

© Mohamed N. Lokbani v1.01 POO avec C++

2.4 Exemple du swap

- Que va afficher le programme suivant sur la sortie standard? Réécrire le code suivant dans les 2 cas

suivants: -1- void swap(int a,int& b){...} -2- void swap(int& a,int& b){...} #include using namespace std ; void swap(int a,int b){ int c; c=a;a=b;b=c; int main() { int i=4,j=7; swap(i,j); cout << i << " " << j << endl; return 0;

Chapitre 9 : Passage de paramètres 116

© Mohamed N. Lokbani v1.01 POO avec C++

3. Passage d'un tableau

- 2 configurations possibles:

3.1. Par pointeur

#include using namespace std; void fonction(int* tableau, int taille) { for (int i=0; iChapitre 9 : Passage de paramètres 117

© Mohamed N. Lokbani v1.01 POO avec C++

3.2. Par semi-référence

#include using namespace std ; void fonction(int tableau[], int taille) { for (int i=0; iAu lieu d'un pointeur

Chapitre 9 : Passage de paramètres 118

© Mohamed N. Lokbani v1.01 POO avec C++

4. Quand utiliser une référence

(voir aussi P. Prados @ http://perso.club-internet.fr/pprados/Langage/CPP/ref/ref.html)

4.1. Comme attribut

- Revoir le paragraphe sur les références.

4.2. Comme un paramètre

- Une question difficile à trancher :

▪ Si le paramètre ne doit être consulté que par la méthode, il faut recevoir une référence (assez

souvent constante).

▪ Si le paramètre reçu par la méthode peut être absent, i.e. l'utilisateur peut envoyer la valeur

NULL, il faut recevoir dans ce cas un pointeur:

Chapitre 9 : Passage de paramètres 119

© Mohamed N. Lokbani v1.01 POO avec C++

void f(const TEST& x){ // x est une référence (if (&x == NULL) ... // À ne pas faire ... référence ne peut pas être NULL. - Utilisez la surcharge ... void f(const TEST& x){ // traite le cas d'un passage par référence void f(const void* x){ // traite le cas d'un pointeur NULL - Essayez de cogiter sur un exemple complet.

Chapitre 9 : Passage de paramètres 120

© Mohamed N. Lokbani v1.01 POO avec C++

4.3. En retour d'une méthode (ou fonction)

#include using namespace std ; int& fonction(int &a) { a += 10; return a; int main() { int val,test = 20; val = fonction(test); cout << "val: " << val << " " \ << "test: " << test << endl; // affiche: val: 30 test: 30 fonction(test) = 250; cout << test << endl; // affiche: 250 return 0;

Chapitre 9 : Passage de paramètres 121

© Mohamed N. Lokbani v1.01 POO avec C++

Danger ...

int& exemple() { int i=10; // i est une variable locale de la fonction exemple // durée de vie entre {} return i; // exemple va retourner un alias sur une variable // qui va cesser d'exister!

Chapitre 9 : Passage de paramètres 122

© Mohamed N. Lokbani v1.01 POO avec C++

quotesdbs_dbs11.pdfusesText_17