bonsoir,
j'ai lu dans un cours que si j'ai un constructeur avec arguments dans ma classe je suis oubligé d'avoir un constructeur par défaut sinon le constructeur par défaut n'est pas forcément obligatoire .
pourquoi cette obligation ?
Version imprimable
bonsoir,
j'ai lu dans un cours que si j'ai un constructeur avec arguments dans ma classe je suis oubligé d'avoir un constructeur par défaut sinon le constructeur par défaut n'est pas forcément obligatoire .
pourquoi cette obligation ?
En fait ce qui se passe c'est que si aucun constructeur n'est déclaré, un constructeur par défaut est implicitement défini, et il initialise toutes les variables membre.
Si n'importe quel constructeur est déclaré, aucun constructeur n'est implicitement ajouté par le compilateur.
Un constructeur par défaut n'est pas forcément obligatoire.
Mais il est quelque fois requis par certaines classes.
Dans ce cas, la documentation de la classe en question doit clairement l'exposer.
Ce code ne devrait pas compiler, B ne peut pas construire A car ce dernier n'a pas de constructeur par défaut.Code:
1
2
3
4
5
6
7
8
9
10
11
12 struct A { int m_i; A(int i) : m_i(i) {} }; //Doc de B : //T doit être default_constructible template<class T> struct B { T m_a; B() {} //Appel implicite à A(), qui n'existe pas. }; B<A> b;
Mauvaise compréhension ou mauvais formulation. Si une classe n'a aucun constructeur de déclaré explicitement, un constructeur par défaut est défini implicitement. Dés qu'elle a un constructeur, elle n'a plus de constructeur par défaut défini implicitement et il faut le faire explicitement si tu en veux un.
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 ?
Salut,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
ce constructeur peut être appelé sous les formes deCode:MaClasse::MaClasse(Type1 t1=v1, Type2 t2=v2, Type3 t3=v3);
- 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 :question:. 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 ;) )