Vous êtes sur la page 1sur 8

2/13/2023

POO – la programmation C++  References


 Pointers

Abdelhak BOULAALAM

https://sites.google.com/a/usmba.ac.ma/boulaalam/
abdelhak.boulaalam@usmba.ac.ma

A. BOULAALAM (USMBA/ENSA) POO CPP 1 A. BOULAALAM (USMBA/ENSA) POO CPP 2

Partie 1: Éléments de base ...C++ Partie 1: Éléments de base ...C++

Type Pointeurs (rappel) Type Pointeurs (rappel)

 Pointeurs?  Pointeurs?
 Les objets résident en mémoire.  Les pointeurs sont des variables/objets, comme
 l’ accès et la manipulation des objets via des n'importe quel autre type d'objet.
variables.  Leur valeur est l'adresse d'un objet, un emplacement
 Une autre façon d'accéder à un objet en mémoire mémoire où l'objet est stocké.
consiste à utiliser des pointeurs.  Pour accéder à une valeur stockée dans un objet
 Un objet en mémoire est caractérisé par 2 choses: pointé par un pointeur, nous devons déréférencer un
son type et une adresse. pointeur.
 Cela nous permet d'accéder à l'objet via un pointeur.  Le déréférencement se fait en ajoutant un nom de

 Les pointeurs sont des types qui peuvent contenir


pointeur (variable) avec un opérateur de
l'adresse d'un objet particulier. déréférencement *
A. BOULAALAM (USMBA/ENSA) POO CPP 3 A. BOULAALAM (USMBA/ENSA) POO CPP 4

1
2/13/2023

Partie 1: Éléments de base ...C++ Partie 1: Éléments de base ...C++

Type References Type References

 References?  References?
 Un autre concept (un peu) similaire est un type de  Exemple: Tapez le code suivant:
référence.
#include <iostream>
 Un type de référence est un alias vers un objet existant en
mémoire. using namespace std;
 Les références doivent être initialisées. int main()
 Nous décrivons un type de référence comme type_name {
cout << "CM manipulation references !" << endl;
suivi d'une &. int x = 123;
 Exemple: Nous avons maintenant deux noms différents qui int& y; Q1: Commenter le code
return 0;
int main() font référence au même objet int en mémoire.
} Q2: Compiler! Explications
{ Si nous attribuons une valeur différente à l'un
int x = 123; d'eux, ils changent tous les deux car nous avons
int& y = x; un objet en mémoire, mais nous utilisons deux ...CMreferencesExemples\main.cpp|9|error: 'y' declared as
} noms différents reference but not initialized|
A. BOULAALAM (USMBA/ENSA) POO CPP 5 A. BOULAALAM (USMBA/ENSA) POO CPP 6

Partie 1: Éléments de base ...C++ Partie 1: Éléments de base ...C++

Type References Type References

 References?  References?
 Exemple: Tapez le code suivant:  Exemple: Tapez le code suivant:
#include <iostream>

using namespace std;

int main()
{
cout << "CM manipulation references !" << endl; Q3: Corriger l’erreur
int x = 123; Q4: Compiler! Explications
int& y = x; // initialisation obligatoire
return 0; Q5: Afficher x et y
} Q6: Changer la valeur de x
Q7: Exécuter! Explications
Q8: changer la valeur de y Q10: Exécuter! Explications
Q9: Exécuter! Explications
A. BOULAALAM (USMBA/ENSA) POO CPP 7 A. BOULAALAM (USMBA/ENSA) POO CPP 8

2
2/13/2023

Partie 1: Éléments de base ...C++ Partie 1: Éléments de base ...C++

Type References Type référence (&) et déréférencement automatique

 Une référence sur une variable : C’est un  Déréférencement automatique :


identificateur qui joue le rôle d'un alias (pseudo) de  Application automatique de l'opérateur d'indirection
cette variable.
* à chaque utilisation de la référence
Syntaxe: type &nom_ref = var; int i = 5;
 Une référence ne peut être vide, elle doit toujours être int & j = i; // j reçoit i
initialisée lors de sa déclaration: int k = j; // k reçoit 5
i.e : int &rn ; // erreur! j += 2; // i reçoit i+2 (=7)
 Il est possible de référencer des valeurs numériques, dans j = k; // i reçoit k (=5)
ce cas il faut les déclarer comme constantes:
i.e: int &rn=3; // erreur! Une fois initialisée, une référence ne peut plus
const int &rn=3; // OK
être modifiée – elle correspond au même
 Les références et les pointeurs sont liés. emplacement mémoire
A. BOULAALAM (USMBA/ENSA) POO CPP 9 A. BOULAALAM (USMBA/ENSA) POO CPP 10

Partie 1: Éléments de base ...C++ Partie 1: Éléments de base ...C++

Pointeurs (1/7) Pointeurs (2/7)


 Mémoire: décomposée en "cases" (1 octet) consécutives  Pointeur = variable contenant une adresse en mémoire
numérotées (ayant une adresse) que l’on peut manipuler
individuellement ou par groupe de cases contigües
int i=10;
1.Réservation d’une zone mémoire de 4 octets (la 1ère
libre)
2. Association du nom i à l’adresse du début de la zone
3. Copie de la valeur en binaire dans la zone mémoire
&i correspond à l’adresse du début de la zone mémoire où est stockée
la valeur de i

A. BOULAALAM (USMBA/ENSA) POO CPP 11 A. BOULAALAM (USMBA/ENSA) POO CPP 12

3
2/13/2023

Partie 1: Éléments de base ...C++ Partie 1: Éléments de base ...C++

Pointeurs (3/7) Pointeurs (4/7)

 2 opérateurs : new et delete


float *PointeurSurReel = new float;
//Équivalent en C :
//PointeurSurReel = (float *) malloc(sizeof(float));
int *PointeurSurEntier = new int[20];
// Équivalent en C :
// PointeurSurEntier = (int *) malloc(20 * sizeof(int));
delete PointeurSurReel; // Équivalent en C : free(pf);
delete [] PointeurSurEntier; //Équivalent en C: free(pi);
 new type : définition et allocation d’un pointeur de type type*
 new type [n] : définition d’un pointeur de type type* sur un
tableau de n éléments de type type
 En cas d’échec de l’allocation, new déclenche une exception du
type bad_alloc

A. BOULAALAM (USMBA/ENSA) POO CPP 13 A. BOULAALAM (USMBA/ENSA) POO CPP 14

Partie 1: Éléments de base ...C++ Partie 1: Éléments de base ...C++

Pointeurs (5/7) Pointeurs (6/7)


 Manipulation de la valeur pointée :  Manipulation des pointeurs et des valeurs pointées (suite)
int *p = new int; // p est de type int* int *p1 = new int;
(*p)=3; // (*p) est de type int int *p2 = p1 ; // p2 pointe sur la même zone mémoire que p1
int *tab = new int [20]; // tab est de type int* *p2=11; //=> *p1=11; car p1 et p2 pointe sur la même zone mémoire
int *tab = new int [20];
// tab correspond à l’adresse du début de la zone mémoire
*tab++=3; // équivalent à *(tab++)=tab[0]=3
// allouée pour contenir 20 entiers // Equiv à *tab=3; tab++;
(*tab)=3; // équivalent à tab[0]=3 // *++tab=3 Equiv à tab++; *tab=3;
 Manipulation de pointeur :
tab++; // décalage de tab d’une zone mémoire de taille (*tab)++; // Ici on ne décale pas le pointeur!
sizeof(int) int i=12;
// tab pointe sur la zone mémoire devant contenir le p2=&i; // p2 pointe sur la zone mémoire où est stockée i
2ème élément du tableau *p2=13; // => i=13
(*tab)=4; // équivalent à tab[0]=4 car on a fait tab++ avant p2=tab; // p2 pointe comme tab sur le 2ème élément du tableau
// car on a décalé tab à l’instruction précédente p2++; // p2 pointe sur le 3ème élément (d’indice 2)
*(tab+1)=5; // équivalent à tab[1]=5 sans décaler tab *p2=5; // => tab[2]=5 mais tab pointe toujours sur le 2ème
élément
tab-=2 ; // tab est décalée de 2*sizeof(int) octets
p1=p2; // => p1 pointe sur la même zone que p2
 Libération de la mémoire allouée : // ATTENTION : l’adresse de la zone allouée par new pour p1
 delete p; // est perdue!!
 delete [] tab; Ne pas oublier de libérer la mémoire allouée!!
A. BOULAALAM (USMBA/ENSA) POO CPP 15 A. BOULAALAM (USMBA/ENSA) POO CPP 16

4
2/13/2023

Partie 1: Éléments de base ...C++ Partie 1: Éléments de base ...C++

Pointeurs (7/7) Déclaration des fonctions

 Pointeurs de pointeur :  L'utilisation d'une fonction sans aucune


déclaration ou définition au préalable est une
erreur à la compilation.
 Le prototype doit figurer dans tout fichier source
qui utilise cette fonction et ne contenant pas sa
définition.
 Une fonction en C++ doit spécifier son type de
retour, void si elle ne retourne rien.
 Précautions à prendre lors de la manipulation des pointeurs : fct(int, int); // erreur!
 Allouer de la mémoire (new) ou affecter l’adresse d’une zone mémoire
utilisée (&) avant de manipuler la valeur pointée
void fct(int, int); //OK
 Libérer (delete) la mémoire allouée par new int fct(void);  int fct();
 Ne pas perdre l’adresse d’une zone allouée par new
A. BOULAALAM (USMBA/ENSA) POO CPP 17 A. BOULAALAM (USMBA/ENSA) POO CPP 18

Partie 1: Éléments de base ...C++ Partie 1: Éléments de base ...C++

Transmission des arguments Transmission des arguments – par valeur


 En C++ il y a 3 méthodes de passage des variables en #include <iostream>
paramètres à une fonction: void echange(int,int); // Déclaration (prototype) de la fonction
// A mettre avant tout appel de la fonction
 Passage par valeur: la valeur de la variable en paramètre est int main()
copiée dans une variable temporaire. { int n=10, p=20;
cout << "avant appel: " << n << " " << p << endl;
 Les modifications opérées sur les arguments dans la fonction
echange(n,p); // Appel de la fonction
n'affectent pas la valeur de la variable passée en paramètre. cout << "apres appel: " << n << " " << p << endl;
 Passage par adresse: consiste à passer l'adresse d'une variable }
en paramètre. void echange(int a, int b) // Définition de la fonction
{ int c;
 Toute modification du paramètre dans la fonction affecte directement
cout << "debut echange : " << a << " " << b << endl;
la variable passée en paramètre.
c=a; a=b; b=c;
 Passage par référence: le passage par adresse présente certains cout << "fin echange : " << a << " " << b << endl;
inconvénients, pour résoudre ces inconvénients, C++ introduit }
le passage par référence. Lors de l’appel echange(n,p): a prend la valeur de n et b prend la valeur de p
 En pratique, il est recommandé ( pour des raisons de Mais après l’appel (à la sortie de la fonction), les valeurs de n et p restent
performances) de passer par référence tous les paramètres inchangées
dont la copie peut prendre beaucoup de temps.

A. BOULAALAM (USMBA/ENSA) POO CPP 19 A. BOULAALAM (USMBA/ENSA) POO CPP 20

5
2/13/2023

Partie 1: Éléments de base ...C++ Partie 1: Éléments de base ...C++

Transmission des arguments – par adresse Transmission des arguments – par référence
#include <iostream>
void echange(int*,int*); // Modification de la signature
// Utilisation de pointeurs
int main()
{ int n=10, p=20;
cout << "avant appel: " << n << " " << p << endl;
echange(&n,&p);
cout << "apres appel: " << n << " " << p << endl;
}
void echange(int* a, int* b)
{ int c;
cout << "debut echange : " << *a << " " << *b << endl;
c=*a; *a=*b; *b=c;
cout << "fin echange : " << *a << " " << *b << endl;
}

Lors de l’appel echange(&n,&p): a pointe sur n et b pointe sur p Lors de l’appel echange(n,p): a et n correspondent au même emplacement
Donc après l’appel (à la sortie de la fonction), les valeurs de n et p ont été mémoire, de même pour b et p
modifiées Donc après l’appel (à la sortie de la fonction), les valeurs de n et p sont modifiées

A. BOULAALAM (USMBA/ENSA) POO CPP 21 A. BOULAALAM (USMBA/ENSA) POO CPP 22

Partie 1: Éléments de base ...C++ Partie 1: Éléments de base ...C++

Surcharge des fonctions Allocation dynamique (rappel)


 La surcharge (surdéfinition) des fonctions consiste à donner un même  En C++, les fonctions malloc et free sont
nom à plusieurs fonctions.
int max(int a, int b); // fonction 1 remplacées avantageusement par les opérateurs
int max( int a, int b, int c); // fonction 2 unaire new et delete.
int max( int* tab, int taille); // fonction 3 main()
 Pour différencier entre deux fonctions qui portent le même nom, le { int *pi = new int;
compilateur regarde le type et le nombre des arguments effectifs: int *tab = new int[10];
 la liste des types des arguments d'une fonction s'appelle la signature
if ((pi != NULL) && (tab != NULL))
de la fonction.
 La surcharge n'est acceptable que si toutes les fonctions ont des
{
signatures différentes, et n'a un sens que si les surdéfinitions ont un ...
même but. delete pi;
 Il est également possible de surcharger les opérateurs( voir les classes) delete [] tab;
}
}
A. BOULAALAM (USMBA/ENSA) POO CPP 23 A. BOULAALAM (USMBA/ENSA) POO CPP 24

6
2/13/2023

Partie 1: Éléments de base ...C++

STL
 STL: Librairie STL (Standard Template Library) : incluse dans la
norme C++ ISO/IEC 14882 et développée à Hewlett Packard
(Alexander Stepanov et Meng Lee) - définition de conteneurs (liste,
vecteur, file etc.)

A. BOULAALAM (USMBA/ENSA) POO CPP 25 A. BOULAALAM (USMBA/ENSA) POO CPP 26

Partie 1: Éléments de base ...C++ Partie 1: Éléments de base ...C++

La POO - Introduction Classes et Objets

 En structure de données, vous avez appris à  Classe :


regrouper des éléments de données de types  Regroupement de données (attributs ou champs) et de
méthodes (fonctions membres)
différents à l'aide d'une structure (struct).  struct  Extension des structures (struct) avec différents niveaux de visibilité
en C et automatiquement en C++. (protected, private et public)
 C++ fournit un autre type de données structurées,  En programmation orientée-objet pure : encapsulation des
appelé classe, spécialement conçu pour regrouper données et accès unique des données à travers les méthodes
des données et des fonctions.
 Alors c’est quoi une classe?  Objet : instance de classe
 Attributs et méthodes communs à tous les objets d’une classe
 Dans la méthodologie de résolution de problèmes  Valeurs des attributs propres à chaque objet
appelée conception orientée objet (OOD):
 la première étape consiste à identifier les composants, appelés
objets.  Principe de Encapsulation
 Un objet combine les données et les opérations sur ces données  Caractérisation d’un objet par les spécifications de ses
dans une seule unité. méthodes : interface
 Indépendance vis à vis de l’implémentation
A. BOULAALAM (USMBA/ENSA) POO CPP 27 A. BOULAALAM (USMBA/ENSA) POO CPP 28

7
2/13/2023

Partie 1: Éléments de base ...C++ Partie 1: Éléments de base ...C++

Classes et Objets Classes et Objets

 La syntaxe générale pour définir une classe est:  Exemple 1:

class classIdentifier classMembersList se compose


{ de :
classMembersList
}; 1- déclarations de variables et /
ou de 2- fonctions.
Principe: un membre d'une
classe peut être soit une
variable (pour stocker des
données) ou une fonction (pour
manipuler des données).
A. BOULAALAM (USMBA/ENSA) POO CPP 29 A. BOULAALAM (USMBA/ENSA) POO CPP 30

 TAR- Travail à rendre Séance 3


 Proposer une classe Etudiant qui regroupe
l’ensemble des informations sur un étudiant de
l’université.
 Tracer une représentation graphique de cette classe.
 Donner le code source C++ de cette classe (le fichier .h et
.cpp)
 Dans la fonction principale, déclarer un tableau des
étudiants.
 Initialiser le tableau.
 Afficher l’ensemble des informations des etudiants.

A. BOULAALAM (USMBA/ENSA) POO CPP 31

Vous aimerez peut-être aussi