Extrait du cours introduction à la conception objet et a c++
……
3.4 Les constructeurs
Il est souvent nécessaire d’initialiser les objets au moment de leur création. Dans le cas de la classe Article en particulier, on souhaite pouvoir attribuer un nom, un prix et une quantité à tout nouvel article créé. Dans d’autres cas, ce peut être pour initialiser certains attributs spéciaux (comme des compteurs), pour effectuer une allocation mémoire, etc. Une solution pourrait être de définir pour toutes ces classes une méthode init qui réaliserait les initialisations souhaitées. Mais cela est problématique: pour toute création d’un nouvel objet, deux actions vont être nécessaires (déclaration + appel de la méthode init) alors que la création d’un objet est a priori une action atomique. Et que faire si un client oublie d’appliquer la méthode init?
Pour résoudre ce problème, C++ possède un mécanisme d’initialisation automatique d’objets de classe.
Une ou plusieurs méthodes particulières, appelées constructeurs, sont appliquées implicitement dès qu’un objet est défini. Ces constructeurs, généralement publics, portant le même nom que la classe à laquelle ils appartiennent [PROG. 3.7, 3.8]. Quelques commentaires généraux et relatifs à l’exemple présenté :
– Les constructeurs n’ont aucun type de retour (même pas void) et ne sont jamais appelés explicitement par le programmeur. C’est le compilateur qui se charge de le faire à chaque création d’objet, après avoir choisit le constructeur à utiliser en fonction des paramètres d’initialisation fournis (principe de la surcharge). Voir [PROG. 3.9] pour des exemples relatifs à chacun des constructeurs définis.
– Le premier constructeur de la classe Article est un constructeur particulier, dit constructeur par défaut, qui est utilisé lorsqu’un objet est instancié sans paramètre.
L’action réalisée ici est d’initialiser le pointeur correspondant au nom de l’article à la valeur nulle pour indiquer que l’article est incomplet.
– Le second constructeur est également un constructeur particulier, dit constructeur de copie, utilisé lorsqu’un objet est créé à partir d’un autre objet de même type. On peut noter la syntaxe à utiliser pour spécifier à C++ que l’on souhaite définir un constructeur de copie: Type (const Type & un Objet); cette syntaxe est obligatoire pour définir ce type de constructeur. Remarques sur ce constructeur :
– les attributs de l’objet passé en paramètre sont recopiés dans les attributs de l’objet à créer, en prenant garde d’allouer un nouvel espace mémoire pour stocker le nom de l’article ;
– les attributs ne sont pas recopiés si l’objet passé en paramètre est incomplet. Le nouvel objet devient alors lui-même un objet incomplet ;
– on peut ici accéder directement aux attributs de l’objet passé en paramètre, sans avoir à utiliser les fonctions d’accès définies. Ceci n’est bien entendu possible que parce que l’objet à créer appartient à la même classe que l’objet passé en paramètre. Il n’est donc pas un« client ordinaire ».
– Le troisième constructeur se charge de l’initialisation d’un objet à partir de toutes les données nécessaires pour cela. Si la quantité est omise, elle prend alors la valeur 0 par défaut. Ici encore, on alloue un nouvel espace mémoire pour stocker le nom de l’article. Ce nom se trouve ainsi dans un espace propre à l’objet et ne peut donc pas être affecté par un événement extérieur, comme cela aurait pu être le cas si on avait simplement effectué une copie de pointeurs.
– Un constructeur marche en deux temps: il effectue tout d’abord l’initialisation des attributs de la classe en utilisant leur constructeur par défaut, et exécute seulement ensuite le corps du constructeur.
Il n’est cependant pas toujours souhaitable d’utiliser le constructeur par défaut des attributs d’une classe. Il faut dans ce cas placer l’appel aux constructeurs des attributs entre le prototype du constructeur de l’objet et son corps, en les séparant du symbole ’:’ [PROG. 3.10]. Plusieurs appels situés à ce niveau devront être séparés par des virgules.
…….
Introduction à la conception objet et a C++ les classes et l’héritage (292 KO) (Cours PDF)