Introduction aux constructeurs et destructeurs

De RAD Studio
Aller à : navigation, rechercher

Remonter à Constructeurs et destructeurs - Index

Il existe plusieurs fonctions membres spéciales qui permettent de créer, initialiser, copier et détruire les objets d'une classe. Les constructeurs et les destructeurs sont les plus importantes. Ils possèdent la plupart des caractéristiques des fonctions membres classiques (ils sont déclarés et définis dans la classe, ou déclarés dans la classe et définis en dehors), mais aussi certaines particularités :

  • Ils n'ont pas de valeur renvoyée (pas même void).
  • Ils ne peuvent pas être hérités, bien qu'une classe dérivée puisse appeler le constructeur et le destructeur de la classe de base.
  • Le constructeur, comme la plupart des fonctions C++, peut avoir des arguments par défaut ou utiliser une liste de valeurs d'initialisation membre.
  • Les destructeurs peuvent être virtual mais pas les constructeurs. (Voir Destructeurs virtuels.)
  • Vous ne pouvez pas manipuler leurs adresses.
int main (void)
{
.
.
.
void *ptr = base::base;    // illégal
.
.
.
}
  • Les constructeurs et destructeurs peuvent être générés automatiquement par le compilateur s'ils n'ont pas été définis par le programmeur. Ils sont aussi appelés en de nombreuses occasions sans que vous l'ayez demandé. Tout constructeur ou destructeur généré par le compilateur est à accès public.
  • Vous ne pouvez appeler un constructeur comme vous appelez une fonction standard. Vous pouvez appeler un destructeur si vous donnez son nom qualifié complet.
{
.
.
.
X *p;
.
.
.
p–>X::~X();                // appel du destructeur légal
X::X();                    // appel du destructeur illégal
.
.
.
}
  • Le compilateur appelle automatiquement les constructeurs et les destructeurs lors de la définition et de la suppression des objets.
  • Les constructeurs et destructeurs peuvent effectuer des appels implicites à l'opérateur new et à l'opérateur delete si une allocation d'espace mémoire est requise pour un objet.
  • Un objet muni d'un constructeur ou d'un destructeur ne peut pas être utilisé en tant que membre d'une union.
  • Si aucun constructeur n'a été défini dans une classe X pour accepter un type donné, aucune tentative ne sera faite pour trouver un autre constructeur ou une autre fonction qui convertisse la valeur affectée en un type acceptable pour un constructeur de la classe X. Notez que cette règle ne s'applique qu'aux constructeurs à un paramètre et sans valeur d'initialisation qui utilise la syntaxe “=”.
class X { /* ... */ X(int); };
class Y { /* ... */ Y(X); };
Y a = 1;                   // illégal: Y(X(1)) pas tenté

Si une class X possède un ou plusieurs constructeurs, l'un d'entre eux est appelé à chaque création d'une instance x de la class X. Le constructeur crée l'objet x et l'initialise. Le destructeur inverse le processus en détruisant les objets classes créés par le constructeur.

Les constructeurs sont également appelés lorsque des objets locaux ou temporaires sont créés dans une classe ; les destructeurs sont appelés lorsque ces objets sortent de la portée.

Voir aussi