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 ?
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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;
Je fais appel aux esprits de Ritchie, Kernighan, Stroustrup et Alexandrescu
Donnez moi la force, donnez moi le courage de coder proprement !
« Ça marche pas » n'est PAS une réponse convenable, merci de détailler le souci en fournissant l’environnement, le code source, les commandes et les messages d'erreur.
Ce club possède également un clavardage, on y trouve quelques perles entre deux sessions d'entraides.
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.
Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.
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 de
Code : Sélectionner tout - Visualiser dans une fenêtre à part 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 . 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 )
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager