Page 1
18/10/2010
Classes et objets
Complment Notions de constructeur et de destructeur
Le constructeur. Il s'agit d'une fonction membre (dfinie comme les autres fonctions membres) qui sera appele automatiquement chaque cration d'un objet. Un objet pourra aussi possder un destructeur, cest--dire une fonction membre appele automatiquement au moment de la destruction de l'objet. Dans le cas des objets automatiques, la destruction de l'objet a lieu lorsque l'on quitte le bloc ou la fonction o il a t dclar. Par convention, le constructeur se reconnat ce qu'il porte le mme nom que la classe. Quant au destructeur, il porte le mme nom que la classe, prcd dun tilde (~).
Considrons la classe point prcdente et transformons simplement notre fonction membre initialise en un constructeur en la renommant point (dans sa dclaration et dans sa dfinition). La dclaration de notre nouvelle classe point se prsente alors ainsi :
#include <iostream.h> class point { /* dclaration des membres privs */ int x ; int y ; public : /* dclaration des membres publics */ point (int, int) ; // constructeur void deplace (int, int) ; void affiche () ; } ;
mthode initialise() - la dclaration d'un objet de type point de la faon point a ;n'est plus valide En fait, partir du moment o un constructeur est dfini, il doit pouvoir tre appel (automatiquement) lors de la cration de l'objet a. Ici, notre constructeur a besoin de deux arguments. Ceux-ci doivent obligatoirement tre fournis dans notre dclaration, par exemple : point a(1,3) ; Cette contrainte est en fait un excellent garde-fou : partir du moment o une classe possde un constructeur, il n'est plus possible de crer un objet
P.O.O M43 M.Semghouni
Page 2
18/10/2010
sans fournir les arguments requis par son constructeur (sauf si ce dernier ne possde aucun argument !).
/* --- Dfinition des fonctions membre de la classe point -- */ point::point (int abs, int ord) { x = abs ; y = ord ; } void point::deplace (int dx, int dy) { x = x + dx ; y = y + dy ; } void point::affiche () { cout << "Je suis en " << x << " " << y << "\n" ; } /* -------- Utilisation de la classe point -------- */ main() { point a(5,2) ; a.affiche () ; a.deplace (-2, 4) ; a.affiche () ; point b(1,-1) ; b.affiche () ; }
Page 3
18/10/2010
} void fct (int p) { test x(2*p) ; // notez l'expression (non constante) : 2*p }
Explication : test a(1) donne ++Appel constructeur num = 1 Puis la fonction fct est appele par la valeur i=1 et un objet x est cre avec la valeur 2*i =2 d'o ++Appel constructeur num = 2 puis la sortie de fct pour que i prend la valeur 2 entrane la destruction de l'objet et appelle le destructeur qui affiche --Appel destructeur num = 2 quand i passe a 2 une la fonction fct cre un objet avec la valeur 4 comme paramtre ce qui entrane l'affichage ++Appel constructeur num = 4 est la sortie de la fonction entrane aussi --Appel destructeur num = 4 Expliquez pourquoi --Appel destructeur num = 1 est affich en dernier? Puis tester le programme sous TC pour DOS et Dev C++ que remarquez-vous ?
Page 4
18/10/2010
hasard (int) ; // constructeur ~hasard () ; // destructeur void affiche () ; } ; hasard::hasard (int nb)//nb nombre de valeur ds le tableau { // Crer ici un tableau dont l'adresse est val par new ... et //remplissez le par des entiers alatoires voir rand dans stdlib.h } hasard::~hasard () { //libre l'espace mmoire du tableau } void hasard::affiche () { //affiche le tableau } main() { //tester votre code . }
P.O.O
M43
M.Semghouni