Ces dernières semaines, je me suis retrouvé en utilisant beaucoup de Permettez-moi d'illustrer avec une fonction simple. P> J'écris: P> const code> partout. Non seulement dans les méthodes ou les déclarations d'arguments, mais même pour les variables temporaires.
// A dummy function that sums some computation results
unsigned int sum_results(const Operation& p1, const Operation& p2)
{
const unsigned int result1 = p1.computeResult();
const unsigned int result2 = p2.computeResult();
// Well this function could be in one single line but
// assume it does more complex operations
return result1 + result2;
}
7 Réponses :
Utiliser Les développeurs sont paresseux - ils pensent souvent que c'est un mot inutile qui ne change rien. Imo ils sont faux. P> const code> sur les variables locales améliore la clarté du code, c'est donc une bonne idée. Vous voyez
const code> et vous savez immédiatement que la variable n'est jamais modifiée plus tard dans la portée. Il s'agit de la même série que de faire des fonctions courtes et retourner tôt . P>
+1. Mettre la const sur les variables locales qui ne vont pas changer (ou ne devrait pas changer) capte des erreurs avant qu'elles ne se produisent (à l'heure de la compilation) et montre clairement votre intention du prochain programmeur qui doit examiner votre code.
Mais cela conduirait-il à une meilleure performance ou à une meilleure optimisation par le compilateur.
@DumbCoder: Peut-être, mais très improbable. Les compilateurs modernes sont très bons pour optimiser le code. Si l'on se soucie vraiment, ils devraient essayer les deux et inspecter le code de la machine émise.
@DumbCoder: extrêmement improbable, SLIG et GCC utilisent des représentations SSA et savent ainsi si une variable est jamais modifiée ou non. Cependant, cela indique l'intention envers le compilateur, de sorte que plus tard essayer d'y accéder provoque une erreur et oblige le développeur à penser s'il est approprié ou non.
C'est effectivement la même raison pour laquelle les assertions sont rarement utilisées. Edit: Juste au cas où il ne serait pas clair, votre approche est meilleure. P> const code> sur les interfaces est obligatoire,
const code> dans la mise en œuvre est volontaire. Les programmeurs sont paresseux. P>
Il n'y a rien mal em> avec cela, mais vous utilisez Const d'enraciner le compilateur pour vous aider à appliquer une contrainte, lorsque vous connaissez un objet ne devriez pas em> être modifié. Si vous ne entre vous em> si l'objet est modifié, il est superflu. P>
Même si cet exemple factice, ni résultat1 code> ou
résultat2 code> sont destinés à être modifiés. Ils tiennent une valeur qui ne devrait pas changer. Cela ne me dérange pas d'avoir plus de coups de frappe chaque fois que je peux rendre mon code moins sujet d'erreur.
"ni résultat1 ou résultat2 ne sont destinés à être modifiés. Ils tiennent une valeur qui ne devrait pas changer" alors ils devraient être constitués. Mon point n'est que que vous le faites pour une raison, et si vous êtes au courant de cette raison, vous ne vous sentirez pas comme si vous abusez.
en C ++, il s'agit d'une bonne approche pour constituer des variables de constituer si vous le pouvez. Mais cela a dit cela, cela a plus de sens dans les cas où une variable est transmise sous forme d'argument ou qu'elle est partagée entre différentes pièces de code (comme des variables de classe). L'idée principale est d'arrêter la modification accidentelle des variables par autre code qui ne sait pas que cette variable n'est pas censée être modifiée. P>
Par conséquent, à la lumière de ce qui précède, pour les variables locales à une fonction, les consensifiants est une sorte de surpuissance. Cependant, cela ne fait rien de mal. P>
Dans mon humble avis, vous devez profiter d'un compilateur de langue fortement tapée à chaque occasion. J'utilise le Constitue C ++ FAQ pourrait avoir plus d'informations utiles . p> const code> pour des variables locales temporaires, des références immuables, etc. p>
Je ne pense pas qu'il soit purement un cas de programmeurs paresseux - est aussi une concision considération. Certaines personnes peuvent trouver Il est également intéressant de considérer que, à un moment donné à l'aide d'une variable dans une fonction, il peut être nécessaire de ruser. Par exemple, calculer quelque chose, mais vous allez dans quelques cas des déclarations et des choses et il y a certains cas limite où vous devez retirer un élément arrière d'une chaîne, gérer un problème hors par un, effacer la valeur etc .. Si vous aviez d'abord fait la const variable, votre flux de travail est interrompu plus de retour et supprimer const de la définition, puis revenir le curseur à l'endroit où vous travaillez. Contraire, cette habitude d'utiliser const, si possible, est un drapeau rouge que certains de ces réglages sont cachés dans le corps de la fonction, et très em> utile pour plus tard la compréhension et l'entretien. P>
Pourtant, je vous encourage activement à continuer à utiliser const: Je le font habituellement et considère les meilleures pratiques. Les raisons qui sont évidemment compris par vous, et ont été énumérés dans d'autres réponses. P> int x; code> charge moins mentale que "const int x;" lors de l'examen des fonctions: ce petit espace supplémentaire pourrait les aider à mettre un commentaire à côté. Je mentionne que non pas comme une recommandation, mais parce que je pense qu'il est important de comprendre tous les « coûts » ce facteur dans l'attitude des gens, car il est vraiment déroutant que les gens n'utilisent pas systématiquement const ici. P>
Je dirais personnellement qu'il n'y a jamais trop de void foo (const int); p>
blockQuote>
Ici, je crois (mais c'est une question de goût personnel réellement) qu'il cloque inutilement l'interface. P> const code>, et je les utilise abondamment pour les variables locales. Le seul contexte où je pourrait em> ajouter un
const code> mais n'est pas sur les paramètres de types intégrés: p>
INT CODE> IN
Unsigné Int code> ne fournit aucune information nouvelle ou utile, vous devez supprimer un bruit inutile.