Les constructeurs dune classe donnée classe
peuvent avoir nimporte quoi comme arguments, sauf des données de type classe
. Ils peuvent avoir des pointeurs *classe
comme arguments, ainsi que des références &classe
. Cependant, dans ce dernier cas, le constructeur ne doit avoir quun seul argument &classe
, et les autres arguments, sil y en a, doivent avoir une valeur par défaut. Ce constructeur est alors appelé constructeur de copie. Il sert lors daffectations du genre :
class classexmpl { // champs ... public : classexmpl(); // constructeur par défaut classexmpl(int i); // un autre constructeur classexmpl(classexmpl& c); // constructeur de copie // méthodes... };classexmpl c1; // constructeur par défautclassexmpl c2 = c1; // appel du constructeur de copie // équivaut à classexmpl c2(c1);
Toute classe a nécessairement un constructeur de copie. Lorsquaucun nest défini explicitement, le compilateur en crée un automatiquement, qui se contente de recopier champ par champ largument dans this
. Ce constructeur suffit dans les cas simples. Nous donnons un peu plus loin des exemples où il ne suffit pas.
Noter ce point très important : le constructeur de copie nest appelé (comme tout constructeur) que lors dune initialisation. De ce fait, si lon écrit :
c2 = c1;
ce nest pas ce constructeur qui est appelé, mais lopérateur daffectation =
, qui par défaut recopie les champs un à un ; il faut également le redéfinir si nécessaire (voir chapitre 7). Cette remarque met en relief un fait essentiel qui est que lors des deux écritures :
exemple c2 = c1; // appel du constructeur de copiec2 = c1 // appel de l'opérateur d'affectation;
lopérateur daffectation nest appelé quune fois (la seconde), tandis que cest le constructeur de copie qui est appelé la première fois. Si ces deux appels nont pas été différenciés jusqualors, cest que par défaut ils provoquent le même effet ; il nen est pas nécessairement ainsi dans des classes définies par un programmeur.
Pour la même raison, il faut comprendre que, lors de lappel dune fonction f(exemple ex)
sous la forme f(e1)
, ce nest pas une affectation qui est réalisée, malgré les apparences, sur largument ex
, mais le constructeur de copie de nouveau ; ici aussi les effets peuvent être différents.
Précédent | Sommaire | Suivant |