Constructeurs par défaut

Une classe peut avoir ou non un constructeur par défaut. Il s’agit d’un constructeur sans aucun paramètre. Dans notre exemple de la section précédente, c’est celui que nous avons numéroté 1.

S’il n’y a aucun constructeur défini dans la classe, C++ en crée un automatiquement qui est un constructeur par défaut, et qui ne fait rien. De ce fait, une classe a toujours un constructeur, mais n’a pas forcément un constructeur par défaut ; en effet, si l’on définit un constructeur avec paramètre seul, C++ ne fournit pas le constructeur par défaut automatique, et de ce fait il n’y en a pas.

Lorsqu’un constructeur par défaut existe, on peut déclarer une instance de classe sans préciser de paramètres :

exemple ex2;       // plus pratique que ex2()

Il n’en est pas de même si aucun constructeur par défaut n’existe. Par exemple cette autre classe :

class autre {     double d;     public:     autre(double dd) { d = dd; }     };

n’a pas de constructeur par défaut, aussi l’écriture :

autre a;

provoque une erreur de compilation Error : Could not find a match for 'autre::autre()', impossible de trouver une occurrence de 'autre::autre()'. Ce mécanisme est très utile, comme on le verra sur notre exemple de la liste chaînée ci-après.

Lorsqu’on veut créer un tableau d’instances de la classe sans donner de valeurs initiales, un constructeur par défaut doit exister ; il est alors appelé pour tous les éléments du vecteur :

exemple table[10];    // ok, 10 appels du constructeur 1autre tab[3];        // NON, pas de constructeur par défaut

Précisons un point très important au sujet de la présence d’un constructeur par défaut : bien que les constructeurs puissent avoir des arguments par défaut comme toute autre fonction, un constructeur dont tous les arguments possèdent une valeur par défaut n’est pas un constructeur par défaut. Ainsi, si l’on modifie la classe autre comme ceci :

class autre {     double d;     public:     autre(double dd = 0) { d = dd; }     };

alors l’initialisation suivante est acceptée :

autre a;   // ok, appel de autre::autre(0)

mais le tableau est toujours refusé :

autre tab[3];       // NON, pas de constructeur par défaut
Précédent Précédent Sommaire Sommaire Suivant Suivant