Construction, destruction et initialisation des objets
Dans tous les cas (objets statiques, automatiques ou dynamiques), s’il y a appel du constructeur, celui-ci a lieu après l’allocation de l’emplacement mémoire destiné à l’objet. De même, s’il existe un destructeur, ce dernier est appelé avant la libération de l’espace mémoire associé à l’objet.Les objets automatiques sont créés par une déclaration soit dans une fonction, soit au sein d’un bloc. Ils sont créés au moment de l’exécution de la déclaration (laquelle, en C++, peut apparaître n’importe où dans un programme). Ils sont détruits lorsqu’on sort de la fonction ou du bloc. Les objets statiques sont créés par une déclaration située en dehors de toute fonction ou par une déclaration précédée du mot-clé static (dans une fonction ou dans un bloc). Ils sont créés avant l’entrée dans la fonction main et détruits après la fin de son exécution.
Les objets temporaires
L’appel explicite, au sein d’une expression, du constructeur d’un objet provoque la création d’un objet temporaire (on n’a pas accès à son adresse) qui pourra être automatiquement détruit dès qu’il ne sera plus utile. Par exemple, si une classe point possède le constructeur point (float, float) et si a est de type point, nous pouvons écrire :Cette instruction provoque la création d’un objet temporaire de type point (avec appel du constructeur concerné), suivie de l’affectation de cet objet à a.L’accès aux membres d’un objet dynamique est réalisé comme pour les variables ordinaires. Par exemple, si point possède une méthode nommée affiche, on pourra l’appeler par (*adp).affiche () ou encore par adp->affiche (). Les objets dynamiques n’ont pas de durée de vie définie a priori. Ils sont détruits à la demande en utilisant l’opérateur delete comme dans : delete adr. (Dans le cas d’un tableau d’objets, la syntaxe sera différente, voir un peu plus loin.)
Construction d’objets contenant des objets membre
on précise que le constructeur du membre p recevra en argument les valeurs abs et ord. Si l’en-tête de pointcol ne mentionnait rien concernant p, il faudrait alors que le type point possède un constructeur sans argument pour que cela soit correct.Le deuxième cas correspond à l’initialisation d’un objet à l’aide d’un autre objet de même type, qu’on nomme parfois « initialisation par recopie ». L’opération est réalisée par appel de ce que l’on nomme un « constructeur par recopie ».soit un constructeur de la forme type (type &) ou type (const type &) s’il en existe un ; ce dernier doit alors prendre en charge la recopie de tous les membres de l’objet, y compris ceux qui sont des objets ; il peut cependant s’appuyer sur les possibilités de transmission d’information entre constructeurs, présentée auparavant ;La transmission par référence est obligatoire ici. D’autre part, le fait d’utiliser l’attribut const permet d’appliquer le constructeur à un objet constant ou à une expression ; rappelons que, dans ce cas, il y création d’un objet temporaire dont on transmet la référence au constructeur.soit, dans le cas contraire, ce que l’on nomme un « constructeur de recopie par défaut », qui recopie les différents membres de l’objet. Si certains de ces membres sont eux-mêmes des objets, la recopie sera réalisée par appel de son propre constructeur par recopie (qui pourra être soit un constructeur par défaut, soit un constructeur défini dans la classe correspondante).
Les tableaux d’objets
Si point est un type objet possédant un constructeur sans argument (ou, situation généralement déconseillée, sans constructeur), la déclaration : point courbe [20] ; crée un tableau courbe de 20 objets de type point en appelant, le cas échéant, le constructeur pour chacun d’entre eux. Notez toutefois que courbe n’est pas lui-même un objet.En théorie, on peut compléter la déclaration d’un tableau d’objets par un initialiseur contenant une liste de valeurs (elles peuvent éventuellement être de types différents). Chaque valeur est alors transmise à un constructeur approprié. Ces valeurs doivent être constantes pour les tableaux de classe statique ; il peut s’agir d’expressions pour les tableaux de classe automatique. On peut ne pas préciser de valeurs pour les derniers éléments du tableau. On notera qu’un tel initialiseur ne peut pas être utilisé avec des tableaux dynamiques (il en va de même pour les tableaux ordinaires !).