Vous êtes sur la page 1sur 6

BTS INTIC errachidia

Page 1/6

07/11/2010

Construction, destruction et initialisation des objets


1-dure de vie Les objets automatiques sont ceux crs par une dclaration dans une fonction ou dans un bloc qui sont dtruits juste a la sortie de la fonction ou du bloc tandis que les objets statiques sont ceux crs par une dclaration en dehors de toute fonction c'est dire avant main() ; ou dans une fonction mais qualifi de statique par le mot static ceci est valable pour les variable ordinaires que pour les objets 2- Appel des constructeurs et des destructeurs Le constructeur est appel aprs la cration de l'objet, Le destructeur est appel avant la destruction de l'objet.
#include <iostream> using namespace std ; class point { int x, y ; public : point (int abs, int ord) // constructeur ("inline") { x = abs ; y = ord ; cout << "++ Construction d'un point : " << x << " " << y << "\n" ; } ~point () // destructeur ("inline") { cout << "-- Destruction du point : " << x << " " << y << "\n" ; } } ; point a(1,1) ; // un objet statique de classe point main() { cout << "****** Debut main *****\n" ; point b(10,10) ; // un objet automatique de classe point int i ; for (i=1 ; i<=3 ; i++) { cout << "** Boucle tour numero " << i << "\n" ; point b(i,2*i) ; // objets crs dans un bloc } cout << "****** Fin main ******\n" ;

I - Les objets automatiques et statiques

system("pause"); } //faites un autre test sous c++ pour dos puis Alt. +F5

P.O.O

M43

M. Semghouni

BTS INTIC errachidia

Page 2/6

07/11/2010

II - Les objets dynamiques

1-cration Les objets dynamiques sont ceux crs l'aide de l'oprateur new, qui permet d'allouer l'espace mmoire pour cet objet qui pourra tre libr par delete. L'accs un attribut de cet objet ce fait l'aide de l'oprateur -> 2 - Exemple:
#include <iostream> using namespace std; class fraction { int a, b ; public : fraction (int num, int den) // constructeur { a=num ; b=den ; cout << "++ Appel Constructeur "<<a<<"/"<<b<<"\n" ; } ~fraction () // destructeur (en fait, inutile ici) { cout << "-- Appel Destructeur "<<a<<"/"<<b<<"\n" ; } } ; main() { void fct (fraction *) ; // prototype fonction fct fraction * adr ; cout << "** Debut main \n" ; adr = new fraction (2,3) ; // cration dynamique d'un objet fct (adr) ; cout << "** Fin main \n" ; system("pause"); } void fct (fraction * adf) { cout << "** Debut fct \n" ; delete adf ; // destruction de cet objet cout << "** Fin fct \n" ; }

fraction *adr1 = new fraction(1,2); excutez le programme remarquer suit que cet objet reste dans la mmoire mme aprs la fin de l'excution 1- tout objet cr dynamiquement, c'est dire tout espace mmoire allou, par new doit tre libr par delete 2- L'accs a un attribut d'un objet cre dynamiquement ce fait a l'aide de l'oprateur -> exemple adr->a ou adr->affiche() si affiche() est une mthode de fraction comme on peut aussi crire (*adr).affiche(); ou pour a (*adr).a

- dclarez dans la fonction fct() de l'exemple prcdent un objet comme

P.O.O

M43

M. Semghouni

BTS INTIC errachidia

Page 3/6

07/11/2010

III Le constructeur de recopie


1-Prsentation Supposons qu'on a un premier objet d'une classe et on veut crer un autre objet partir du premier dans l'une des situations suivantes : Soit une fonction qui reoit un paramtre de type classe de l'objet ou une fonction qui retourne un objet ou dans un autre cas c'est l'initialisation d'un objet partir d'un autre objet existant de mme type. Dans tout les cas on parle d'initialisation par recopie : une initialisation par recopie d'un objet est donc la cration d'un objet par recopie d'un objet existant de mme type. Dans ces cas il y a appel d'un constructeur particulier appel constructeur de recopie par dfaut qui se contente de copier membre par membre ce qui est insuffisant dans plusieurs cas savoir dans le cas o un membre est de type pointeur, dans ce cas il y a copie de l'adresse et non pas allocation de la mmoire pour le membre du second objet. Schmatisation

Constructeur de recopie par dfaut Constructeur de recopie appropri

Un constructeur de recopie est un constructeur qui reoit en paramtre une rfrence du type de la classe, pour une classe point il va avoir une des deux formes point(point &) ou point (const point &) aprs aucune recopie n'est faites de faon automatique c'est le constructeur de recopie qui s'en charge. Exemples Exemple 1 (sans la dfinition d'un constructeur de recopie)

P.O.O

M43

M. Semghouni

BTS INTIC errachidia

Page 4/6

07/11/2010

#include <iostream> using namespace std ; class vect { int nelem ; // nombre d'elements double * adr ; // pointeur sur ces elements public : vect (int n) // constructeur "usuel" { adr = new double [nelem = n] ; cout << "+ const. usuel - adr objet : " << this << " - adr vecteur : " << adr << "\n" ; } ~vect () // destructeur { cout << "- Destr. objet - adr objet : " << this << " - adr vecteur : " << adr << "\n" ; delete adr ; } } ; void fct (vect b) { cout << "*** appel de fct ***\n" ; } main() { vect a(5) ; fct (a) ; }

Voir Schmatisation Exemple 2 (avec la dfinition d'un constructeur de recopie)

P.O.O

M43

M. Semghouni

BTS INTIC errachidia


#include <iostream> using namespace std ; class vect { int nelem ; double * adr ;

Page 5/6

07/11/2010

// nombre d'lments // pointeur sur ces lments

public : vect (int n) // constructeur "usuel" { adr = new double [nelem = n] ; cout << "+ const. usuel - adr objet : " << this << " - adr vecteur : " << adr << "\n" ; } vect (const vect & v) // constructeur de recopie { adr = new double [nelem = v.nelem] ; // cration nouvel objet int i ; for (i=0 ; i<nelem ; i++) adr[i]=v.adr[i] ; // recopie de l'ancien cout << "+ const. recopie - adr objet : " << this << " - adr vecteur : " << adr << "\n" ; } ~vect () // destructeur { cout << "- Destr. objet - adr objet : " << this << " - adr vecteur : " << adr << "\n" ; delete adr ; } } ; void fct (vect b) { cout << "*** appel de fct ***\n" ; } main() { vect a(5) ; }

fct (a) ;

Remarquez l'existence de deux vecteurs ayant chacun une adresse diffrente. Commentaire: au moment de l'appel de la fonction fct(a) dans main() c'est le constructeur de recopie qui est excut donc il cre un nouveau vecteur ayant sa propore adresse et le nombre d'lments gal a celui de l'ancien (nelem =v.nelem) et il a recopi les valeurs de l'ancien dans le nouveau l'aide de la boucle int i ; for (i=0 ; i<nelem ; i++) adr[i]=v.adr[i] ; Exemple 3 (avec la dfinition d'un constructeur de recopie(2) objet en valeur de retour d'une fonction )
P.O.O M43 M. Semghouni

BTS INTIC errachidia

Page 6/6

07/11/2010

#include <iostream> using namespace std ; class point { int x, y ; public : point (int abs=0, int ord=0) // constructeur { x=abs ; y=ord ; cout << "++ Appel Const. usuel " << this << " " ; } point (const point & p) // constructeur { x=p.x ; y=p.y ; cout << "++ Appel Const. recopie " << this << " " ; } ~point () { cout << "-- Appel Destr. " << this << " " << x << } point symetrique () ; } ;

"usuel" << x << " " << y << "\n"

de recopie << x << " " << y << "\n"

" " << y << "\n" ;

point point::symetrique () { point res ; res.x = -x ; res.y = -y ; return res ; } main() { point a(1,3), b ; cout << "** avant appel de symetrique\n" ; b = a.symetrique () ; cout << "** apres appel de symetrique\n" ; } /* tester ce programme avec (TC (dos) ou BC4.5) et DevC++ !*/ /*En utilisant Debug dterminez quand est ce le constructeur de recopie est invoqu */

Initialisation d'un objet lors de sa dclaration

Soit

#include <iostream> using namespace std; class point { int x, y ; public : point (int abs=0, int ord=0) // constructeur { x=abs ; y=ord ; } void affiche() {cout<<"x= "<<x<<" "<<"y= "<<y<<endl;} }; main() { point a(3,1);//constructeur usuel point b=a; //constructeur de recopie point c(b); //constructeur de recopie point d=point(3,25+100);//constructeur ??? a verifier system("pause"); }

P.O.O

M43

M. Semghouni