Constructeur
Fermé
MonCplusplus
Messages postés
21
Date d'inscription
lundi 23 avril 2018
Statut
Membre
Dernière intervention
9 mars 2019
-
27 déc. 2018 à 05:14
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 - 31 déc. 2018 à 04:09
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 - 31 déc. 2018 à 04:09
1 réponse
Dalfab
Messages postés
706
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
2 novembre 2023
101
Modifié le 27 déc. 2018 à 07:59
Modifié le 27 déc. 2018 à 07:59
Bonjour,
Sur des variables de type simple, l'intérêt est mineur voire nul.
Pour ce qui est de vérifier la validité, on peut le faire après. S'il y a un problème seule chose à faire c'est déclencher une exception et l'objet ne sera pas créé.
Sur des types complexe, l'intérêt se voit plus :
Si maintenant, on suppose qu'un des champs n'est pas constructible par défaut. La liste d'initialisation est alors le seul moyen de créer ce champ, elle devient incontournable
Sur des variables de type simple, l'intérêt est mineur voire nul.
Pour ce qui est de vérifier la validité, on peut le faire après. S'il y a un problème seule chose à faire c'est déclencher une exception et l'objet ne sera pas créé.
Sur des types complexe, l'intérêt se voit plus :
Armoire( std::string nm ) : nom(nm) {} Armoire( std::string nm ) { nom = nm; // finalement la chaîne vaut nm }Dans le second cas, l'objet nom est créé comme étant une chaîne vide, puis on modifie la chaîne. Le premier qui crée une chaîne initialisée est plus optimal surtout si le type du champ à construire nécessite un code important.
Si maintenant, on suppose qu'un des champs n'est pas constructible par défaut. La liste d'initialisation est alors le seul moyen de créer ce champ, elle devient incontournable
30 déc. 2018 à 07:07
Mais on est d'accord que même en supposant des valeurs incorrectes la liste d'initialisation est inutile , on aurait très bien pu sans passer ? Sachant que dans tout les cas on vérifiera les valeurs des attributs. Pour ce qui est des types complexe(objets) l'issu est assez similaire non ?
Certes , une il y'a différence considérable et non négligeable en ayant recours a la liste d'initialisation mais ce que je veux dire c'est que sa ne garanti pas toujours une intégrité sur les valeurs saisies. Désolé si je suis borné mais sa m’intéresse vraiment de pouvoir peser le pour et le contre concernant certaines subtilité en programmation. Merci d'avance !
31 déc. 2018 à 04:09
On est d'accord, dans le cas de variables simple on peut se passer de la liste d'initialisation.
Pour les types complexes, non on ne peut pas s'en passer pour les 2 raisons que j'ai déjà indiqué.
Et ton 2nd exemple, on a les deux possibilités :
En reprenant le code du constructeur sans liste d'initialisation, on aura 3 étapes :
- création de l'objet avec le constructeur par défaut d'une chaîne qui crée une chaîne vide (appel de )
- stopper la création si la création n'a pas de sens
- mise à jour de la chaîne en lui affectant une chaîne vide (appel de avec )
Avec la liste d'initialisation, il n'y a que deux étapes :
- création de l'objet avec le constructeur avec )
- stopper la création si la création n'a pas de sens.
Mais supposer que cela se passe comme ton premier exemple où il y a des prises de décisions en amont et en interne au constructeur, c'est cela ne serait ni sain ni optimum sans liste d'initialisation.