Sie sind auf Seite 1von 4

BTS INTIC errachidia

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 (~).

Exemple de classe comportant un constructeur

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

Dclaration dune classe (point) munie d'un constructeur pas besoin de la

BTS INTIC errachidia

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 () ; }

Construction et destruction des objets


Mise en vidence des moments des appels du constructeur et de destructeur La classe test comprend un attribut entier num un constructeur avec un paramtre entier et un destructeur. Pour main on 'a une fonction appele fct qui reoit un paramtre p entier et dans cette fonction on cre un objet de type test avec le paramtre (2*p) pour le constructeur on rappel -que une variable dclare au sein d'une fonction et perdue une fois on sort de la fonction - ceci est valable aussi pour les instances
#include <iostream.h> class test { int num ; public : test (int) ; // dclaration constructeur ~test () ; // dclaration destructeur } ; test::test (int n) // dfinition constructeur { num = n ; cout << "++ Appel constructeur - num = " << num << "\n" ; } test::~test () // dfinition destructeur { cout << "-- Appel destructeur - num = " << num << "\n" ; } main() { void fct (int) ; test a(1) ; for (int i=1 ; i<=2 ; i++) fct(i) ; P.O.O M43 M.Semghouni

BTS INTIC errachidia

Page 3

18/10/2010

} void fct (int p) { test x(2*p) ; // notez l'expression (non constante) : 2*p }

Excution sous BC++4.5 donne

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 ?

Rles du constructeur et du destructeur


Un constructeur peut comporter un nombre quelconque darguments, ventuellement aucun. Par dfinition, un constructeur ne renvoie pas de valeur ; aucun type ne peut figurer devant son nom (dans ce cas prcis, la prsence de void est une erreur). Si le constructeur d'une classe est priv, il ne sera plus possible de crer des objets de cette classe Alors que un destructeur ne peut pas disposer darguments et ne renvoie pas de valeur. L encore, aucun type ne peut figurer devant son nom (et la prsence de void est une erreur). Exercice Soit la dclaration suivante class hasard
{ int nbval ; // nombre de valeurs int * val ; // pointeur sur les valeurs public : P.O.O M43 M.Semghouni

BTS INTIC errachidia

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

Das könnte Ihnen auch gefallen