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 &)