Salut,

Envoyé par
Ehonn
Et si cela a du sens, on peut mettre des valeurs par défaut à tous les paramètres d'un constructeur écrit, il servira de constructeur par défaut (attention aux conversions implicites possibles, utiliser le mot clé
explicit si besoin).
FAQ C++ - Qu'est-ce qu'un constructeur par défaut ?
Les termes importants étant si cela a du sens...
Généralement, les paramètres par défaut ont pour but de placer l'objet créé dans un état spécifique, mais ils ont l'"effet de bord" assez embêtant de permettre, faisons simple, autant de signature qu'il n'y a de paramètre par défaut. Je m'explique :
Soit un constructeur qui prendrait la forme de
MaClasse::MaClasse(Type1 t1=v1, Type2 t2=v2, Type3 t3=v3);
ce constructeur peut être appelé sous les formes de
- MaClasse
- MaClasse(param1);
- MaClasse(param1, param 2);
- MaClass(param1, param2, param3);
La question qu'il faut alors se poser est y a-t-il réellement du sens à permettre de créer l'objet en ne fournissant que le premier paramètre ou que les deux premiers paramètres
. La réponse est parfois oui, mais on se rend compte que c'est rarement le cas. Une classe Point3D, par exemple, sera un candidat idéal à la présence d'un constructeur par défaut qui générerait un point(0,0,0). Par contre, la réponse à la question que je viens de citer est, visiblement, non: il n'y a pas vraiment de sens de permettre la création d'un pPoint3D en ne fournissant que les coordonnées sur l'axe des X et sur l'axe des Y, sans fournir également la coordonnée sur l'axe des Z.
Ensuite, il faut prendre conscience qu'un constructeur par défaut n'aura réellement de sens que pour les classes ayant sémantique de valeur: les paramètres minimum indispensables à la création d'une instance de classe ayant sémantique d'entité étant les valeurs permettant de définir "l'identifiant unique" (la clé primaire, pour faire la comparaison avec une base de donnée ) propre à chaque instance.
En effet, les valeurs intervenant dans la définition de l'identifiant unique d'une instance de classe ayant sémantique d'entité ne peuvent pas être modifiées, sous peine de mettre à mal l'intégrité référentielle de ton application. Il n'y a donc aucun sens à proposer un mutateur sur la donnée en question (déjà que je suis très critique par rapport aux mutateurs / setters, leur présence dans le cas présent s'avère être une totale aberration
)
Partager