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