Escolar Documentos
Profissional Documentos
Cultura Documentos
S. El Abdellaoui
Mohamed
El Nabil
Abdellaoui SaïdSaidi 2015/ 2016
Classe, Objet
2
Classe, Objet (exemple)
Une classe est la description d'une famille d'objets ayant même structure
(données) et même comportement (méthodes).
a b
x =? x =?
y=? y=?
Mohamed
El Nabil
Abdellaoui SaïdSaidi 3
Classe, Objet (Déclaration)
En C++ une classe se déclare par le mot-clé class.
Exemple :
class Rectangle {
...
};
Mohamed
El Nabil
Abdellaoui SaïdSaidi 4
La vie d’un Objet
création
initialisation
observation modification
libération
destruction
Mohamed
El Nabil
Abdellaoui SaïdSaidi 5
Création, initialisation et affectation des objets
Création :
• C++ fournit un constructeur par défaut.
• Ce constructeur permet la création de nouveaux class Rectangle{
objets. …..
};
• On pourra définir ses propres constructeurs.
Mohamed
El Nabil
Abdellaoui SaïdSaidi 6
Déclaration des attributs et méthodes
Attributs:
• La syntaxe de la déclaration des attributs est : #include <iostream>
Using namespace std;
type nom_attribut ;
class Rectangle{
• L’accès aux valeurs des attributs d’une instance double hauteur;
de nom nom_instance se fait comme pour accéder double largeur;
aux champs d’une structure : };
Mohamed
El Nabil
Abdellaoui SaïdSaidi 7
Déclaration des attributs et méthodes
Méthodes:
• La syntaxe de définition des méthodes est :
Type_retour nom (type_par1 nom_par1, ...)
{
... // corps de la méthode
}
• La déclaration des méthodes suie deux façon :
Interne : La déclaration des méthodes est à l’intérieure de la classe.
Externe : Pour relier la définition d’une méthode à la classe pour
laquelle elle est définie, il suffit d’utiliser l’opérateur :: de résolution de
portée :
La déclaration de la classe contient les prototypes des méthodes
Mohamed
El Nabil
Abdellaoui SaïdSaidi 8
Déclaration et appels des méthodes
Appel :
Mohamed
El Nabil
Abdellaoui SaïdSaidi 9
Déclaration des attributs et méthodes
Actions et Prédicats :
• En C++, on peut distinguer les méthodes qui modifient l’état de l’objet (« actions »)
de celles qui ne changent rien à l’objet (« prédicats »). On peut pour cela ajouter le
mot const après la liste des paramètres de la méthode :
class Rectangle{
double hauteur;
double largeur;
double surface() const ; // prototype
};
// définition
double Rectangle :: surface() const
{
return hauteur×largeur;
}
• Si vous déclarez une action en tant que prédicat (const), vous aurez à la compilation
le message d’erreur :
assignment of data-member ‘...’ in read-only structure
Mohamed
El Nabil
Abdellaoui SaïdSaidi 10
Contrôle d'accès
- Attributs de protection des membres d'une classe : En C++, on peut contrôler
l'accès aux membres des structures class et aussi struct, en leur donnant un attribut
public, private, protected .
Public :
Les membres public sont accessibles par tout le
programme. Les membres public définissent l’interface de
class TXX{
la classe (ne mettre que des méthodes en public).
public:
int Calculer(int);
Protected : void Afficher();
Les membres placés après ce mot réservé peuvent être
atteints par les fonctions membres déclarées (ou définies) };
dans la même structure ou classe et par les classes dérivées
de cette classe (notion de famille : cf héritage).
Mohamed
El Nabil
Abdellaoui SaïdSaidi 11
Contrôle d'accès
Private :
Les membres privés ne sont accessibles que par les méthodes membres (ou
friend , notion vue plus tard).
class TXX{
private :
int numéro
};
Mohamed
El Nabil
Abdellaoui SaïdSaidi 12
Accesseurs et manipulateurs
- Si le programmeur le juge utile, il inclut les méthodes publiques nécessaires ...
Mohamed
El Nabil
Abdellaoui SaïdSaidi 13
Exemple Complet (1/3)
#include <iostream>
Déclaration Interne : using namespace std;
// définition de la classe
class Rectangle{
// Attributs
Private :
double hauteur;
double largeur;
// Méthodes
Public :
double surface() const {return hauteur×largeur; }
double getHauteur() const {return hauteur; }
double getLargeur() const {return Largeur; }
double setHauteur (double h) {hauteur = h; }
double setLargeur(double l) {largeur = l; }
};
Mohamed
El Nabil
Abdellaoui SaïdSaidi 14
Exemple Complet (2/3)
#include <iostream>
Déclaration Externe : using namespace std;
// définition de la classe
class Rectangle{
// Attributs
Private :
double hauteur;
double largeur;
// Prototypes
Public :
double surface() const ;
double getHauteur() const ;
double setHauteur (double h); //idem pour les autres
};
// Méthodes
Public :
double Rectangle:surface() const {return hauteur×largeur; }
double Rectangle:getHauteur() const {return hauteur; }
double Rectangle:setHauteur (double h) {hauteur = h; }
//idem pour les autres
Mohamed
El Nabil
Abdellaoui SaïdSaidi 15
Exemple Complet (3/3)
// Utilisation de la Classe
Main(): int main() {
Rectangle rect;
double lu;
return 0;
Mohamed
El Nabil
Abdellaoui SaïdSaidi 16
Implémentation de la classe
Mohamed
El Nabil
Abdellaoui SaïdSaidi 17
Auto-référence : le pointeur this
Si, dans une méthode, un attribut est masqué alors la valeur de l’attribut peut
quand même être référencée à l’aide du mot réservé this.
Mohamed
El Nabil
Abdellaoui SaïdSaidi 18
Constructeur,
Destructeur
19
Notion de constructeur
Un constructeur est une fonction membre qui permet de dégager l ’utilisateur des
taches d ’allocation/initialisation.
Syntaxe :
NomClasse(liste_parametres) NomClasse(liste_parametres) :
{ liste des initialisations des
//initialisation des paramètres parametres {}
}
Mohamed
El Nabil
Abdellaoui SaïdSaidi 20
Notion de constructeur
class point
{ int x,y;
public: point() {x = 20; y = 10;}
void deplace(int dx , int dy) {x = x+dx; y = y+dy;}
void affiche() {gotoxy(x,y);cout<<"Je suis en "<<x<<" "<<y<<"\n";}
};
void main()
{ point a,b; // les deux points sont initialisés en 20,10
a.affiche(); a.deplace(17,10); a.affiche();
getch() ;}
Mohamed
El Nabil
Abdellaoui SaïdSaidi 21
Notion de constructeur
Une classe peut avoir plusieurs constructeurs.
class point
{ int x,y;
public:
point() {x = 20; y = 10;} //constructeur 1
point( int abs, int ord) {x = abs; y = ord;} //constructeur 2
void deplace( int dx , int dy) {x = x+dx; y = y+dy;}
void affiche() {cout<<"Je suis en "<<x<<" "<<y<<"\n";}
};
void main()
{
point a,b; // constructeur 1 :les deux points sont initialisés en 20,10,
point c(15,30); // constructeur 2 :c sera initialisé en 15, 30
point d(11, 21); //constructeur 2 :d sera initialisé en 11, 21
a.affiche(); a.deplace(17,10); a.affiche();
b.affiche(); b.deplace(5,5); b.affiche();
c.affiche(); c.deplace(51,5); c.affiche();
d.affiche(); d.deplace(5,10); d.affiche();
}
Mohamed
El Nabil
Abdellaoui SaïdSaidi 22
La vie d’un Objet
création
initialisation
observation modification
libération
destruction
Mohamed
El Nabil
Abdellaoui SaïdSaidi 23
Notion de destructeur
Le destructeur est une fonction membre systématiquement exécutée «à la fin de
la vie » d’un objet statique, automatique, ou dynamique. On ne peut pas passer de
paramètres par le destructeur.
class vecteur
{ int taille,*v;
public:
//constructeur
vecteur( int n) {if (n>0) {taille = n; v=new int[n];}}
//destructeur
~ vecteur() {cout<<’ ’appel au destructeur ’ ’}};
void main()
{ vecteur Vect;
getch() ;}
Mohamed
El Nabil
Abdellaoui SaïdSaidi 24
Notion de destructeur
class point
{int x, y;
public :
point( int a ,int b ) //constructeur
{cout <<"constructeur de l'objet("<<a<<","<<b<<")...\n";x=a;y=b;}
void deplacer( int dx, int dy) {x=x+dx; y=y+dy;}
void afficher(){gotoxy (x,y);cout<<"je suiss en "<<x<<" "<<y<<"\n";}
~point() {cout<<"destructeur de l ’objet("<<this->x<<","<<this->y<<")\n";}
};
void main()
{ point a(5,5),b(10,10);
a.afficher(); b.afficher();
getch();
}
Mohamed
El Nabil
Abdellaoui SaïdSaidi 25
Notion de destructeur
Création d ’un objet dynamiquement par new
class point
{int x, y;
public :
point( int a ,int b ) //constructeur
{cout <<"constructeur de l'objet("<<a<<","<<b<<")...\n";x=a;y=b;}
void deplacer( int dx, int dy) {x=x+dx; y=y+dy;}
void afficher(){gotoxy (x,y);cout<<"je suiss en "<<x<<" "<<y<<"\n";}
~point() {cout<<"destructeur de l ’objet("<<this->x<<","<<this->y<<")\n";}
};
void main()
{ point *p;
p=new point(10,4);
p->afficher();
getch();
}
Mohamed
El Nabil
Abdellaoui SaïdSaidi 26
Constructeur par défaut
Constructeur par défaut : est un constructeur sans arguments ou dont chacun des
arguments possède une valeur par défaut. Il est utilisé lorsque l ’on crée des
tableaux d ’objets.
class Toto
{ int n;
Exemple :
public: Toto( int i); //constructeur}
};
void main()
{ Toto tableau[3]; //Erreur : il faut un constructeur par défaut
getch() ;}
class Toto
{ int n;
public: Toto( int i=30); //constructeur par défaut}
};
void main()
{ Toto tableau[3]; //Correct : tous les objets initialisés à 30
getch() ;}
Mohamed
El Nabil
Abdellaoui SaïdSaidi 27
Constructeur par défaut par défaut
Si aucun constructeur n’est spécifié, le compilateur génère
automatiquement une version minimale du constructeur par défaut qui :
NomClasse()= default;
Mohamed
El Nabil
Abdellaoui SaïdSaidi 28
Constructeur par copie
Constructeur par recopie : est spécialisé dans la création d ’un objet à partir d ’un autre
objet pris comme modèle.
5
a *
class vect
{int taille; // nbre elts
5
double * adr; // ptr sur ces elts b *
public :
vect(int n ) //constructeur
{adr=new double[taille=n];
cout << "Const. Usuel -adr objet "<<this<<" -adr vecteur " <<adr<< "\n" ;}
~vect() {cout<< " Dest. -adr objet" <<this<<" -adr -vecteur <<adr<< "\n";
};
void main()
{ vect a(5);
vect b=a;}
Mohamed
El Nabil
Abdellaoui SaïdSaidi 29
Constructeur par copie
La syntaxe du constructeur par recopie T::T(T&)
class vect
{int taille; double * adr;
public : vect(int n ) //constructeur
{adr=new double[taille=n];
cout << "Const. Usuel -adr objet "<<this<<" -adr vecteur " <<adr<< "\n" ;}
vect(vect &v) //constructeur par recopie
{adr
adr=new
=new double[taille=v.taille
double[taille=v.taille];
];
for(int
for( int i=0; i<taille;i
i<taille;i++)
++) adr
adr[i]=v.adr[i]
[i]=v.adr[i]
cout << "Const
Const.. Par recopie -adr objet "<<
"<<this
this<<"
<<" -adr vecteur " <<
<<adr
adr<<
<< "\n ’’ ;}
~vect() {cout<< " Dest. -adr objet" <<this<<" -adr -vecteur <<adr<< "\n"; } ;
void main()
{ vect a(5); a 5
vect b=a;} *
5
b *
Mohamed
El Nabil
Abdellaoui SaïdSaidi 30
Spécificateur static
Mohamed
El Nabil
Abdellaoui SaïdSaidi 31