Académique Documents
Professionnel Documents
Culture Documents
POO Chap2
POO Chap2
EMSI - Tanger
▪ Pour identifier les composants d’un objet usuel, une bonne méthode
consiste à faire de cet objet une description littérale, puis de
souligner les principaux noms communs et verbes. Les noms
communs donnent les éléments constituants, les verbes donnent
les fonctions.
Objet usuel
Comment décrire un objet usuel ?
▪ Les langages à objets comme le C++ sont supérieurs aux langages classiques
comme le C, car ils font reposer le gros du travail sur des “briques logicielles
intelligentes” : les objets.
▪ Tout objet appartient à une classe, on dit aussi qu’il est une
instance de cette classe,
Objet informatique — Classe
Pour utiliser les objets, il faut d’abord décrire les classes auxquelles ces objets
appartiennent.
class Maclasse
{
public:
déclarations des données et fonctions-membres publiques
private:
déclarations des données et fonctions-membres privées
};
Stratégie D.D.U
2. Définition :
▪ C’est la partie implémentation de la classe. Elle se fait dans un fichier dont le nom se
termine par .cpp.
▪ Ce fichier contient les définitions des fonctions-membres de la classe, c’est-à-dire
le code complet de chaque fonction.
3. Utilisation :
▪ elle se fait dans un fichier dont le nom se termine par .cpp
Stratégie D.D.U
Structure d’un programme en C++
Ce dernier fichier contient la fonction main, et c’est par cette fonction que commence
l’exécution du programme.
Stratégie D.D.U
Structure d’un programme en C++
Stratégie D.D.U
Structure d’un programme en C++
Remarque:
Rappelons que la directive d’inclusion #include permet d’inclure un fichier de
déclarations dans un autre fichier :
On écrira:
▪ #include <biblio.h> s’il s’agit d’un fichier standard livré avec le compilateur C++,
▪ #include "biblio.h" s’il s’agit d’un fichier écrit par nous-mêmes.
Stratégie D.D.U
Mise en œuvre
Exemple () :
Réaliser une classe Point permettant de manipuler un point d’un plan. La classe
comporte:
▪ Deux constructeurs :
▪ Un reçoit les arguments ( coordonnées du Point).
▪ Un sans paramètres (constructeurs par défaut).
▪ Une fonction initialiser ( int, int) qui initialise les coordonnées du point.
▪ Une fonction pour afficher les coordonnées du point.
▪ Une fonction deplacer( int, int) qui prend deux paramètres, permettant de
faire une transition par multiplier les coordonnées du point par les
paramètres de la fonction.
Ecrire un petit programme d’essai (main) déclarant deux point et testant les
fonctions.
Constructeurs, destructeurs, initialisation et
recopie
▪ Création
▪ déclaration (objets statiques ou automatiques)
▪ new (objets dynamiques)
▪ Mort
▪ fin de la portée (objets statiques ou automatiques)
▪ delete (objets dynamiques)
Initialisation des attributs
Syntaxe de base :
Exemple
Construction d'un objet
Syntaxe :
NomClasse instance(valarg1, ..., valargN);
où valarg1, ..., valargN sont les valeurs des arguments du
constructeur.
Exemple :
Rectangle r1(18.0, 5.3); // invocation du constructeur
Construction des attributs
Exemple:
Appel aux constructeurs des attributs
Syntaxe :
Exemple:
Constructeur de recopie
compte C(280.98);
// constructeur de recopie: création de l'objet B
// et son initialisation avec les données de C.
compte B(C);
- Ou bien:
// constructeur de recopie: création de l'objet B
// et son initialisation avec les données de C.
compte B = C;
Constructeur de recopie
Attention!!
▪ il faudra différencier entre recopie et affectation.
compte C(290.77);
double fonction(compte);
double z = fonction(C); // passage par valeur de C.
Constructeur de recopie
compte C;
compte fonction(int);
compte fonction(int i) {
compte X;
return X; // retour par valeur de X
}
Constructeur de recopie
Utilité d'un constructeur de recopie
class test {
int *ptr; // on suppose que nous avons un ptr sur un seul élément.
void alloc_test(){
if (ptr==NULL) {
cerr << "allocation de la mémoire a échoué!\n";
exit(1);
}}
public:
test(int d=1000) {
ptr = new int(d); // allocation et initialisation.
alloc_test();
}
~test(){
delete ptr; // libération.
}
void affiche() {
cout << "valeur: " << *ptr << endl;
} };
Constructeur de recopie
Utilité d'un constructeur de recopie
int main() {
// appel du constructeur
// déclaration permise car par défaut: d=1000.
test x;
// appel du constructeur de recopie dans ce cas, par
// défaut fourni par le langage, création de l'objet y
// puis recopie membre à membre de x vers y.
test y = x;
y.affiche();
return 0;
}
Constructeur de recopie
Utilité d'un constructeur de recopie
class test {
int *ptr; test(const test & T) {
if (ptr==NULL) { alloc_test();
exit(1); ~test(){
public: }
ptr = new int(d); // allocation et initialisation. cout << "valeur: " << *ptr << endl;
alloc_test(); }};
}
Constructeur de recopie
Utilité d'un constructeur de recopie
int main() {
test x;
test y = x; // appel du constructeur de recopie.
y.affiche();
return 0;
}
Exemple (3) :
Exemple (4) :
1. Réaliser une classe nommée ‘set_int’ permettant de manipuler
des ensembles de nombres entiers. On devra pouvoir réaliser
sur un ensemble les opérations classiques suivantes : lui
ajouter un nouvel élément, connaître son cardinal (nombre
d’éléments), savoir si un entier donné lui appartient.
Ici, on conservera les différents éléments de l’ensemble dans un
tableau alloué dynamiquement par le constructeur. Un argument
(auquel on pourra prévoir une valeur par défaut) lui précisera le
nombre maximal d’éléments de l’ensemble.
2. Écrire, en outre, un programme (main) utilisant la classe set_int
pour déterminer le nombre d’entiers différents contenus dans 20
entiers lus en données.
3. Que faudrait-il faire pour qu’un objet du type set_int puisse être
transmis par valeur, soit comme argument d’appel, soit comme
valeur de retour d’une fonction ?
Exemple (4) :
Exemple (4) :
Membres statiques
Lorsqu’on crée différents objets d’une même classe, chaque objet possède ces propres
données membres.
Exemple:
class point {
int x ;
int y ;
… };
Membres statiques
Exemple
class point {
static int x;
int y;
….};
▪ Une déclaration telle que : point p1, p2; provoquera :
▪ p1.x est identique à p2.x mais p1.y ≠ p2.y.
Membres statiques
▪ Les membres statiques sont utilisées pour calculer le nombre
d’instances (Objets) crées.
▪ Les membres statiques sont toujours initialisés par 0.
class cpt_obj{
static int c;
public :
cpt_obj();
~cpt_obj();
};
int cpt_obj::c=0;
cpt_obj()::cpt_obj() {cout<<″Construction, il y a maintenant : ″<<++c<<″
Objet\n″;}
cpt_obj::~cpt_obj() {cout<<″Destruction, il reste : ″ <<--c<<″ Objet\n″;}
void f(){ cpt_obj a, b; }
main() {
cpt_obj O1; f(); cpt_obj O2; }
Membres statiques
Résultat de l’exécution:
Membres statiques
Exemple:
Le mot clé ‘this’ utilisé uniquement au sein d’une fonction membre désigne un pointeur
sur l’objet l’ayant appelé.
Autoréférence : le mot clé ‘this’
Résultat de l’exécution:
Surdéfinition des opérateurs
point operator+(point)
Surdéfinition des opérateurs
Surdéfinition des opérateurs
surdéfinition de l’opérateur ‘-’
Complexe Complexe::operator-() {
return Complexe(-re, -im); }
▪ Nous sommes contraints de déclarer une fonction libre (c’est-à-dire hors de toute
classe) :
float operator+(float u, Plat p);
que nous définissons par :
float operator+(float u, Plat p)
{ return u + p.Getprix();}
Surdéfinition des opérateurs
surdéfinition de l’opérateur ‘[ ]’