Académique Documents
Professionnel Documents
Culture Documents
Mourad Oussalah
MO
Objectif du cours
MO
Impact des objets aujourd'hui
MO
Historique et contexte
MO
Les objets : une abstraction supplémentaire pour la
programmation
MO
La programmation structurée (1)
Avantages :
➜ Nette séparation entre les données et leur comportement
➜ Lisibilité et maintenabilité augmentées
MO
La programmation structurée (2)
Inconvénients :
➜ Toutes les données sont mêlées
➜ Tous les comportements sont mêlés
➜ L'évolution des programmes (modification suite à une
erreur de conception ou évolution des besoins) n'est pas
facilitée
MO
Modularité et encapsulation
MO
Notion d'objet
MO
La programmation orientée objet (1)
MO
La programmation orientée objet (2)
Remarque : Les langages orientés objet ne sont pas une solution "magique"
à tous les problèmes de programmation.
➜ L'encapsulation facilite
➢ la mise au point des programmes (déboggage),
➢ la maintenance des programmes,
➢ l'évolution des programmes.
➜ L'objet est une unité "naturelle" de programmation puisqu'il
regroupe les données et traitements capables d'assurer
une fonctionnalité d'un programme.
MO
De la programmation à la conception (2)
Les objets que nous percevons dans le monde réel sont des entités
possédant des caractéristiques et réalisant des fonctionnalités.
On retrouve la dualité données / procédures représentant un même
concept.
MO
Exemple
Cet objet contient, à lui seul, tout ce qui est nécessaire pour créer
et utiliser des piles d'entiers. De plus, les objets utilisateurs de
cette pile connaissent les trois fonctionnalités qui sont utilisables
sur une pile.
MO
Des données et des procédures
MO
Visibilité
MO
Interface et implémentation (1)
MO
Interface et implémentation (2)
Avance
Recule
Accélère
Freine
Arrête
MO
Interface et implémentation (3)
Freine
L1 = ( 1 , 2 , 5 , 7 , 10 , 15 , 17 , 20 )
MO
Interface et implémentation
L1
L1
Debut -> 1 2 5 7 ...
MO
Classes
MO
Instances et Instanciation
MO
Attributs
MO
Méthode / Message
MO
Exemple : une classe ...
MO
... et des instances
MO
Héritage et mécanismes liés
MO
Mécanisme d'héritage (1)
MO
Mécanisme d'héritage (2)
MO
Généralisation / spécialisation
MO
Exemple :
Une hiérarchie de généralisation / spécialisation
Personne
no m
date-naissance
E mployé
salaire Etudiant
n°-carte-étudiant
Ingénieur Chercheur
no mbre-projets thêmes-recherche
MO
Héritage multiple
➜ Avantages :
➢ expressivité
➜ Inconvénients :
➢ possibilité d'ambiguïtés
MO
Redéfinition des méthodes / Masquage (1) code différent
MO
Redéfinition des méthodes / Masquage (2)
Parallélogram m e Cercle
affiche() affiche()
Rectangle Losange
affiche() affiche()
Carré
affiche()
MO
Redéfinition ... des attributs
MO
"Downcasting" (typage sûr)
MO
Polymorphisme
MO
Surdéfinition et Polymorphisme signature différente
MO
Invocation des méthodes (1)
MO
Invocation des méthodes (2)
MO
Le langage C++
Introduction
MO
Contenu de cette partie
MO
Objectif de cette partie du cours
MO
Introduction
MO
Historique
MO
C++, un langage orienté-objet ?
MO
De C à C++
MO
Contenu de cette partie
➜ C++, un C ++
➜ Nouveautés syntaxiques
➜ Les commentaires de fin de ligne
➜ Les déclarations de variables
➜ Notions sur les entrées / sorties conversationnelles
MO
C++, un C ++
MO
Nouveautés syntaxiques
➜ Exemple :
MO
Déclarations de variables
m ain ()
{
cout << "Début de ce progra m me principal qui serait incorrect
en C.\n";
int n=5;
for (int i=0; i<5; i++) cout << "i = " << i << "\n";
}
MO
Les entrées / sorties conversationnelles
MO
Ecriture sur la sortie standard cout (1)
#include<iostrea m.h>
#include<string.h>
m ain ()
{
int n = 25;
char c = 'a';
char *ch;
ch = new char[20];
ch = strcpy(ch, "bonjour");
cout << "valeur de n : " << n << "\n";
cout << "valeur de c : " << c << "\n";
cout << "chaîne ch : " << ch << "\n";
cout << "adresse de ch : " << (void*)ch << "\n";
}
MO
Ecriture sur la sortie standard cout (2)
valeur de n : 25
valeur de c :a
chaîne ch : bonjour
adresse de ch : 0x19700b4
MO
Lecture sur l'entrée standard cin
MO
Contenu de cette partie
MO
Terminologie
MO
Déclaration d’une classe
MO
Spécificateurs d'accès
MO
Remarques sur les spécificateurs d'accès
MO
Spécificateurs d'accès et encapsulation
MO
Exemple de déclaration d'une classe
class Point
{ déclaration des données membres
il faut ajouter get() et set() pour chaque variable définie
private :
int x; déclaration des fonctions membres,
int y; c'est-à-dire, énoncé de leur signature
public :
void initialise (int,int);
void deplace (int,int);
void affiche ();
};
MO
Définition d'une fonction membre
MO
Exemples de définitions de fonctions membre
void Point::affiche ()
{
cout << "Je suis en " << x << " " << y << "\n";
}
MO
Déclaration d’un objet objet du type d’une classe
➜ Exemple :
Point p1;
MO
Déclaration d'un tableau d'objets ou d'un pointeur
sur un objet
➜ Exemples :
MO
Accès aux membres (données et fonctions) d’un objet
MO
Exemple
void main ()
{
Point a, b;
a.initialise (5,2);
a.affiche ();
a.deplace (-2,4);
a.affiche ();
b.initialise (1,-1);
b.affiche ();
}
➜ L’affichage à l’exécution de ce programme est :
Je suis en 5 2
Je suis en 3 6
Je suis en 1 –1
MO
Affectation d'objets (1)
Point a, b ;
➜ l'instruction b = a; provoque la recopie des valeurs des
membres x et y de a dans les membres correspondants de b.
➜ Cela reviendrait à écrire : b.x = a.x ;
b.y = a.y ;
➢ Attention : Comme x est un membre privé, la première affectation
doit être écrite au sein d'une fonction membre de la classe Point
pour être valide.
MO
Affectation d'objets (2)
MO
Notion de constructeur (1)
MO
Notion de constructeur (2)
MO
Notion de destructeur
MO
Conventions pour les constructeurs et les
destructeurs
MO
Exemple de constructeur (1)
void main ()
{
Point a (5,2); //remplace Point a; a.initialise(5,2);
a.affiche ();
a.deplace (-2, 4);
a.affiche ();
}
MO
Cas d'un constructeur sans argument
class Point
{
Point ()
{
...
}
};
m ain ()
{
Point a; // OK
Point a (); // erreur !
}
MO
Exemple de destructeur (1)
class Point
{
int x ;
int y ;
public :
Point (int,int);
void deplace (int,int);
void affiche ();
~Point ();
};
Point::~Point ()
{
cout << "Le destructeur de Point\n";
}
MO
Exemple de destructeur (2)
m ain ()
{
Point a (5,2);
a.affiche ()
}
➜ Exécution
Je suis en 5 2
Le destructeur de Point
MO
Variables de classe
MO
Stockage des données "classiques"
class ex1
a.n -> <- b.n
{
int n;
float x; a.x -> <- b.x
}
MO
Stockage des données membres statiques
➜ Exemple :
MO
Initialisation des membres données statiques
MO
La classe comme composant logiciel
MO
Exemple de la classe Point
MO
Protection contre les inclusions multiples
MO
Les propriétés des fonctions membres
MO
Contenu de cette partie
MO
Surdéfinition des fonctions membres
MO
Exemple (1)
class Point
{
int x, y;
public :
//...
void affiche ();
void affiche (char*);
};
void Point::affiche ()
{
cout << "Je suis en : "<< x <<" " << y << "\n";
}
MO
Exemple (2)
m ain ()
{
Point a;
a.affiche ();
a.affiche ("Bonjour");
}
MO
Arguments par défaut (1)
MO
Arguments par défaut (2)
class Point
{
int x, y;
public :
//...
void affiche (char* = "");
}
void Point::affiche (char * message)
{
cout << message <<" Je suis en " << x << " " << y << "\n";
}
m ain ()
{
Point a (2, 5);
a.affiche (); // message vaut "", sa valeur par défaut
a.affiche ("Bonjour");
}
MO
Fonctions membres en ligne (1)
MO
Fonctions membres en ligne (3)
class Point
{
int x,y;
public :
Point ();
void affiche (char* = " ");
};
//...
MO
Modes de transmission d'objets en argument
MO
Transmission par valeur (1)
MO
Transmission par valeur (2)
➜ Utilisation :
m ain ()
{
int egaux;
Point a (3, 5),b(4, 9);
egaux = a.coïncide (b);
}
MO
Transmission par adresse (1)
class Point
{
//...
public:
int coïncide (Point *);
};
MO
Transmission par adresse (2)
➜ Utilisation :
m ain ()
{
int egaux;
Point a(4, 5), b(4,5);
egaux = a.coïncide (&b); // plus difficile à
// utiliser
}
MO
Transmission par référence (1)
MO
Transmission par référence (2)
class Point
{
int x, y;
//...
public :
int coïncide (Point &);
};
➜ Utilisation :
m ain ()
{
Point a (4, 9), b(3, 7);
int egaux;
egaux = a.coïncide (b);
}
MO
Autoréférence
MO
Exemple d'utilisation de l'autoréférence
void Point::affiche ()
{
cout << "Adresse : " << this
<< "Coordonnées : " << x << " " << y << "\n";
}
MO
Fonctions membres statiques (1)
MO
Fonctions membres statiques (2)
MO
Fonctions membres statiques (3)
MO
Fonctions membres statiques (4)
void fct()
{
Exe mple x,y;
}
m ain ()
{
Exe mple::co mpte();
Exe mple a;
Exe mple b;
fct();
}
MO
Fonctions membres constantes (1)
const int n = 20 ;
n = 12 ;// erreur ...
MO
Fonctions membres constantes (2)
class Point
{
int x ,y;
public :
//...
void affiche () const; //fonction utilisable sur un
// point constant
void deplace (...); //fonction pas utilisable sur
// un point constant
};
m ain()
{
Point a ; // Point "classique"
const Point c; // Point constant
a.affiche (); // OK
a.deplace (...);// OK
c.affiche ( ); //O K
c.deplace (...);// erreur !!!
}
MO
Construction, destruction, recopie
et initialisation des objets
MO
Contenu de cette partie
MO
Objets automatiques et statiques (1)
MO
Exemple : Création et destruction d'objets
automatiques (1)
MO
Exemple : Création et destruction d'objets
automatiques (2)
m ain ()
{
cout << " *** debut du main *** \n";
Point b (10, 10); // objet auto matique
int i; // exe mple de déclaration dans un bloc
for (i = 1; i<= 3; i++)
{
cout << "** boucle" << i << " **\n";
Point (i, 2*i); // objet auto matique
}
cout << "*** fin du main *** \n" ;
}
MO
Exemple : Création et destruction d'objets
automatiques (3)
➜ Execution
++ construction du point : 11
*** début du main ***
++ construction du point : 10 10
** boucle 1 **
++ construction d'un point : 1 2
-- destruction du point : 1 2
** boucle 2 **
++ construction du point : 2 4
-- destruction du point : 2 4
** boucle 3 **
++ construction du point : 3 6
-- destruction du point : 3 6
*** fin du main ***
-- destruction du point : 10 10
-- destruction du point : 1 1
MO
Objets dynamiques
MO
Exemple de création d'objets dynamiques (1)
Point* adr ;
(*adr).initialise (1,3);
(*adr).affiche ();
MO
Fonctionnement du new
➜ Exemple :
MO
Fonctionnement du delete
MO
Initialisation d'objets avec recopie
MO
Constructeur de recopie
MO
Exemple d'utilisation du constructeur de recopie
par défaut (1)
Vecteur::Vecteur (int n)
{
adr = new double [nbelem = n]; //tableau de n double
cout << "Constructeur Usuel - adr objet : " << this
<< "- adr vecteur : " << adr << "\n";
}
MO
Exemple d'utilisation du constructeur de recopie
par défaut (2)
Vecteur::~Vecteur ()
{
cout << "Destructeur - adr objet : " << this
<< "- adr vecteur : " << adr << "\n";
delete adr;
}
m ain ()
{
Vecteur a (5);
fonction (a);
}
MO
Exemple d'utilisation du constructeur de recopie
par défaut (3)
➜ ExÉcution :
Constructeur usuel - adr objet: 0x40ez0ffa - adr vecteur: Ox429400004
Appel de fonction
Destructeur - adr objet: 0x40ez0ff4 - adr vecteur: 0x42940004
Destructeur - adr objet: 0x40ez0ffa - adr vecteur : 0x42940004
➜ Explication :
➢ L'exÉcution de fonction(a) a créé un nouvel objet dans lequel ont été
recopiées les valeurs de nbelem et adr.
MO
Exemple d'utilisation du constructeur de recopie
par défaut (4)
➜ Au niveau mémoire, on a :
a 5
MO
Définition d'un constructeur par recopie
MO
Exemple : Constructeur de recopie pour la classe
Vecteur
Vecteur::Vecteur (const Vecteur &v) // rajouter la signature dans
//la declaration de la classe
{
adr = new double [nbelem = v.nbelem];
int i;
for (i = 0; i < nbelem; i++) adr[i] = v.adr[i];
cout << "Constructeur recopie - adr objet: " << this
<< " - adr vecteur: " << adr << "\n";
}
➜ Exécution du même programme principal :
Constructeur usuel - adr objet: ox44ecoffa -adr vecteur: Ox469e0004
Constructeur recopie - adr objet: ox44ecoff4 -adr vecteur: Ox46a10004
Appel de fonction
Destructeur - adr objet: ox44ecoff4 - adr vecteur: Ox46a10004
Destructeur - adr objet: ox469e0004 - adr vecteur : Ox469e0004
MO
Constructeur de recopie : bilan
ou
MO
Cascade des constructeurs dans le cas d'objets
membre (1)
MO
Cascade des constructeurs dans le cas d'objets
membre (3)
MO
Contenu de cette partie
➜ Surdéfinition d'opérateurs
➜ Forme canonique d'une classe
MO
Surdefinition d'opérateurs
MO
Exemple (1)
class Point
{
int x, y;
public :
Point (int abs = 0, int ord = 0) {...}
Point operator+ (Point);
void affiche ()
{ cout << "coordonnées: " << x << "" << y << "\n"; }
};
MO
Exemple (2)
m ain ( ) ➜ Exécution :
{
Point a (1,2); coordonnées : 1 2
a.affiche (); coordonnées : 2 5
Point b (2,5); coordonnées : 3 7
b.affiche ( ); coordonnées : 6 14
Point c;
c = a + b; ➜ c = a + b;
c.affiche ();
c = a + b + c; est interprété comme
c.affiche ();
} C = a.operator + (b);
MO
Limitations à la surdéfinition d'opérateurs
MO
Forme canonique d'une classe (1)
MO
Forme canonique d'une classe (2)
MO
La technique de l'héritage
MO
Contenu de cette partie
MO
Intérêt et mise en œuvre
MO
Exemple (1)
class Point
{
int x, y;
public :
void initialise (int,int);
void deplace (int,int);
void affiche ();
};
➜ On suppose que les fonctions initialise, deplace et affiche
sont définies par ailleurs.
➜ Supposons que nous souhaitions définir une classe
permettant de représenter des points de couleur.
➜ Pour ce faire nous devons prévoir de définir ses
coordonnées et sa couleur, des méthodes pour l'initialiser,
le déplacer, l'afficher, le colorier.
MO
Exemple (2)
➜ Utilisation :
m ain ()
{
Pointcol p;
p.initialise (10, 20);
p.colore ("bleu");
p.affiche ();
p.deplace (3,5);
p.affiche ();
}
➜ p est un point coloré. Il a accès à toutes les fonctions
membres publiques de la classe Point. Il possède, comme
les points, une abscisse, une ordonnée. En plus, il possède
une couleur.
MO
Utilisation, dans une classe dérivée, des membres
de la classe de base (1)
MO
Utilisation, dans une classe dérivée, des membres
de la classe de base (2)
MO
Redéfinition des fonctions membre (1)
MO
Redéfinition des fonctions membre (1)
➜ Exécution
➜ Attention :
➢ Pour qu'il y ait effectivement redéfinition, il faut non seulement
que la fonction membre ait le même nom mais aussi la même
signature. Dans le cas contraire, on peut tout à fait définir une
fonction membre de même nom ayant d'autres paramètres
mais on ne parlera pas de redéfinition.
MO
Appel des constructeurs et des destructeurs
Ordre d'appel
MO
Transmission de paramètres entre constructeurs (1)
MO
Contrôle des accès : le spécificateur d'accès protégé
MO
Héritage multiple
MO
Fonctions virtuelles et typage dynamique
MO
Contenu de cette partie
MO
Problèmes liés au typage statique (1)
MO
Problèmes liés au typage statique (2)
m ain ()
{
Point* a = new Point;
Point* b = new Pointcol;
a -> affiche (); // appel de affiche de Point
b -> affiche (); // appel de affiche de Point
}
MO
Fonction virtuelle
m ain ()
{
Point* a = new Point;
Point* b = new Pointcol;
a -> affiche (); // appel de affiche de Point
b -> affiche (); // appel de affiche de Pointcol
}
MO
Deuxième exemple (1)
class Point
{
int x, y;
public :
Point (int abs=0, int ord=0) { x=abs; y=ord; };
void identifie () { cout << "Je suis un point \n"; };
void affiche ()
{
identifie ();
cout << "mes coordonnées sont" << x << "." << y << "\n";
}
};
MO
Deuxième exemple (2)
MO
Deuxième exemple (3)
m ain ()
{
Pointcol pc (8, 6, "rouge");
pc.affiche ();
}
➜ Explication :
➢ affiche n'étant pas redéfinie dans Pointcol, l'instruction
pc.affiche (); déclenche la méthode de la classe Point, où l'appel
à la fonction identifie a déjà été compilé. La fonction membre
affiche ne peut pas faire appel à la fonction identifie de sa classe
dérivée.
➜ Il faudrait qu'identifie soit virtuelle dans la classe Point.
MO
Virtualité
➜ Remarques :
➢ un constructeur ne peut être virtuel.
➢ un destructeur peut être virtuel.
➢ une fonction virtuelle peut être redéfinie ou pas. La
redéfinition peut être une fonction virtuelle ou pas.
MO
Fonctions virtuelles pures et classes abstraites (1)
Triangle Carré
void affiche void affiche ()
{ {
... ...
} }
MO
Fonctions virtuelles pures et classes abstraites (2)
MO
Fonctions virtuelles pures et classes abstraites (3)
MO
Contenu de cette partie
MO
Patrons de classes
MO
Utilisation d'un patron de classes
Point<int> pt1;
Point<double> pt2;
MO
Patrons de classes comme composants logiciels
MO
Paramètres de type (1)
MO
Paramètres de type (2)
➜ Utilisation
MO
Paramètres expression
MO
Spécialisation d'un patron de classes
➜ Il est possible :
➢ de spécialiser, en se basant sur 1 ou plusieurs paramètres de
type, une ou plusieurs fonctions membres, sans modifier la
définition de la classe elle-même.
➢ de spécialiser la classe même (en se basant sur un ou
plusieurs paramètres de type) en fournissant une nouvelle
définition.
MO
Exemple de spécialisation d'un patron (1)
MO
Exemple de spécialisation d'un patron (2)
void Point<char>::affiche ()
{
cout << "coordonnées : " << (int) x << " " << (int) y
<< "\n";
}
m ain ( )
{
Point<int> pt1 (3, 5);
pt1.affiche ();
Point<char> pt2 ('d','y');
pt2.affiche ();
Point<double> pt3 (3.5, 4.3);
pt3.affiche ();
}
MO
Exemple de spécialisation d'un patron (3)
➜ Exemple 2 :
class Point<char>
{
// nouvelle definition dans le cas d'un
// parametre de type char
}
MO
Fonctions amies
MO
Contenu de cette partie
MO
Intérêt de la notion d'amitié (1)
MO
Intérêt de la notion d'amitié (2)
➜ Solutions (?)
➢ 1 - Ecrire le produit comme fonction membre d'une des deux classes et
rendre les données membre de l'autre classe publiques.
- pas satisfaisant
➢ 2 - Ecrire une fonction indépendante des deux classes.
- comment accéder aux données ?
➢ 3 - Ecrire dans l'une des deux classes (ou les deux) des fonctions
publiques permettant d'accéder à leurs données privées (accesseurs) .
- problème du temps d'exécution.
➜ Une autre solution consiste à utiliser les fonctions amies.
➜ Attention :
➢ Ne pas utiliser trop fréquemment car une fonction amie viole
l'encapsulation. Privilégier si possible les solutions de type (par
exemple avec des accesseurs en ligne).
MO
Situations d'amitié
MO
Exemple 1 : Fonction indépendante, amie d'une
classe
➜ A noter :
➢ mot clé friend dans la déclaration de la classe
➢ coincide n'est fonction membre d'aucune classe.
➜ La fonction coincide accède aux données membres privées
de la classe Point car elle est une fonction amie de cette
classe.
MO
Exemple 2 : Fonction membre d'une classe, amie
d'une autre classe.
class A
{
...
public :
friend int B::fct (char, A);
...
};
class B
{
...
int fct (char, A); La fonction fct de B a accès
... aux membres privés de A.
};
MO
(Petite) Bibliographie
MO
(Petite) Bibliographie
MO