Vous êtes sur la page 1sur 25

Le langage C++ et la programmation orientée

objets - séance 6 -

Prof. Karim RHOFIR

ENSA Khouribga

Décembre 2021
Programmation Orientée Objets - Classes

Exemple pratique :

class Matrice
{ public :
void afficher ();
Matrice Additionner ( Matrice &);
void RemplitMat ( ); // Remplissage
Matrice ( int , int ); // Constructeur
~ Matrice ( ); // destructeur
private :
int ligne ;
int colonne ;
int ** tab ;
};

Prof. Karim RHOFIR C++ & POO


Programmation Orientée Objets - Classes
Exemple pratique (suite) :

Matrice :: Matrice ( int l , int c )


{
cout < < " construction ␣ Matrice " << endl ;
ligne = l ; colonne = c ;
tab = new int *[ ligne ];
for ( int i =0; i < ligne ; i ++)
tab [ i ]= new int [ colonne ];
}
Matrice ::~ Matrice ( )
{
cout < < " destruction ␣ d ’ une ␣ Matrice " << endl ;
for ( int i =0; i < ligne ; i ++)
delete [] tab [ i ];
delete [] tab ;
}

Prof. Karim RHOFIR C++ & POO


Programmation Orientée Objets - Classes
Exemple pratique (suite) :

void Matrice :: Afficher ( ){


for ( int i =0; i < ligne ; i ++){
for ( int j =0; j < colonne ; j ++)
cout < < tab [ i ][ j ] < < " ␣ " ;
cout < < endl ;
}
}
Matrice Matrice :: Additionner ( Matrice & B ){
Matrice S ( ligne , colonne );
for ( int i =0; i < ligne ; i ++)
for ( int j =0; j < colonne ; j ++)
S . tab [ i ][ j ]= tab [ i ][ j ]+ B . tab [ i ][ j ];
return S ;
}

Prof. Karim RHOFIR C++ & POO


Programmation Orientée Objets - Classes

Exemple pratique (suite) :

int main ( ){
Matrice M (2 ,2);
Matrice N (2 ,2);
M . RemplitMat ();
N . RemplitMat ();
( M . Additionner ( N )). Afficher ();
}

Prof. Karim RHOFIR C++ & POO


Programmation Orientée Objets - Classes
Exemple pratique (suite) : Exécution

Prof. Karim RHOFIR C++ & POO


Programmation Orientée Objets - Classes
Affectation entre objets
Le C++ autorise l’affectation d’un objet d’un type donnée à un
autre objet de même type. Dans ce cas il recopie tout simplement
les valeurs des attributs (privés ou publiques) de l’un dans l’autre.
Point A , B ; /* declare deux instances
de la classe Point */
A . initialise (2 ,5); // A . x = 2 et A . y = 5
B = A ; // B . x = 2 et B . y = 5

Remarque :
Il faut noter que les pointeurs ne sont pas pris en considération
dans un cas simple d’affectation : si parmi les attributs, se trouve
un pointeur, l’emplacement pointé ne sera pas recopié
(voir surcharge des opérateurs).

Prof. Karim RHOFIR C++ & POO


Programmation Orientée Objets - Classes

Objets et fonctions
Un objet peut être transmis comme argument à une fonction ; par
valeur, par adresse ou par référence et peut être une valeur de
retour à une fonction ; par valeur, par adresse ou par référence.
Dans les 2 cas, si cette fonction est une méthode de la classe de
l’objet, elle a accès à tous ces attributs privé ou public, sinon elle
n’aura droit d’accès qu’à ces attributs publics.

Remarque :
Si la transmission de l’objet se fait par valeur, il y a recopie de ses
attributs dans un emplacement locale à la fonction, ce qui entraîne
certains problèmes si la classe contient des pointeurs comme
attributs.

Prof. Karim RHOFIR C++ & POO


Programmation Orientée Objets - Classes

Constructeur de recopie - Copy Constructor


Soient les 2 situations suivantes :
Passage par valeur d’un objet à une fonction :
type-retour Fonction( MaClasse obj) .
L’initialisation explicite des objets lors d’une déclaration par
des objets de même type, comme par exemple :
MaClasse obj ;
MaClasse B=obj ;
Dans les 2 cas le compilateur fera une copie simple des valeurs des
attributs de l’objet obj. Ce qui d’après la remarque précédente
posera un problème si l’objet possède un attribut pointeur.

Prof. Karim RHOFIR C++ & POO


Programmation Orientée Objets - Classes

Constructeur de recopie - Copy Constructor (suite)


On se retrouvera avec 2 pointeurs qui pointent sur la même zone
mémoire se qui posera 2 problèmes :
Toute modification de l’un des objets se fera aussi sur l’autre
(la copie).
La destruction de l’un des objets, entraînera la destruction du
pointeur du deuxième.

Pour remédier à ce problème le C++ offre la possibilité de définir


un constructeur de recopie qui s’occupera de copier les objets de
façon correcte. Il est déclaré comme suit :
MaClasse( const Maclasse &) ;

Prof. Karim RHOFIR C++ & POO


Programmation Orientée Objets - Classes
Exemple pratique : Constructeur de recopie
On reprendra la classe Matrice précédente dans laquelle on
rajoutera la déclaration suivante :
Matrice(const Matrice & ) ; et à l’extérieur de la classe on le
définira comme suit :
Matrice :: Matrice ( const Matrice & M ){
ligne = M . ligne ;
colonne = M . colonne ;
tab = new int *[ ligne ];
for ( int i =0; i < ligne ; i ++)
tab [ i ]= new int [ colonne ];
// on copie les elements de M
for ( int i =0; i < ligne ; i ++)
for ( int j =0; j < colonne ; j ++)
tab [ i ][ j ]= M . tab [ i ][ j ];
cout < < " construction ␣ d ’ une ␣ copie " << endl ;
}
Prof. Karim RHOFIR C++ & POO
Programmation Orientée Objets - Classes

Exemple pratique : Constructeur de recopie (suite)

int main (){


Matrice A (2 ,2);
A . RemplitMat ();
// on construit B et C en copiant A
Matrice B ( A );
Matrice C = A ; // ce n ’ est pas une affectation
C . affiche ();
}

Prof. Karim RHOFIR C++ & POO


Programmation Orientée Objets - Classes
Exemple pratique : Constructeur de recopie (suite)
Résultat de l’exécution :

Prof. Karim RHOFIR C++ & POO


Programmation Orientée Objets - Classes

Membres statiques
On distingue deux types de membres :
Membres d’instance : membres associés à une instance de la
classe.
Membres de classe : membres associés à la classe et qui ne
dépendent d’aucune instance de la classe.
Les membres de classe, sont aussi dits membres statiques. Ils
sont déclarés avec l’attribut static, et existent même si aucun
objet de la classe n’est crée.

Prof. Karim RHOFIR C++ & POO


Programmation Orientée Objets - Classes
Membres statiques : Attributs statiques
Un attribut déclaré avec le mot clé static est une donnée
partagée par toutes les instances d’une classe, il est lié à la
classe et non à l’instance.
Un membre donnée statique est initialisé par défaut àzéro.
Mais :
Il doit être défini à l’extérieur de la déclaration de la
classe, même s’il est privé, en utilisant l’opérateur de
porté ( : :) .
Ne peut être initialisé à l’intérieur de la classe.
L’accès à un membre donnée statique d’une classe suit les
mêmes règles que les autres membres. D’autre part, un
membre donnée statique est une donnée qui existe même si
aucun objet de cette classe n’est déclaré, dans ce cas l’accès se
fait à l’aide du nom de la classe et l’opérateur de porté ( : :) .

Prof. Karim RHOFIR C++ & POO


Programmation Orientée Objets - Classes

Membres statiques : Méthodes statiques


Comme pour les attributs, on peut définir une méthode statique qui
sera liée à la classe. Pour cela il suffit de faire préceder la
déclaration de la fonction du mot clé static.

remarque :
L’accès aux membres statiques d’une classe (attributs ou méthodes)
se fait avec l’opérateur de résolution de portée ( : :) précédé par le
nom de la classe ou d’un quelconque objet de la classe.

Prof. Karim RHOFIR C++ & POO


Programmation Orientée Objets - Classes

Membres statiques : Exemple

class Point {
int x ;
int y ;
static int compt ;
public :
Point ( int = 0 , int = 0);
~ Point ();
void affiche ();
static void affiche_nbobj ();
};

Prof. Karim RHOFIR C++ & POO


Programmation Orientée Objets - Classes

Membres statiques : Exemple

int point :: compt =0;


Point :: Point ( int abs , int ord ) {
x = abs ; y = ord ;
compt ++; }
Point ::~ Point () { compt - -; }
void Point :: affiche (){
cout << " ( " << x << " ," << y << " ) " ;
}
// definition de la fonction membre static
void Point :: affiche_nbobj () {
cout < < " le ␣ nombre ␣ d ’ objets ␣ est " << compt ;
}

Prof. Karim RHOFIR C++ & POO


Programmation Orientée Objets - Classes

Membres statiques : Exemple (suite)

int main (){


/* on peut appeler la methode statique
sans avoir cree un objet */
Point :: affiche_nbobj (); // le nbre d ’ obj est 0
Point B (2 ,6);
Point :: affiche_nbobj (); // le nbre d ’ obj est 1
Point A ;
A . affiche_nbobj (); // le nbre d ’ obj est 2
}

Prof. Karim RHOFIR C++ & POO


Programmation Orientée Objets - Classes

Exploitation des classes dans des projets C++


Pour les applications nécessitant beaucoup de classes, il est
souhaitable que celles-ci figurent dans des fichiers différents. On
travaille alors de la manière suivante :
les déclarations des classes sont faites dans des fichiers
d’extension .h (fichiers d’entête)
les définitions des fonctions membres sont dans des fichiers
d’extension .cpp
l’utilisation de ces classes apparaît finalement dans un fichier
d’extension .cpp contenant la fonction int main().

Prof. Karim RHOFIR C++ & POO


Programmation Orientée Objets - Classes

Prof. Karim RHOFIR C++ & POO


Programmation Orientée Objets - Classes

Exploitation des classes dans des projets C++


#ifndef, #define et #endif sont ajoutés aux fichiers include
pour que le fichier ne soit inclus qu’une seule fois lors d’une
compilation.
Enfin, dans tout programme utilisant la classe NomClasse, on
doit inclure le fichier d’en-tête "NomClasse.h". Un tel
programme doit aussi pouvoir accéder au module objet
résultant de la compilation du fichier source contenant la
définition de la classe.
seul les fichiers .cpp sont compilables.
la compilation se fera par exemple :

Prof. Karim RHOFIR C++ & POO


Programmation Orientée Objets - Classes

Le pointeur this
En C++, tous les objets possèdent un champ privé particulier
nommé this, sans qu’il soit nécessaire de le déclarer. Ce champ
contient l’adresse de l’objet courant.
Dans une fonction membre, this représente un pointeur sur
l’instance ayant appelé cette fonction
this est un pointeur constant, c’est-à-dire qu’on ne peut le
modifier.

Prof. Karim RHOFIR C++ & POO


Programmation Orientée Objets - Classes
Le pointeur this : Exemple

class Point {
int x ; int y ;
public :
Point ( int = 0 , int = 0);
void affiche ();
};
Point :: Point ( int x , int y ) { * this . x = x ;
* this . y = y ;}
void Point :: affiche ()
{
cout < < " le ␣ pt :( " << this - >x < < " ," << this - >y < < " ) " ;
cout <<" ␣ est ␣ a ␣ l ’ adresse " << this << endl ;
}

Prof. Karim RHOFIR C++ & POO


Programmation Orientée Objets - Classes

Tableaux d’objets
En théorie, un tableau peut posséder des éléments de
n’importe quel type. Ainsi nous pouvons déclarer un tableau de
N objets d’une classe MaClasse par :
MaClasse tab[N] ;
Or, du fait qu’on ne peu déclarer un objet sans l’initialiser,
cette déclaration ne sera possible que si la classe MaClasse
admet un constructeur sans arguments (ou un constructeur
dont tous les arguments ont des valeurs par défaut).
Ces mêmes remarques s’appliquent pour les tableaux
dynamiques d’objets. Une déclaration de type :
MaClasse * adr = new MaClasse[N] ;
nécessite aussi un constructeur sans arguments.

Prof. Karim RHOFIR C++ & POO

Vous aimerez peut-être aussi