Académique Documents
Professionnel Documents
Culture Documents
HAJRI Sarra
Qu’est ce qu’un programme orienté objet?
Données membres
Fonctions membres
.
Qu’est ce qu’un objet?
Partie privée
Vision interne
Partie publique Vision externe
class Ellipse
{ • Visibilité des membres :
– public : membres accessibles à
Vision private: tous
interne float m_cX, m_cY; – private : membres accessibles à
float m_a, m_b; partir de la classe ; accès
impossible par l’extérieur
public : – protected : membres accessibles
Vision void deplace(float dx, float dy); à partir de la classe et des
externe void zoom(float z); classes dérivées ; accès
float surface(); impossible par l’extérieur
};
NB : dans cet exemple, on a choisi de représenter l'ellipse en interne à la classe par les coordonnées de
son centre (cX, cY), par son grand axe a et par son petit axe b.
Classe : implantation
• Constructeurs particuliers :
• constructeur par défaut
• Ne contient aucun argument
• Automatiquement généré si aucun constructeur n’est défini
• A définir explicitement dans le cas contraire
• constructeur de copie
• Contient comme argument un objet du même type
• Sert à créer des clones d’objets
Constructeurs de classe : exemple
etc …
Destructeur de classe
• Fonction membre systématiquement appelée juste avant
la destruction d’un objet
• Porte le nom de la classe et est précédé de ~
• Pas de type de retour
• Pas d’arguments
• Un seul par classe
• Permet de libérer les ressources
Destructeurs de classe : exemple
public : }
void deplace(float dx, float dy);
void zoom(float z); void Ellipse::deplace(float dx, float dy)
float surface(); {
}; m_cX += dx; m_cY += dy;
}
etc …
L’héritage
• L'héritage est un principe propre à la POO qui permet de
créer une nouvelle classe à partir d'une classe existante.
Forme
Ellipse Rectangle
Cercle Carre
Un cercle est un spécialisation d'une ellipse, il en possède les propriétés plus d'autres
qui lui sont spécifiques. On dérive donc la classe Cercle de la classe Ellipse .
Héritage
public :
void deplace(float dx, float dy);
void zoom(float z); cercle.cpp
float surface(); #include <iostream.h>
}; Le constructeur de la classe dérivée
#include “cercle.h”
appelle généralement un des
Cercle::Cercle() : public Ellipse() constructeurs de la classe de base.
ellipse.cpp {
}
#include <iostream.h> Cercle::Cercle(float x, float y, float diametre) : public Ellipse( x, y, diametre,
diametre)
void Ellipse::affiche() {
{ }
std::cout << "Ellipse de grand axe " << m_a;
void Cercle::affiche()
std ::cout << " et de petitt axe " << m_b << "\n";
} {
std::cout << "Cercle de rayon " << m_a / 2 << "\n";
Fonctions et classes amies
Classe amis : Une classe amis peut accéder aux membres privés et protégés d’une
autre classe dans laquelle elle est déclarée comme ami. Il est parfois utile de
permettre à une classe particulière d’accéder à des membres privés d’une autre
classe
Par exemple, la classe Carre peut être autorisée à accéder aux membres privés de
Rectangle
class Rectangle {
private:
int x, y;
//Maintenant la classe Carre peut accéder aux membres
privés de Rectangle
friend class Carre;
};
Fonctions et classes amies
Les amis ne devraient être utilisés qu’à des fins limitées. s’il y’a trop de
fonctions ou de classes externes déclarées en tant qu’amis d’une classe,
cela diminue la valeur de l’encapsulation dans la programmation orientée
objet.
Situations d’amitié
n amie
Fonctions et classes amies
Remarques:
char, A);
• L’emplacement de la déclaration d’amitié au sein de la classe point est
absolument indifférent.
Une fonction polymorphe (ou virtuelle) est une méthode qui est appelée en
fonction du type d’objet et non en fonction du type de pointeur utilisé.
- Lorsqu’on appelle une fonction virtuelle pour un objet, le C++ cherche cette
méthode dans la classe correspondante. Si cette fonction n’existe pas dans la
classe concernée, le C++ remonte la hiérarchie des classes jusqu'à ce qu’il
trouve la fonction appelée.
- Une fonction virtuelle ne peut être appelée par une autre méthode de la classe.
- Une fonction virtuelle ne peut être utilisée dans le corps d’un constructeur ou
d’un destructeur.
- Définir une fonction virtuelle pure entraîne :
- Une méthode virtuelle pure est une méthode qui est déclarée mais non
définie dans une classe. Elle est définie dans une des classes dérivées de cette
classe.
Une classe qui contient la définition d’une fonction virtuelle pure devient
une classe abstraite.
La redéfinition des fonctions virtuelles pures est obligatoire dans toutes les
classes dérivées. Dans le cas contraire, les classes dérivées deviennent
obligatoirement abstraites (Une classe abstraite est une classe qui ne peut
être instanciée.
Polymorphisme
Un objet héritant une méthode d'une classe parente peut réagir de façon différente à l'appel de cette
méthode.
ellipse.h cercle.h
class Ellipse #include “ellipse.h” main.cpp
{
#include " cercle.h"
public : class Cercle : public Ellipse
Ellipse(); {
int main() La fonction deplace() n’est pas
Ellipse (float x, float y, float a, float b); public :
{ redéfinie dans la classe Cercle,
Ellipse(const Ellipse & e); Cercle();
Ellipse e(0, 0, 8.5, 10.2); appelle celle de Ellipse.
~Ellipse(); Cercle (float x, float y, float d);
~ Cercle(); e.deplace(-1, 1); La fonction affiche() est redéfinie
protected : public : e.affiche(); dans la classe Cercle, appelle celle
float m_cX, m_cY; virtual void affiche(); de Cercle.
float m_a, m_b; }; Cercle c(-2.5, 2.5, 7,4);
c.deplace(0.5, 1.5);
public : c. affiche();
void deplace(float dx, float dy); cercle.cpp Appelle la fonction affiche()
void zoom(float z); de la classe Ellipse.
#include “cercle.h” Ellipse *p1;
float surface();
virtual void affiche(); p1 = new Ellipse;
}; Cercle::Cercle() : public Ellipse() p1 ->affiche();
{
} Ellipse *p2; Si la fonction affiche() est
p2 = new Cercle; virtuelle et est redéfinie dans
Cercle::Cercle(float x, float y, float d) : p2->affiche(); la classe Cercle, appelle celle
ellipse.cpp public Ellipse( x, y, d, d)
de Cercle bien que le pointeur
{
#include <iostream.h>
return 0; soit de type Ellipse. C'est le
}
} mécanisme de polymorphisme
void Ellipse::affiche() d'héritage.
void Cercle::affiche()
{ {
std::cout << "Ellipse de grand axe " << m_a; std::cout << "Cercle de rayon ";
std ::cout << " et de petit axe " << m_b << "\n"; std::cout << m_a / 2 << "\n";
} }
Gestion des exceptions
De nombreux problèmes apparaissent pendant l’exécution d’un programme,
l’insuffisance de mémoire, la perte d’un fichier, la saisie non valide d’une
valeur Le rôle d’un programme consiste à prévoir ces erreurs, et à mettre en
œuvre des solutions de ces erreurs d’exécution.
int positive(int v)
{ if(v<0) return 0;
cout<<«Valeur positive \n»;
return 1 ;
Exemple
class erreur
{
………………
};
Exemple
void positive(int v)
{
if(v<0)
{
erreur er;
throw er;
}
cout<<"Valeur positive \n";
Gestion des exceptions
2.3. Intercepter l’exception
Pour intercepter une exception, C++ fournit une syntaxe basée sur
l’utilisation des blocs try et d’un ou plusieurs blocs catch :
try
{
//Appels de fonctions pouvant générer des erreurs
}
catch (classe d’exception)
{
//Ce bloc s’exécute pour une exception de type
//‘classe d’exception’
}
catch(…)
{
//Ce bloc s’exécute pour toutes les exceptions
//en dehors de la classe d’exception
}
Gestion des exceptions
Si une exception est envoyée par une de ces fonctions appelées dans le bloc ‘try’, le
mécanisme d’exception entraînera les étapes suivantes :
- Tous les objets créés dans le bloc ‘try’ sont détruits’
- Le programme sort du bloc ‘try’ après la fonction qui a entraîné l’exception et
n’exécute pas les instructions situées après cette fonction.
- Le C++ exécute dans l’ordre soit le bloc ‘catch’ correspondant à l’exception
interceptée si elle existe, soit le bloc ‘catch(…)’ si aucune de ces conditions n’est
remplie, cela entraîne la fin de l’exécution du programme, si un des blocs ‘catch’ a
été utilisé, le programme continu à exécuter les instructions situées après ce bloc
s’il y en a.
Remarque
Dans un bloc ‘catch’ on peut par exemple :
- arrêter le programme avec ou sans message utilisateur.
- corriger le problème avec ou sans message utilisateur
- uniquement informer l’utilisateur.
class erreur { };
void positive(int v)
{ if(v<0) throw erreur();
cout<<"Valeur positive \n";
}
void inf(int v,int max)
{ if(v>max) throw erreur();
cout<<"Valeur inférieure à : "<<max<<endl;
}
void sup(int v,int min)
{ if(v<min) throw erreur();
cout<<"Valeur supérieure à : "<<min<<endl;
}
//--------------------------------------------------------
main()
{
int minimum=10; int maximum=100;
try
{
int n;
cout<<"Saisir une valeur entière : "; cin>>n;
positive(n);
inf(n,maximum);
sup(n,minimum);
cout<<"Valeur correcte !\n";
}
catch(erreur er)
{
cout<<"valeur incorrecte! \n";
}
catch(...)
{
cout<<"Erreur inconnue !\n";
}