Académique Documents
Professionnel Documents
Culture Documents
Afilal
Les classes
Une classe est une description dune famille dobjets, qui ont Mmes attributs
Mme mthodes Une classe est: une moule dun ensemble dobjets qui partagent une structure commune (les attributs) et un comportement commun (les mthodes). Une classe correspond aussi a un type de donne comme int, double, elle correspond au type des objets qui lui sont lis.
Spcification
M.Afilal
Classe CompteBancaire ..
Nom de la classe CompteBancaire
Attributs
Oprations
- solde # numCompte
+ deposer() + retirer()
private
protected
public
Une classe est structure en 3 partie (les modes daccs): La partie publique: contient les dclarations visibles tout utilisateur de cette classe. La partie protge: contient les dclarations visibles uniquement par les classes hritant de la classe de base. La partie prive: contient les dclarations invisibles toute autre classe M.Afilal diffrente de la classe de base.
CompteBancaire instanciation
classe
compte001 : CompteBancaire
Instance ou objet
Les classes
Une classe (mot cl class) est une structure particulire, pour laquelle on prcise si les membres (champs) et les fonctions membres sont publics, privs ou protgs (mots cls public, private ou protected): Cest le mcanisme de protection ou encapsulation des donnes Dans les structures, en gnral, tous les membres ou champs sont publics par dfaut mais private pour les classes. Daprs le principe dencapsulation: on ne peut accder aux donnes prives que par lintermdiaire des mthodes publics (en gnrale). On considrera donc, en gnral, les champs comme membres prives et les mthodes comme membres publics. une classes , comme les structures, est utilise aussi comme un type de donne, comme int, char...
M.Afilal
Les constructeurs
Les constructeurs se sont des fonctions membres spciales appeles la cration d'un objet d'une classe Ce sont des fonctions dont le nom est celui de la classe Qui ne retournent rien mme pas un void Qui peuvent contenir ou pas des arguments Qui permettent dinitialiser les champs de la classe Attention aux pointeurs, aux tableaux et tout objet qui doit sallouer dynamiquement de la mmoire, il faut toujours les initialiser dans les constructeurs car sinon cas des pointeur : pas dinitialisation dun pointeur, le pointeur pointera vers une adresse au hasard, comme une zone de code quelconque, ce qui serait dramatique pour lapplication. le constructeur par dfaut (constructeur sans arguments) est appel automatiquement la cration d'un objet (si pas de constructeur avec arguments)
M.Afilal
Tableau dobjets
Proprit: Dans le cas dun tableau dobjet, le constructeur par dfaut est appel la cration de chaque lment du tableau. Point tab[3]; void main(){ Point *tabPoint = new Point[3]; for(int i = 0; i < 3; i++){ tabPoint[i].X =4 + i; // pb si X et Y sont private tabPoint[i].Y =8 * i; } cout << " coordonnes du point la deuxime position: << tabPoint[1].X << " << tabPoint[1].Y <<endl; delete[] tabPoint;
M.Afilal
Le destructeur
Un destructeur est une fonction membre qui est automatiquement appele au moment de la destruction dun objet, avant la libration de lespace mmoire associe lobjet. La destruction des objets se fait de manire identique aux variables ordinaires : la fin du programme pour les objets statiques, laide de linstruction delete ou la fin du bloc ou de la fonction pour les objets dynamiques. La libration de la mmoire allouer dynamiquement tant confi dans ce cas au destructeur. le destructeur est indispensable ds quun objet ou champs est amen allouer dynamiquement de la mmoire. Par convention: le destructeur porte le mme nom que sa classe, prcd du symbole du tilde (~). Par dfinition il ne comporte aucun argument ne renvoi pas de valeur (mme pas un void). Exemple : ~Point() ;// destructeur de la classe Point
M.Afilal
Les classes
class Point{ private: int x; int y; public: Point(); ~Point(); }; Point::Point(){x = 0;y = 0;} Point::~Point(){} int main(int argc, char* argv[]){ Point p3; return 0; }
M.Afilal
M.Afilal
M.Afilal
Les classes
class Point{ private: int x; int y; public: Point(); Point(int, int); ~Point(); Point somme (Point*); Point somme (Point&); void affiche(); };
M.Afilal
Les classes
Point::Point(){ x = 0;y = 0; }
Les classes
int } main(int argc, char* argv[]){ Point p1(2,2); Point p2(5,3); Point p3; p1.affiche(); p3.affiche(); (p2.somme(&p1)).affiche(); (p2.somme(p3)).affiche(); return 0;
M.Afilal
M.Afilal
M.Afilal
Objet : t1
nbelem
FFF2
adr
0D98
Objet : t2
FFEE
nbelem adr
M.Afilal
M.Afilal
Objet : t1
0D98
nbelem FFF2 adr
Objet : t2
nbelem FFEE
0DA6
adr
M.Afilal
M.Afilal
M.Afilal
Exemple
class Personne{ private: char *nom; double age; public: Personne(); Personne(char *, double) ; Personne(const Personne&) ; ~Personne(); void affiche() ; };
M.Afilal
Exemple
Personne::Personne(){ cout << "constructeur par dfaut: " << endl; nom = new char[256]; strcpy(nom, "Albertine") ; age = 99; } Personne::Personne(char *nomPers, double agePers){ cout << "constructeur avec argument: " << endl; nom = new char[strlen(nomPers)+1]; strcpy(nom, nomPers) ; age = agePers; } void Personne::affiche(){ cout << "nom de la personne est: " << nom << " " << "son age est: " << age << endl; } Personne::Personne(const Personne& pers){ cout << "constructeur de recopie: " << endl; nom = new char[strlen(pers.nom)+1]; strcpy(nom, pers.nom) ; age = pers.age; } Personne::~Personne(){ if(nom) delete[] nom; }
M.Afilal
Suite exemple
#include " Personne.h" class Etudiant{ public: Etudiant(char *, double) ; Etudiant(const Personne&) ; ~ Etudiant() ; private: Personne *p1 ; Personne p2 ; static Personne p3; // variable partag par tous les objets }; Question: Comment initialiser p1, p2 et p3 ? variable de classe: p3 Personne Etudiant :: p3(Albertine,20) ; // on ne rpte pas le mot cl static
M.Afilal
Suite exemple
variables dinstance P1 et P2: Etudiant :: Etudiant(char *nomPerso, double d ) : p1(new Personne(nomPerso, d)), p2(nomPerso, d){ // p1 est un pointeur, donc on utilise loprateur new // dans ce cas: y=(nomPerso, d); appel constructeur avec deux arguments // pas de new pour p2 car cest un objet } Etudiant:: Etudiant(const Personne& pers ) : p2(pers), p1(new Personne(pers)){ p2.affiche() ; p1->affiche() ; // dans ce cas: y = pers; appel du constructeur par recopie } Etudiant :: ~ Etudiant( ){ if(p1) delete p1 ; }
M.Afilal
M.Afilal
TD
class Personne{
};
char *nom; double age; public: Personne(); Personne(char *, double) ; Personne(const Personne&) ; virtual ~Personne(); void affiche() ; char* getNom(); double getAge(); void setNom(char*); void setAge(int); void affiche();
M.Afilal
TD
#include "Personne.h" class Etudiant { public: Etudiant(char *, double) ; Etudiant(const Personne& ); Etudiant(const Etudiant& );// A FAIRE virtual ~ Etudiant() ; void setP3(Personne&); void setP2(Personne&); void affiche(); private: Personne *p1 ; Personne p2 ; static Personne p3; };
M.Afilal
TD
cout<<" ---- teste de la classe Personne ----"<<endl; Personne pers1("ahmed",14); Personne*pers2 = new Personne("Nadine",99); pers1.affiche(); pers2->affiche(); cout<<" ---- teste mthode inline ----"<<endl; if(pers2) delete pers2; cout<<" ---- teste de la classe Etudiant ----"<<endl; Etudiant etud1("Atikosse", 55); Etudiant *etud2 = new Etudiant(pers1); Personne persStat("changeStatic", 66); etud1.setP3(persStat); etud2->affiche(); etud2->setP2(Personne("nomModif", 22)); cout<<" ---- teste constructeur par recopie ----"<<endl; Etudiant etud3(etud1), *etud4 = new Etudiant(*etud2); etud4->affiche(); if(etud4) delete etud4; if(etud2) delete etud2;
M.Afilal