Vous êtes sur la page 1sur 42

Prof: Abderrahmane Elyousfi

E.N.S.A Agadir Univ Ibn-Zohr


elyousfiabdo@yahoo.fr
ENSA 3 2017/2018
1
Construction,
destruction et initialisation des objets

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 2


Plan
1. Les objets automatiques et statiques.

2. Les objets dynamiques

3. Le constructeur de recopie

4. Initialisation d’un objet lors de sa déclaration

5. Objets membres

6. Initialisation de membres dans l’en-tête d’un constructeur

7. Les objets temporaires

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 3


Introduction

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 4


En C++, une variable peut être créée de deux façons :

 par une déclaration : elle est alors de classe automatique ou


statique ; sa durée de vie est parfaitement définie par la
nature et l’emplacement de sa déclaration ;

 en utilisant les opérateurs new et delete ; elle est alors dite


dynamique ; sa durée de vie est contrôlée par le programme.

Ces trois « classes d’allocation » (statique, automatique, dynamique)


vont naturellement s’appliquer aux objets.

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 5


Les objets automatiques et
statiques

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 6


Durée de vie
Les objets automatiques sont ceux créés par une déclaration :
Dans une fonction :
L’objet est créé lors de la rencontre de sa déclaration.
Il est détruit à la fin de l’exécution de la fonction.

Dans un bloc :
 l’objet est aussi créé lors de la rencontre de sa
déclaration;
 il est détruit lors de la sortie du bloc.

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 7


Durée de vie
Les objets statiques sont ceux créés par une déclaration située :

 En dehors de toute fonction ;

 Dans une fonction, mais assortie du


qualificatif static.
static

Les objets statiques sont créés avant le début de


l’exécution de la fonction main et détruits
après la fin de son exécution.

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 8


Appel des constructeurs et des destructeurs

Si un objet possède un constructeur, sa déclaration doit


obligatoirement comporter les arguments correspondants.

si une classe point comporte le constructeur de prototype :

Les déclarations suivantes seront:

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 9


Appel des constructeurs et des destructeurs
Si un objet possède un constructeur, sa déclaration doit
obligatoirement comporter les arguments correspondants.

si une classe point comporte les constructeurs suivants :

Les déclarations suivantes seront:

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 10


Appel des constructeurs et des destructeurs

En ce qui concerne la chronologie, on peut dire que :

le constructeur est appelé après la création de l’objet ;

le destructeur est appelé avant la destruction de l’objet.

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 11


Abderrahmane ELYOUSFI ENSA3 (GII) C++ 12
Abderrahmane ELYOUSFI ENSA3 (GII) C++ 13
Les objets dynamiques

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 14


Cas d’une classe sans constructeur

Nous pourrons créer dynamiquement un emplacement de type point et


affecter son adresse à une variable de type pointeur adr par :

point * adr = new point;

L’accès aux membres de l’objet pointé par adr se fera par:


adr -> initialise (1, 3) ;
adr -> affiche ( ) ;

ou, éventuellement, sans utiliser l’opérateur ->, par :


(* adr).initialise (1, 3) ;
(* adr).affiche ( ) ;

La suppression de l’objet se fera par:


delete adr ;
Abderrahmane ELYOUSFI ENSA3 (GII) C++ 15
Cas d’une classe avec constructeur

C++ fait du constructeur (dès lors qu’il existe) un passage obligé


lors de la création d’un objet.

Après l’allocation dynamique de l’emplacement mémoire requis,


l’opérateur new appellera un constructeur de l’objet.

Pour que new puisse appeler un constructeur disposant d’arguments,


il est nécessaire qu’il dispose des informations correspondantes.

Avant la libération de l’emplacement mémoire correspondant,


l’opérateur delete appellera le destructeur.

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 16


Abderrahmane ELYOUSFI ENSA3 (GII) C++ 17
Le constructeur de recopie

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 18


Présentation
Nous avons vu comment C++ garantissait l’appel d’un constructeur
pour un objet créé par une déclaration ou par new.
new

Mais il existe des situations dans lesquelles il est nécessaire de


construire un objet, même si le programmeur n’a pas prévu de
constructeur pour cela.

 Le cas de la valeur d’un objet transmise en argument à une


fonction.

 le cas d’un objet renvoyé par valeur comme résultat d’une


fonction

 le cas où un objet est initialisé, lors de sa déclaration, avec


un autre objet de même type.

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 19


Constructeur de recopie: Présentation

Le cas de la valeur d’un objet transmise en argument à une fonction.


fonction.

Dans ce cas, il est nécessaire de créer, dans un


emplacement local à la fonction, un objet qui soit
une copie de l’argument effectif.

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 20


Exemple 1 : objet transmis par valeur
Emploi du constructeur de recopie par défaut

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 21


Constructeur de recopie: Présentation

le cas d’un objet renvoyé par valeur comme résultat d’une fonction

Dans ce cas, il faut alors créer, dans un


emplacement local à la fonction appelante, un objet
qui soit une copie du résultat.

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 22


Exemple 2 : objet valeur de retour
Emploi du constructeur de recopie par défaut

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 23


Constructeur de recopie: Présentation

Le cas où un objet est initialisé, lors de sa déclaration,


avec un autre objet de même type.
type.

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 24


Exemple 3 : affectation d’objet
Pas de constructeur de recopie par défaut

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 25


Constructeur de recopie: Présentation
 Le cas de la valeur d’un objet transmise en argument à une
fonction.
fonction.

Dans ce cas, il est nécessaire de créer, dans un emplacement local à


la fonction, un objet qui soit une copie de l’argument effectif.

 le cas d’un objet renvoyé par valeur comme résultat d’une


fonction
Dans ce cas, il faut alors créer, dans un emplacement local à la
fonction appelante, un objet qui soit une copie du résultat.

 le cas où un objet est initialisé, lors de sa déclaration, avec


un autre objet de même type.
type.

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 26


Constructeur de recopie: Présentation
 D’une manière générale, on regroupe ces trois situations sous le
nom d’initialisation par recopie.

 Une initialisation par recopie d’un objet est donc la création


d’un objet par recopie d’un objet existant, de même type.

 Pour réaliser une telle initialisation, C++ a prévu d’utiliser un


constructeur particulier dit constructeur de recopie.
recopie

 Si un tel constructeur n’existe pas, un traitement par défaut est


prévu; on peut dire, de façon équivalente, qu’on utilise un
constructeur de recopie par défaut.
défaut

 Dans toute situation d’initialisation par recopie il y toujours


appel d’un constructeur de recopie.

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 27


Il n’existe pas de constructeur approprié

Il y’a alors appel d’un constructeur de recopie par défaut,


généré automatiquement par le compilateur.

Ce constructeur se contente d’effectuer une copie de chacun des


membres.

Elle posera donc les problèmes pour les objets contenant des
pointeurs sur des emplacements dynamiques.

seules les valeurs des pointeurs seront recopiées, les emplacements


pointés ne le seront pas ; ils risquent alors, par exemple, d’être
détruits deux fois.

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 28


Exemple 1 : objet transmis par valeur
Emploi du constructeur de recopie par défaut

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 29


Exemple 1 : objet transmis par valeur
Emploi du constructeur de recopie par défaut

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 30


Exemple 1 : objet transmis par valeur
Emploi du constructeur de recopie par défaut

L’appel de fct (a) ; a créé un nouvel objet, dans lequel on a recopié les
valeurs des membres nelem et adr de a.
La situation peut être schématisée ainsi (b est le nouvel objet ainsi créé) :

 À la fin de l’exécution de la fonction fct,


fct le destructeur ~point
est appelé pour b, ce qui libère l’emplacement pointé par adr ;

 à la fin de l’exécution de la fonction main, le destructeur est


appelé pour a, ce qui libère... le même emplacement.

 Cette tentative constitue une erreur d’exécution dont les


conséquences varient avec l’implémentation.

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 31


Exemple 1 : objet transmis par valeur
Définition d’un constructeur de recopie

Pour éviter le précédent problème il faut que l’appel de fct (a) ;


conduise à :
créer un nouvel objet de type vect,
vect avec ses membres données nelem et adr,
adr
mais aussi son propre emplacement de stockage des valeurs du tableau.

Pour ce faire, nous définissons, un constructeur


par recopie de la forme :

dont nous savons qu’il sera appelé dans toute


situation d’initialisation donc, en particulier,
lors de l’appel de fct.
fct

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 32


Il existe un constructeur approprié

Vous pouvez fournir explicitement dans votre classe un


constructeur de recopie.
recopie

Il doit alors s’agir d’un constructeur public disposant d’un


seul argument du type de la classe et transmis obligatoirement
par référence.

Exemple:

On notera que si ce constructeur de recopie est privé, il n’est


appelable que par des fonctions membres de la classe.

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 33


Remarques:

Notez bien que C++ impose au constructeur par recopie que son
unique argument soit transmis par référence (sinon l’appel du
constructeur de recopie impliquerait une initialisation par
recopie de l’argument).

Il doit alors s’agir d’un constructeur disposant d’un seul


argument du type de la classe et transmis obligatoirement par
référence.

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 34


Exemple 1 : objet transmis par valeur
Définition d’un constructeur de recopie

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 35


Exemple 1 : objet transmis par valeur
Définition d’un constructeur de recopie

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 36


Exemple 2 : objet en valeur de retour d’une fonction

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 37


Exemple 2 : objet en valeur de retour d’une fonction

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 38


Initialisation
d’un objet lors de sa déclaration

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 39


Exemple 1 : objet transmis par valeur
Définition d’un constructeur de recopie
Nous savons qu’il est possible d’initialiser une variable, un tableau ou une
structure, en fournissant un « initialiseur » lors de la déclaration, comme dans :

En théorie, ces possibilités s’appliquent aux objets : mais dans ce cas il faut
fournir les valeurs sous forme des arguments pour un constructeur.

De plus, C++ n’impose aucune restriction sur le type de l’initialiseur qui pourra

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 40


Exemple 1 : objet transmis par valeur

point a(3) ; équivalent à point a = 3 ;

Dans ce cas, c’est l’appel du constructeur à un seul argument.

point a;
point b=a ; équivalent à point b(a) ;

Ces deux déclarations (point b=a et point b(a)) entraînent


effectivement la création d’un objet de type point, suivie de
l’appel du constructeur par recopie

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 41


Fin

Abderrahmane ELYOUSFI ENSA3 (GII) C++ 42

Vous aimerez peut-être aussi