Académique Documents
Professionnel Documents
Culture Documents
Chapitre 3 :
Classe et Objet en C++
class Nom_classe
{
public :
// Déclaration des attributs et des méthodes publiques
private :
// Déclaration des attributs et des méthodes privées
};
• Les membres déclarés private ne seront plus accessibles de l’« extérieur » de la classe
• Les membres dits public sont accessibles partout
Si aucun de ces deux mots n’apparaît au début de la définition, tout se passe comme si
private
4
23/11/2020
Structure du programme
• Les programmes en C++ sont organisés de la manière suivante :
o Pour chaque classe :
o Un fichier .h contenant sa déclaration ( attributs et prototype des méthodes )
o Un fichier .cpp contenant sa définition ( corps des méthodes)
o Un fichier .cpp contenant le traitement principal (fonction main)
class1.h class2.h
Class class1 Class class2
{ { Déclaration
…….. ……..
}; };
class1.cpp class2.cpp
# include "class1.h " main.cpp # include "class2.h " Définition
…………… # include "class1.h " ……………
# include "class2.h "
…………….
Void main()
{
…………… Utilisation
} 6
23/11/2020
Exemple
// -------------------------- point.h------------------------------- // --------------------- point.cpp----------------------------
class point -
{ #include <iostream>
private : // facultatif #include " point.h "
int x ; using namespace std ;
int y ; void point : : initialise (int abs, int ord)
// déclaration des membres publics {
public : x = abs ;
void initialise (int, int) ; y = ord ;
void deplace (int, int) ; }
void affiche () ; void point : : deplace (int dx, int dy)
}; {
x = x + dx ;
// ------------------------- Main.cpp----------------------------- y = y + dy ;
#include " point.h " }
int main() void point : : affiche ()
{ point a, b ; // a et b sont des instances de la classe Point { cout << « Coordonnées du point : (" << x << " , "
a.initialise (5, 2) ; a.affiche () ; << y << ")" << endl ;
a.deplace (-2, 4) ; a.affiche () ; }
b.initialise (1,-1) ; b.affiche () ;
7
}
Notion de constructeur
• Au lieu d’utiliser une fonction initialise, nous allons voir un autre mécanisme de C++ :
les constructeurs
• Constructeur : est une méthode spécifique qui sera appelée automatiquement à
chaque création d’un objet permettant de l'initialiser
• Le constructeur porte le même nom que la classe et il ne retourne rien
• Une classe peut y avoir autant de constructeur que l’on veut, en fonction des besoins
Le choix du bon constructeur se faisant suivant le nombre d’arguments
• Lorsqu’une classe ne comporte pas de constructeur, le compilateur génère un
constructeur par défaut
class A A : : A() //définition du constructeur
{ {
public : ………
A(); //déclaration d’un constructeur }
};
Si une classe possède au moins un constructeur, on ne peut pas faire appel au constructeur par défaut
8
23/11/2020
Notion de constructeur
• Exemple :
// -------------------------- point.h------------------------------- // --------------------- point.cpp-----------------------------
class point #include <iostream>
{ #include " point.h "
private : using namespace std ;
int x ; point : : point (int abs) // définition du constructeur 1
int y ; {
public : x = abs ;
point (int) ; // constructeur 1 (un argument) y = abs ;
point (int, int) ; // constructeur 2 (deux arguments) }
... point : : point (int abs, int ord)
}; { // définition du constructeur 2
x = abs ;
// ------------------------- Main.cpp----------------------------- y = ord ;
#include " point.h " }
int main() .. .
{
point a (3);
point b (1,2);
}
Les initialisations des attributs peuvent se faire avec : att_1(val_1), . . . , att_n(val_n)
point : : point (int abs, int ord) : x(abs), y(ord) { } 9
Construction d’objets
• La création d'objets (opération d'instanciation) se fait en appelant le constructeur
• Un objet peut comporter des attributs statique, automatique et dynamique,
• Le rôle du constructeur est l’initialisation des attributs statiques et automatique ainsi
que l’allocation de la mémoire pour les attributs dynamiques
• Objets statiques et automatique : sont crées par une déclaration
Création d’une instance : NomClasse nomObjet; // acceptable s’il n’existe pas de constructeur ou
s’il existe un constructeur sans argument
Ou bien : NomClasse nomObjet( arguments);
L’accès : nomObjet.membre
• Objets dynamique :
Ils sont crées par un appel à l’opérateur new. On ne peux l’accéder qu'au travers d’un
pointeur
Création d’une instance : NomClasse* nomObjet = new NomClasse ;
Ou bien : NomClasse* nomObjet = new NomClasse( arguments);
L’accès : nomObjet ->membre 10
23/11/2020
Construction d’objets
• Exemple :
// -------------------------- point.h------------------------------- // --------------------- point.cpp-----------------------
class point #include <iostream>
{ private : #include " point.h "
int x ; using namespace std ;
int y ; point : : point (int abs)
public : {
point (int) ; // constructeur 1 (un argument) x = abs ;
point (int, int) ; // constructeur 2 (deux arguments) y = abs ;
void deplace (int, int) ; }
void affiche () ; point : : point (int abs, int ord)
}; {
x = abs ;
// ------------------------- Main.cpp-----------------------------
y = ord ;
#include " point.h "
}
point a (3,4); // objet statique : déclarer en dehors de toute
.. .
fonction
int main()
{ point b (1,2); // objet automatique : déclarer dans une fonction
ou dans un bloc
point * ptr; // pointeur sur un point
ptr = new point(0); // objet dynamique
ptr -> deplacer(2,3);
ptr -> affiche () ; 11
}
Notion de destructeur
• Une méthode spécifique appelée automatiquement au moment de la destruction de
l’objet et qui permet de libérer l’espace mémoire occupé par les membres de l’objet
• Le destructeur porte le même nom que la classe, précédé d’un tilde (~)
• Il ne retourne rien et ne prend pas de paramètres
• Une classe ne comporte qu’un seul destructeur
• Lorsqu’une classe ne comporte pas de destructeur, le compilateur génère un par
défaut
• La définition explicite d’un destructeur n’est pas obligatoire lorsque tous les attributs
sont statique. Elle devient indispensable en cas d’attributs dynamiques.
• La libération des attributs dynamiques doit apparaitre explicitement dans le corps du
destructeur (avec l’opérateur delete)
12
23/11/2020
Notion de destructeur
// --------------------- point.cpp-----------------------------
// -------------------------- point.h-------------------------------
...
class point
point : : point (int abs)
{
{
private :
x = abs ;
int x ;
y = abs ;
int y ;
}
public :
point : : ~ point ( ) // facultatif
point (int) ; // constructeur (un argument)
{
~point ( ) ; // destructeur
}
};
.. .
// --------------------- Etudiant.cpp--------------------------
// -------------------------- Etudiant.h-------------------------------
...
class Etudiant
Etudiant : : Etudiant (int id, int nb)
{
: ident (id), nbNotes (nb)
private :
{
int ident ;
notes = new float [nbNotes];
int nbNotes ;
}
float* notes;
Etudiant : : ~ Etudiant ( ) // indispensable
public :
{
Etudiant (int, int) ; // constructeur
delete [] notes; // libération
~ Etudiant ( ) ; // destructeur
}
}; 13
.. .
Destruction d’objets
• La destruction des objets statiques se fait automatiquement à la fin de l’exécution du
programme principal
• La destruction des objets dynamiques doit se faire explicitement avec l’appel à
l’opérateur delete
// -------------------------- Point.h------------------------------- // ------------------------- Main.cpp-----------------------------
class point ...
{ point a(1,1) ; // objet statique
private : int main()
int x ; { a.afficher();
int y ; point b(10,10) ; // objet automatique
public : for ( int i=1 ; i<=3 ;i++)
point(); { point c(i, 2*i); // objet automatique
point (int) ; // constructeur (un argument) c.afficher();
point (int, int) ; // constructeur (deux argument) } // destruction de c
~point ( ) ; // destructeur point* d = new point(4,5); // objet dynamique
... d-> afficher();
}; delete d; // destruction de d
} // destruction de b puis de a
14
23/11/2020
Affectation d’objets
• Cas des objets statiques :
point a,b; b=a; // recopie des valeurs des attributs de a dans les attributs de b
• Cas des objets dynamiques :
point* a = new point (); a
a* : point
point* b; // a et b sont deux objets dynamique
b
b=a; // fait pointer b sur le même objet pointé par a
Remarque : une simple recopie avec = est insuffisante lorsque l’objet comporte des pointeurs sur des
emplacements dynamiques ( copie de l’adresse contenue dans le pointeur uniquement)
Constructeur de recopie
• Un constructeur de recopie :
Un constructeur spécial pour créer un objet à partir d’un autre objet (clone). Il permet
d’effectuer :
o Les allocations de mémoire nécessaire pour les attributs dynamique
o Les copies des valeurs des attributs dynamiques
• Cas d’utilisation :
o La création de copies d’un même objet
o Passage par valeur d’un objet à une fonction
o Retour par valeur d’un objet par une fonction
• Déclaration et définition :
nomClasse (nomClasse&); // déclaration du constructeur de recopie
nomClasse : : nomClasse(nomClasse& obj) : . . .
{
// copie des attributs dynamique
}
• Utilisation :
16
nomClasse nomclone = nomObjet; ou nomClasse nomClone (nomObjet);
23/11/2020
Constructeur de recopie
• Exemple :
// --------------------- Etudiant.cpp--------------------------
// -------------------------- Etudiant.h------------------------------- ...
class Etudiant Etudiant : : Etudiant (int id, int nb) : ident (id), nbNotes (nb)
{ {
private : notes = new float [nbNotes];
int ident ; }
int nbNotes ; // définition du constructeur de recopie
float* notes; Etudiant : : Etudiant (Etudiant & e) : ident (e. ident),
public : nbNotes (e. nbNotes)
Etudiant (int, int) ; // constructeur {
Etudiant (Etudiant &) ; // déclaration du constructeur notes = new float [nbNotes];
de recopie for (int i=0 ; i < nbNotes ; i++)
}; * (notes+i) = * ((e.notes)+i);
}
int main()
{ Etudiant e1 (1,3);
Etudiant e2 (e1); e1 : Etudiant e2 : Etudiant La copie est
Etudiant e3=e1; profonde des
} id = 1 id = 1 attributs
Copie des valeurs dynamiques
nbNotes = 5 nbNotes = 5
des attributs
notes = @ notes = @’ 17
18
23/11/2020
• Accès private : les membres privés d’une classe ne sont accessibles que par les
objets de cette classe et non par ceux d’une autre classe. Seule une méthode
membre de la même classe peut utiliser ce membre ; il est invisible de l’extérieur
de la classe
• Accès protected : comme les membres privés, mais ils peuvent en plus être utilisés
par une classe dérivée (notion d’héritage)
20
23/11/2020
Règle d’encapsulation
• L’encapsulation est l’idée de protéger les variables contenues dans un objet et de ne
proposer que des méthodes pour les manipuler
• En respectant ce principe, tous les attributs d’une classe seront donc privés (private)
• On permettra un accès extérieur en lecture et/ou écriture via des méthodes appelées
accesseurs et mutateurs
• L’objet est ainsi vu de l’extérieur comme une « boîte noire » possédant certaines
propriétés (les attributs) et ayant un comportement (les méthodes) spécifié et
sécurisé
• C’est le comportement (ses méthodes publiques) d’un objet qui modifiera son état
(c’est-à-dire la valeur de ses attributs privés)
• L’ensemble des méthodes publiques forme l’interface
21
Remarque : Les méthodes constantes sont des méthodes en « lecture seule ». Elle possèdent le mot clé const à la fin
de leur prototype et de leur déclaration C'est le cas de la plupart des accesseurs 22
23/11/2020
Attributs statiques
• Lorsque dans un même programme on crée différents objets d’une même classe, chaque objet possède ses
propres attributs
Exemple 1 :
class exple1 a.n b.n
{
int n ; a.x b.x
float x ; Objet a Objet b
.....
};
Exple1 a,b; // déclaration de deux objets
• Un attributs statique est un attribut partagé entre toutes les instances d’une classe
Exemple 2 :
class exple2
{ a.n b.n
static int n ;
a.x b.x
float x ;
..... Objet a Objet b
};
Exple2 a,b; // déclaration de deux objets
23
Attributs statiques
• Un attributs statiques n’existe qu’en un seul exemplaire, indépendamment des objets
de la classe
• Leur initialisation ne peut plus être faite par le constructeur de la classe
• Il doit donc être initialisé explicitement à l’extérieur de la déclaration de la classe en
utilisant l’opérateur de résolution de portée ::
int exple2 ::n = 5 ;
Exemple : Ajouter à la classe point un attribut permettant de compter le nombre des
instances existantes de la classe
class point Point : : point ( int n, int p) : x(p), y(p)
{ {
private : cpt ++;
static int cpt ; // attribut statique cout << « nombre d’objets : » << cpt << endl;
int x,y ; }
public : point : : ~point ()
point (int, int) ; // constructeur {
~point ( ) ; // destructeur cpt --;
}; cout << « nombre d’objets : » << cpt << endl;
int point: : cpt = 0; // initialisation de l’attribut statique
} 24
23/11/2020
Méthodes statiques
• Une méthode statique est une méthode indépendante de toute instanciation de la
classe (objets)
• Une méthode statique ne peut manipuler que des attributs statiques
• Elle est appelée en utilisant le nom de la classe à la quelle elle appartient et
l’opérateur de résolution de portée :: (accès direct sans passer par une instance)
Exemple : Ajouter à la classe point une méthode permettant d’afficher le nombre de ses
instances existantes Point : : point ( int n, int p) : x(p), y(p)
{ cpt ++; }
class point point : : ~point ()
{ { cpt --; }
private : void point : : compter()
static int cpt ; // attribut statique {
int x,y ; cout << « nombre d’objets : » << cpt << endl;
public : }
point (int, int) ; // constructeur Int main ()
~point ( ) ; // destructeur { point: : compter ();
static void compter(); // méthode statique point a (1,6);
}; a. compter (); nombre d’objets :0
int point: : cpt = 0; // initialisation de l’attribut statique point b (3,5); nombre d’objets :1
point: : compter (); } nombre d’objets :2 25
Fonctions amies
• Encapsulation pure des données: attributs privés accessibles uniquement à travers les
méthodes publiques de la même classe.
• Pour faciliter l’accès d’une méthode non-membre de la classe aux attributs de cette
classe, on peut utiliser la notion de fonction amie
• Fonction amie : fonction extérieure à la classe mais autorisée à accéder aux attributs
privés au même titre que n’importe quelle fonction membre.
Syntaxe :
class maClasse
{ // attributs
public :
// méthodes
friend type_retour nom_fonction(arguments);
}
26
23/11/2020
Fonctions amies
Il existe plusieurs types d’amitié
Fonction indépendante, amie d’une classe
27
Fonctions amies
Fonction indépendante, amie de plusieurs classes
Fonction membre d’une classe, amie d’une autre class
f : fonction membre de la classe B mais amie de la classe A
28
23/11/2020
Fonctions amies
Classe amie:
Toutes les fonctions d’une classe sont amies d’une autre classe
29
Fonctions amies
Exercice :
Ecrire un programme permettant de déterminer le produit d’une matrice (objet de classe matrice) par
un vecteur (objet de classe vect) à l’aide d’une fonction appelé « prod » qui retourne un objet de type
vect.
• La classe vect possède :
• Comme données : un vecteur de 3 éléments entiers
• Comme fonctions membres :
o un constructeur à 3 valeurs entiers
o une fonction d’affichage (affiche) pour afficher le contenu du tableau (vecteur)
• La classe matrice possède :
• Comme données : une matrice de 9 éléments entiers (3*3)
• Comme fonction membre :
o un constructeur ayant une matrice (3*3) comme paramètre
Ajouter la fonction amie nommée prod dans les deux cas suivants :
• prod est indépendante et amie des deux classes vect et matrice ;
• prod est membre de la classe matrice et amie de la classe vect.
30
23/11/2020
Afin de permettre de fournir aux utilisateurs des interfaces plus simples à manipuler.
31
32
23/11/2020
Résultats de l’exécution
33
Résultats de l’exécution
34
23/11/2020
Cas de opérateurs ++ et --
Notation préfixée ++a Notation postfixée a++
L’argument de type int est totalement fictif, il permet uniquement au compilateur de choisir l’opérateur à
utiliser mais aucune valeur ne sera réellement transmise lors de l’appel.
35
Résultats de l’exécution
36
23/11/2020
b
f
3
g
h
x
a
y
5
z
t
Après l’affectation u
b
f
3
g
37
h
x
y
5
a z
t
u
x
y
5
b z
t 38
u
23/11/2020
class vecteur3d
{ float x, y, z ;
public :
vecteur3d (float c1=0.0, float c2=0.0, float c3=0.0)
{ x = c1 ; y = c2 ; z = c3 ;
}
};
39
Patrons de fonctions
Patron (template) de fonctions : modèle de fonction ou fonction générique écrire une seul fois la définition
d’une fonction qui sera adapté automatiquement par le compilateur à n’importe quel type
Exemple :
Définir un patron de fonction minimum pour que ca soit applicable quelque soit le type
Résultat d’exécution :
min (n, p) = 4
min (x, y) = 2.5min (n, p) = 4
min (x, y) = 2.5
40
23/11/2020
Patrons de fonctions
template <class T> : il s’agit d’un patron (template) avec un paramètre de type nommé T
Le mot-clé class pour préciser que T est un paramètre de type
T minimum (T a, T b) : est une fonction recevant deux arguments de type T et fournissant un résultat du
même type T
Le patron minimum peut être utilisé pour des arguments de n’importe quel type : un type prédéfini (short,
char, double, int *, char *, int * , etc.) ou d’un type défini par l’utilisateur (structure ou classe)
41
Patrons de fonctions
Résultat d’exécution :
min (u, v) = 3 2
42
23/11/2020
Patrons de classes
Patron (template) de classes : modèle de classe ou classe générique écrire une seul fois la définition d’une
classe qui sera adapté automatiquement par le compilateur à n’importe quel type,
Exemple :
Résultat d’exécution :
coordonnees : 3 5
coordonnees : d y
coordonnees : 3.5 2.3
43
Patrons de classes
Exemple : Créer un patron de classes permettant de représenter des « vecteurs dynamiques » (c’est-à
dire des vecteurs dont la dimension est inconnue). Les éléments de ces vecteurs puissent être de type
quelconque. On surdéfinira l’opérateur d’indexation [] pour qu’il permette l’accès aux éléments du
Vecteur.
Résultat d’exécution :
v : 0 1 2 3 44
23/11/2020
Patrons de classes
Exemple : Soit la classe générique Triplet qui permet de garder trois valeurs de types différents et la
fonction principale suivante qui utilise une instance de la classe Triplet :
Résultat d’exécution :
etudiant :
11
Complétez la déclaration de la classe Triplet sans fournir les implémentations ali
13.5
de ses méthodes.
45
Classe String
C++ fournit une classe standard pour la création et la manipulation des chaines de caractères : la classe string
La taille d’un objet de type string peut évoluer dynamiquement au fil de l’exécution
Constructeurs de la classe string :
o Construction d’une chaîne vide
string ch1 ;
o Construction d’une chaîne de 10 caractères
string ch2 (10, ’*’)
o Initialisation d’une chaine à partir d’une chaîne constante
string mess1 ("bonjour") ; // ou string mess1 = "bonjour" ;
o Initialisation à partir d’un tableau de caractère
char * adr = "salut" ;
string mess2 (adr) ; // ou string mess2 = adr ;
46
23/11/2020
Classe String
Les opérateurs <<,>> [], +, +=, =, ==, !=, <=, >=, <, > sont surchargés pour la classe string
Fonction fréquemment utilisés:
o length() : fournit la taille de la chaîne
o find() : recherche d’une chaîne ou un caractères dans une chaîne ( 1 ere occurrence)
o insert () : inséré une chaîne ou un caractères dans une chaîne
o ecrase () : supprime un caractère ou une partie d’une chaîne
o replace() : remplacer une partie d’une chaîne par une autre
47