Vous êtes sur la page 1sur 61

Université des Frères Mentouri – Constantine-1

Faculté des ST - Département d'Electronique

PROGRAMMATION ORIENTÉE-
OBJET EN C++
Dr. Amina HAMEURLAINE
Amina.hameurlaine@umc.edu.dz

2018/2019
1. Introduction générale
2. Notion de base de la POO
3. Classes et Objets
4. Héritage et Polymorphisme

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 2


Développement d’un logiciel

Cahier
Analyse
de charges

Conception
Client

Implémentation

Teste

Livraison
Maintenance

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 3


Développement d’un logiciel

Cahier  Etude des besoins des utilisateurs;


Analyse Reformulation du cahier des charges sous une
de charges
forme exploitable en conception.

 Définition de l'architecture logicielle;


Conception Définition du comportement de l'application.
Client

 Implémentation des fonctionnalités définies


Implémentation lors de phases de conception: Programmation.

 Vérification de conformité de l'application


Teste avec le cahier des charges.

Livraison  comprenant toutes les actions correctives


Maintenance (maintenance corrective) et évolutives
(maintenance évolutive) sur le logiciel.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 4


Développement d’un logiciel

Cahier
Analyse
de charges
Méthodes et Langages de
Modélisation:
Conception SADT, SA-RT, MERISE, OMT,
UML, …
Client

Langages de Programmation:
Implémentation Fortran, C, Ada, SmallTalk, Java,
C++, …

Teste

Livraison
Maintenance

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 5


 Langage de Programmation

 Un programme est une suite d'instructions permettant d'exécuter


des actions sur un ordinateur.
 Ces instructions sont écrites dans un langage dit "langage de
programmation".

=> Programmer consiste à construire un ensemble ordonné


d'instructions en utilisant un langage de programmation.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 6


 Langage de programmation:

Un programme est
Programme écrit en
écrit dans un langage
langage machine:
de programmation :
Programme executable
Code source
Traduction:
Compilation/Interprétation

Tous les langages de programmation ont le même but: nous permettre de parler à
l'ordinateur plus simplement qu'en binaire.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 7


 Classement des Langages de Programmation par
«niveau»:

En programmation, la notion
de « niveau » est relative.
Il n'existe pas de méthode
particulière qui permettrait de
déterminer objectivement si
un langage peut être
considéré de bas niveau ou
de haut niveau.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 8


 Le paradigme d'un langage:

 Il s’agit des différentes façons de raisonner et d’implémenter une


solution à un problème en programmation.
 Il existe au moins 20 paradigmes différents et chaque paradigme
amène une technique différente de programmation.
 les plus généraux paradigmes sont:
• La programmation impérative (procedurale)
•La programmation fonctionnelle
•La programmation logique
•La Programmation Orientée Objet (POO)

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 9


 Le paradigme d'un langage:
 La programmation impérative (procédurale):
Un programme impératif n’est rien de plus qu’une suite d’instructions. Il
peut donc être assimilé en quelque sorte à une recette de cuisine, il suffit
de lire les instructions et les exécuter les unes après les autres.
Exemples de langages : Assembleur, Pascal, C.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 10


 Le paradigme d'un langage:
 La programmation fonctionnelle:
− Un programme est défini avec des fonctions pures.
− Le paradigme fonctionnel est basé sur l'idée d'évaluer une formule, et
d'utiliser le résultat pour autre chose.
− Tous les traitements sont faits en évaluant des expressions et en
faisant appel à des fonctions.
Exemples de langages: Lisp, Scala, Erlang, F#.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 11


 Le paradigme d'un langage:
 La programmation logique:
− Le principe est de définir une liste de faits (axiomes) et de règles de
logique qui leur associent des conséquences.
− Utilisé pour les démonstrations automatiques de théorèmes.

Exemples de langages: ProLog, SQL.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 12


 Le paradigme d'un langage:
 La programmation Orientée Objet (POO):
Le principe est ici de programmer des objets, qui représentent un concept,
un objet physique ou un ensemble de données et les actions qui lui sont
rattachées, plutôt que de ne voir ces ensembles uniquement d’un point de
vue procédural.
Exemples de langages: SmallTalk, Java, C++.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 13


 Le paradigme d'un langage:

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 14


Programmation Procédurale V.s Programmation Orientée Objet

Données
Données
Traitements
Traitements
Données Traitements

Données Données

Traitements Traitements

 Un programme est composé de  Un programme est composé d’un


plusieurs procédures /fonctions qui ensemble d’objets qui contiennent:
effectuent un traitement sur des  des données ”internes”
données.  des traitements manipulant ces
 Les données et les traitements sont données.
séparés.  Les données et leurs traitements
 Il n’existe pas un lien directe sont regroupés dans une seule
(sémantique) entre les données et le entité: objet.
traitement: passage des arguments.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 15


Exemple: Calcule de surface d’un rectangle.

Problème: Programmation Procédurale

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 16


Exemple: Calcule de surface d’un rectangle.

Problème: Programmation Procédurale

Traitement  Les données et leurs


traitements sont
séparés;
Le code n’est pas
lisible;
Données

Réutilisation très
difficile!

Passage des arguments

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 17


Exemple: Calcule de surface d’un rectangle.

Problème: Programmation Procédurale

"Pourquoi le logiciel n'est-il pas comme le matériel ?


Pourquoi tout nouveau développement doit-il repartir de zéro ?
Il devrait y avoir des catalogues de modules logiciels, comme il y
a des catalogues de puces de circuits intégrés : pour construire un
nouveau système, on devrait commander des composants dans
les catalogues et les combiner, plutôt que de réinventer la roue à
chaque fois....."

Bertrand Meyer – 2000


Conception et programmation par objets

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 18


Exemple: Calcule de surface d’un rectangle.

Solution: Programmation Orientée Objet.

Classe Rectangle  Les données et leurs


double largeur traitements sont
double hauteur regroupés;
double surface( )  Le programme est
rect1 {…..} rect3
plus lisible;
largeur = 4 => Modularité
largeur = 5
Objets hauteur = 2
rect2 hauteur = 8 Réutilisabilité
largeur = 3.2
hauteur = 4.2

rect1.surface( ); rect2.surface ( ); rect3.surface( );

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 19


Approche Orientée-Objet

 Offre une manière claire de concevoir une architecture modulaire.


 Permet d'écrire des programmes facilement lisibles.
 Permet une maintenance et une évolution des logiciel plus aisée.

L’approche Orientée-objet permet de produire des


programmes modulaires plus claires et plus robustes.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 20


Approche Orientée-Objet

Conception Programmation

Langages de Langages de
Modélisation Programmation
Orientée-Objet Orientée-Objet

Exemple: UML Exemple: C++

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 21


UML: Unified Modeling Language
 Notion standard pour l’analyse et la conception des logiciels.
 Adapté à la modélisation de tous types de systèmes.
 Il s’agit d’un langage graphique de modélisation objet
permettant de spécifier, de construire, de visualiser et de
décrire les détails d’un système logiciel.
 UML définit neuf types de diagrammes divisés en deux catégories:

Diagrammes statiques: Diagrammes dynamiques:


structurels comportementaux
Diagramme de cas d’utilisation, Diagrammes d’activités,
Diagrammes de classes, Diagrammes de séquences,
Diagrammes d’objets, Diagrammes d’états-transitions
Diagrammes de composants, Diagrammes de collaborations.
Diagrammes de déploiements.
Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 22
Langage C++
 Le langage C++ est une évolution du langage C avec plusieurs nouveautés.
 Il a été crée en 1983 par Bjarne Stroustrup, un informaticien originaire du
Danemark.
 Le C++ est un langage multi-paradigmes: on peut programmer de différentes
façons (procédurale, fonctionnelle, Orientée Objet).
 C’est l'un des langages de programmation les plus utilisés actuellement (très
populaire).
 Il est rapide, ce qui en fait un langage de choix pour les applications critiques
qui ont besoin de performances, les jeux vidéo par exemple.
 Il est portable: un même code source peut théoriquement être transformé
sans problème en exécutable sous Windows, Mac OS et Linux.
 Il existe de nombreuses bibliothèques pour le C++. Les bibliothèques sont
des extensions pour le langage.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 23


"Un langage de programmation ne s'apprend pas dans les
livres ou dans un cours. La programmation s'apprend par la
pratique. »

Pas de pratique Pas de programmation

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 24


Sommaire

1. Introduction générale
2. Concepts de base de la POO
3. Classes et Objets
4. Héritage et Polymorphisme

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 25


1 Encapsulation/Abstraction
Mieux organiser les
programme dans
le sens de la:
2 Héritage robustesse,
modularité,
lisibilité ,
maintenance

3 Polymorphisme

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 26


1 Encapsulation/Abstraction
Rectangle
double largeur
 L'encapsulation est le fait de pouvoir regrouper double hauteur
dans une seule et même entité des données double surface( )
(attributs) et des traitements qui agissent sur ces {…..}
données (méthodes) .
rect1 rect2
 Avec la notion d'abstraction on peut travailler avec largeur = 3.2
largeur = 4
des entités abstraites au lieux de travailler avec des hauteur = 2 hauteur = 4.2
descriptions détaillées des données.

rect3
Se focaliser sur l’essentiel, et cacher les détailles
largeur = 5
hauteur = 8

rect1.surface( ); rect2.surface ( ); rect3.surface( );

Interfaces
Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 27
1 Encapsulation/Abstraction

 Pour utiliser une classe ou un nouveau type d’objet, nous n’avons


besoin d’en connaitre que l’interface d’utilisation qui prévue par le
programmeur .
=> Dissimuler les détailles d’implémentation interne (qu’il n’est pas
utile d’en connaitre).

Protection des données et du fonctionnement interne

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 28


1 Encapsulation/Abstraction

Programmeur Programmeur
Développeur Utilisateur

Interfaces

Méthodes visibles

Ecriture du programme: Utilisation du programme:


Définition des classes Utilisation des classes via leurs
Attributs + Méthodes objets

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 29


1 Encapsulation/Abstraction

Programmeur Programmeur
Développeur Utilisateur

Interfaces

Méthodes visibles

Ecriture du programme: Utilisation du programme:


Définition des classes Utilisation des classes via leurs
Attributs + Méthodes objets

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 30


1 Encapsulation/Abstraction

Droits d’accès:
Chaque attribut et chaque méthode d'une classe peut posséder son
propre droit d'accès. Il existe trois types de droits d'accès:
Accès public : l'attribut ou la méthode peut être appelé depuis
l'extérieur de la classe.
 Accès privé : l'attribut ou la méthode ne peut pas être appelé depuis
l'extérieur de la classe.
Accès protégé : tout attribut ou méthode protégé(e) n'est accessible
que dans les descendants (les sous-classes).

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 31


2 Héritage

 L'héritage est un concept très important qui représente une part non
négligeable de l'intérêt de la programmation orientée objet.
 Il consiste à définir différents niveaux d'abstraction.
 L'héritage établit une relation de spécialisation/généralisation entre
les classes.
 Il permet de construire des classes (sous-classes) à partir de classes
existantes (classes mères, super classes, classes de bases).

Une sous-classe est une spécialisation d'une classe appelée sa


superclasse;
 une classe hérite des caractéristiques de sa superclasse : elle en
partage les attributs et les méthodes.

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 32


2 Héritage
Eviter la duplication
Généralisation
Classe A du code

Spécialisation
Attributs Organiser le code.

méthodes

Classe B Classe C

Exemples:
 une voiture est un véhicule (Voiture hérite de Véhicule) ;
un bus est un véhicule (Bus hérite de Véhicule) ;
un corbeau est un oiseau (Corbeau hérite d'Oiseau) ;
 un chirurgien est un docteur (Chirurgien hérite de Docteur).
Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 33
3 Polymorphisme

Le polymorphisme est un mécanisme qui permet à une sous classe de


redéfinir une méthode dont elle a hérité tout en gardant la même
signature de la méthode.
 Grace a l'héritage, le même code pourra être appliqué a différentes
sous-classes .
 Grace au polymorphisme, le même code appliqué a différentes
sous-classes pourra avoir un comportement différent (propre a chaque
sou classe).
Exemple: Employé

Calcul_salaire()

secrétaire Ingénieur
Calcul_salaire()
Calcul_salaire()

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE 34


Sommaire:

1. Introduction générale
2. Concepts de base de la POO
3. Classes et Objets
4. Héritage et Polymorphisme
 Une classe est une structure regroupant les mêmes types de données et
les mêmes traitements d’une famille d'objets.
 Une classe présente une description abstraite d’un ensemble d’objets.
 Une classe est composée de plusieurs membres dont chacun soit:
un attribut : variable typée,
une méthode: ensemble d’instructions de traitement.

ClasseA

attribut1
attribut2
Attributs Attribut3
…..

méthode1()
Méthodes méthode2()
….

Cours Programmation Orientée Objet en C++ Dr. A.HAMEURLAINE


Représentation C++ Représentation UML

class NomClasse { Classe A


private: - attribut1: type
type attribut1; Droits d’accès - attribut2:type
1.

type attribut2; + public #attribut3: type


protected: - private
# protected +méthode1()
type attribut3; +méthode2()
public:
type Methode1(arguments)
{ // définition de la methode1 } Règle d’encapsulation:
type Methode2(arguments) Tous les attributs d’une classe
{ // définition de la methode2} doivent toujours êtres privés (ou
protégée)
};
2.1.1 Attributs Rectangle

class Rectangle { - hauteur: double


- largeur: double
private:
double hauteur; +surface()
double largeur;

public:
double surface ()
{ return hauteur * largeur; }
};
2.1.2 Méthodes Rectangle

class Rectangle { - hauteur: double


- largeur: double
private:
double hauteur; +surface()
double largeur;

public: Méthode = Fonction


double surface ()
{ return hauteur * largeur; }
};
1.2 Méthodes
Il existe 2 types de méthodes .
 Des méthodes qui modifient l’ état de l’objet => Actions
 Des méthodes qui ne changent rien à l’objet => Prédicats

 Pour indiquer qu’une méthode est un prédicat, on utilise le mot clé


const.
Exemple:

public:
double surface () const
{ return hauteur * largeur; }
Un objet est une instance d'une classe. Rectangle

class Rectangle { - hauteur: double


- largeur: double
private:
double hauteur; +surface()
double largeur; rect1
largeur = 4
hauteur = 2
public: rect2
double surface () const largeur = 3.2
{ return hauteur * largeur; } rect3 hauteur = 4.2

}; largeur = 5
hauteur = 8
Int main() {
Rectangle rect1;
rect1.hauteur = 2;
rect1.largeur = 4;
cout <<rect1.surface()<<endl;
}
Problème!

class Rectangle {
private:
double hauteur;  Tous les attributs sont
double largeur; en mode privé!
On peut pas y accéder
public: depuis l’extérieur de la
double surface () const classe!!!!
{ return hauteur * largeur; }
};
Int main() {
 Comment faire pour les
Rectangle rect1;
initialiser ??!!
rect1.hauteur = 2;
rect1.largeur = 4;
cout <<Rect1.surface()<<endl;
}
Solution 1:
Manipulateurs (setters) / Accesseurs (getters)
class Rectangle {
private:
double hauteur; Setter: Action qui permet:
double largeur;
public:  Modification des valeurs des attributs;
void setHauteur (double h) { hauteur = h; }  Affectation des valeurs aux attributs.
void setLargeur (double L) { largeur = L; }
double getHauteur () const { return hauteur ; } => Pas de retour .
double getLargeur () const { return largeur ; }
 Gettre: Prédicat qui permet:
double surface () const
{ return hauteur * largeur; }  Consultation d’un attribut: lecture
}; seule.
Int main() { => Retour de la valeur d’un attribut.
Rectangle rect1;
rect1.setHauteur (2); rect1.setLargeur (4);
cout <<rect1.getHauteur()<<endl;
cout <<rect1.getLargeur()<<endl;
cout <<rect1.surface()<<endl;
}
Solution 2:

En c++, il y a des méthodes prédéfinies qui permettent d’initialiser


les attributs des objets.

Les Constructeurs

les constructeurs servent à construire les objet en mémoire.


Leur rôle principal est d'initialiser les attributs des objets.
 Ils sont appelés lors de la création des objets.
Un constructeur est une méthode sans aucun type de retour.
2.2.1 Les Constructeurs
Déclaration:
Il faut que le constructeur ait le même nom que la classe.
Le constructeur ne doit rien renvoyer, pas même void !

public:
nomConstructeur (arguments)
{ //Initialisation des attributs }

Ou:

public:
nomConstructeur (arguments) : initialisation1, initialisation2 //liste
//d'initialisations
{ } //le corp est vide
2.2.1 Les Constructeurs
Exemple:

class Rectangle { class Rectangle {


private: private:
double hauteur; double hauteur;
double largeur; double largeur;
public: public:
Rectangle (double h, double L) { ou Rectangle (double h, double L) : hauteur(h), largeur(L)
hauteur = h; { }
largeur = L; }
double surface () const double surface () const
{ return hauteur * largeur; } { return hauteur * largeur; }
}; };
Int main() { Int main() {
Rectangle rect1(2, 4); Rectangle rect1(2, 4);
cout <<Rect1.surface()<<endl; cout <<Rect1.surface()<<endl;
} }

On appelle le constructeur Rectangle pour l’objet rect1 avec les paramètres 2 et 4


2.2.1 Les Constructeurs
class Rectangle {
Attention! private:
double hauteur;
double largeur;
public:
Rectangle (double h, double L) : hauteur(h), largeur(L)
{ }
double surface () const
{ return hauteur * largeur; }
};
Int main() {
Rectangle rect1(2, 4);
Mais si on appelle le constructeur Rectangle rect2(6);
avec un seul paramètre ou bien Rectangle rect3;
sans mettre des paramètres?! Rectangle rect4(rect1); // constructeur de copie
cout <<Rect1.surface()<<endl;
cout <<Rect2.surface()<<endl;
cout <<Rect3.surface()<<endl;
}
2.2.1 Les Constructeurs
class Rectangle {
private:
double hauteur;
Solution: double largeur;
public:
Déclaration des constructeurs Rectangle (double h=0, double L=0) : hauteur(h),
avec initialisation de 0. largeur(L) { }
double surface () const
{ return hauteur * largeur; }
};
Int main() {
Rectangle rect1(2, 4);
Rectangle rect2(6);
Note: Rectangle rect3;
Rectangle rect4(rect1); // constructeur de copie
Un constructeur qui n’a pas de
cout <<Rect1.surface()<<endl;
paramètres s’appelle cout <<Rect2.surface()<<endl;
«constructeur par default ». cout <<Rect3.surface()<<endl;
}
2.2.2 Les Destructeurs

 Le destructeur est une méthode appelée lorsque l'objet est supprimé de la


mémoire.
 Son rôle principal est de libérer la mémoire (via des delete) qui a été
allouée dynamiquement.
 Il porte le même nom que la classe;
 Il est appelé automatiquement `a la fin du programme.

~nomDestructeur()
{}

Ou:
~nomDestructeur(){
delete attribut1;
delete attribut2;
}
Les prototypes

 On peut définir des méthodes à l’extérieur de la classe.


La classe ne contient que des prototypes;
Les détailles des méthodes sont à l’extérieur de la classe.
La définition de la méthode doit être reliée à la classe concernée en
utilisant l’operateur :: .

class NomClasse {
private:
type attribut1;
type attribut2;
public:
type nomMethode(arguments); // prototype de la methode1
};
Type NomClasse : : nomMethode(arguments)
{ // définition de la methode1 }
Séparation prototypes et définitions dans de différents fichiers

 On peut séparer la déclaration des classes et la définition des méthodes


dans des fichiers différents pour avoir un code plus modulaire.
 Pour chaque classe, on peut créer :
un header (fichier *.h) qui contiendra les attributs et les prototypes de
la classe ;
un fichier source (fichier *.cpp) qui contiendra la définition des
méthodes et leur implémentation.
Séparation prototypes et définitions

Exemple:
 Fichier (Rectangle.h) : déclaration de la classe Rectangle, ses attributs et
les prototypes de ses méthodes;

Dans les fichiers .h, il est recommandé


de ne jamais mettre la directive using
namespace std;
Pour les variables de type string, il faut
rajouter le préfixe std:: devant
chaque string du .h.
Séparation prototypes et définitions

Exemple:
 Fichier (Rectangle.cpp):définitions des méthodes de la classe Rectangle.

On peut aussi rajouter ici


un using namespace std;.
On a le droit de le faire car on
est dans le .cpp.
Séparation prototypes et définitions

Exemple:
 Fichier (main.cpp):Créations des objets + appels des méthodes.

Il faut inclure les fichiers


Rectangle.h et
Rectangle.ccp .
Les attributs statiques

 Il est possible que tous les objets d’une même classe partagent une ou
plusieurs données qui seront identiques pour tous ces objets.
=> attributs statiques
 Ils ressemblent à des variables globales dont la portée est limitée à cette
classe.
 Leur déclaration est précédée du mot-clé static.
 Leur initiation se fait en dehors de la déclaration de la classe.

class NomClasse {
private:
static type attribut1;
};

type NomClasse :: attribut1 = valeur;


Les attributs statiques
 Exemple:
class Rectangle {
private:
double hauteur; double largeur;
static int nb_instances;
public:
Rectangle (double h=0, double L=0) : hauteur(h), largeur(L)
{++ nb_instances;
cout <<" Rectangle "<<nb_instances << endl;
cout<<"la hauteur est: "<<h<<endl;
cout<<"la largeur est: "<<L<<endl;
cout<<endl; }
double surface () const { return hauteur * largeur; }
~ Rectangle () {
--nb_instances;
cout <<"Il reste " <<nb_instances <<" rectangle \n"; }
};
int Rectangle::nb_instances=0 ;
Int main() {
Rectangle rect1(2, 4);
Rectangle rect2(6);
Rectangle rect3;
}
Les méthodes statiques
 une méthode statique est partagée par toutes les instances d’une même
classe.
 Au lieu d’être appelée avec un objet de la classe, elle est appelée avec le
nom de la classe.
 Elle ne peut pas accéder aux données membres d’un objet et elle ne peut
pas appeler une méthode non statique.
 Les méthodes statiques sont généralement utilisées pour manipuler les
données statiques.

class NomClasse {
public:
static type methode () { return variable ;}
};

type NomClasse :: attribut1 = valeur;


Les méthodes statiques
 Exemple: class Rectangle {
private:
double hauteur; double largeur;
public:
static int nb_instances;
Rectangle (double h=0, double L=0) : hauteur(h), largeur(L)
{++ nb_instances;
cout <<"Rectangle "<<nb_instances << endl;
cout<<"la hauteur est: "<<h<<endl;
cout<<"la largeur est: "<<L<<endl;
cout<<endl; }
static int affiche () { return nb_instances; }
double surface () const { return hauteur * largeur; }
~ Rectangle () {
--nb_instances;
cout <<"Il reste " <<nb_instances <<" rectangle \n"; }
};
int Rectangle::nb_instances=0 ;
Int main() {
Rectangle rect1(2, 4);
Rectangle rect2(6);
Rectangle rect3;
cout<<" Nombre d’objets crees = "<<Rectangle :: affiche ()<< endl;
Les fonctions amies
 Une fonction extérieure a une classe A (fonction globale ou fonction
membre d’une autre classe) peut être déclarée amie de classe A.
=> toutes les données et méthodes membres de cette classe
(privées/publics) deviennent accessibles pour cette fonction.
 Une même fonction peut être amie de plusieurs classes.
 La déclaration d’une fonction comme amie a une classe A doit être faite a
l’intérieur de la classe A en utilisant le mot-clé friend.
 Seules les fonctions déclarées amies `a l’intérieur d’une classe peuvent
accéder `a cette classe: contrôle d’accés.

class ClasseA {
…..
puclic:
friend type nomFonction (arguments); //fonction amie globale
friend type ClasseB :: nomMethode (arguments); //fonction amie membre d’une classe B
};
Les classes amies

 Une classe A peut être déclarée amie d’une classe B


=>tous les membres de la classe B deviennent accessibles pour la
classe A.

class ClasseA {
…..
};
class ClasseB {
….
puclic:
friend class ClasseA; //ClasseA est amie de ClasseB
};

Note: si la classe A est amie de la classe B, ¸ca ne veut pas dire


que B est amie de la classe C.
Les associations entre classes
L’association est une relation structurelle précisant que les objets d’une classe
sont reliés aux objets d’une autre classe.
Elle est représentée par un attribut.
Elle est définie par : un rôle et une multiplicité.