Next: Les destructeurs Up: Les constructeurs et Previous: Les constructeurs et

Les constructeurs

Un constructeur doit porter le même nom que la classe à laquelle il appartient. La déclaration et la définition ne précisent pas le type du constructeur : il est implicite dans le nom de celui-ci.


#include <iostream.h>
class exemple {
int i  ;
double d ;
public:
  exemple(void) ;
  exemple(const int,const double) ;
} ;
exemple::exemple(void) {
  cout << "premier constructeur" << endl ;
  i=0 ;
  d=0.0 ;
}
exemple::exemple(const int vi, const double vd=0) {
  cout << "deuxieme constructeur" << endl ;
  i=vi ; d=vd ;
}
int main(void) {
  exemple e1 , e2(3,0.0) , *e3 ;
  e3 = new exemple(2) ;    // a decortiquer
  return 0 ;
}
Le rôle des constructeurs servent 90 pour cent du temps à initialiser les membres de la classe c'est pourquoi, une autre syntaxe existe uniquement pour ce type de fonction.

exemple::exemple(const int vi, const double vd=0) : i(vi), d(vd)
{
}
Entre la spécification et le corps de la fonction, se trouve une liste de données précédé par ':' : c'est la liste d'initialisations. Les éléments de cette liste sont des appels à des constructeurs afin d'initialiser les membres individuels du type. Leur résultat est que le membre i d'une variable de la classe exemple reçoit la valeur vi à l'aide du constructeur des int. Comme les membres de la classe exemple sont tous des types élémentaires. Ces constructeurs n'existent pas réellement; le compilateur exécute directement les initialisations. Mais si les membres étaient d'un autre type spécifique, les constructeurs associés seraient appelés. Les fonctions dites constructeur-copieur sont générées automatiquement par le compilateur. Il faut cependant les écrire dans le cas d'allocation dynamique de données membres.

  exemple e4 = e3 ; // ca marche car
  // la fonction suivante est generee :
  // exemple::exemple(const exemple &)

@
vendredi, 7 novembre 1997, 14:51:48 MET