165 votes

Me vendre sur const correctness

Alors, pourquoi est-ce qu'il est toujours recommandé d'utiliser const aussi souvent que possible? Il me semble que l'utilisation de const peut être plus de douleur qu'une aide en C++. Mais encore une fois, je viens à ce à partir d'python point de vue: si vous ne voulez pas quelque chose à être changé, ne pas le modifier. Donc, avec cela dit, voici quelques questions:

  1. Il semble que chaque fois que je marque quelque chose comme "const", j'obtiens une erreur et d'avoir à changer une autre fonction quelque part pour être const trop. Alors cela me fait avoir à changer de un autre la fonction de quelque part d'autre. Est-ce une chose que tout devient plus facile avec l'expérience?

  2. Sont les avantages de l'utilisation de const vraiment assez pour compenser de la peine? Si vous ne comptez pas sur la modification d'un objet, pourquoi ne pas simplement de ne pas écrire du code qui ne change pas?

Je note que, à ce point dans le temps, je suis plus porté sur les avantages de l'utilisation de const pour l'exactitude et la facilité de maintenance, mais il est également agréable d'avoir une idée de l'incidence sur les performances.

EDIT: je me suis dit que le terme correct est const exactitude, de sorte que ce que le titre est maintenant.

190voto

Jordan Parmer Points 12286

C'est le définitif, l'article sur "const correctness": http://www.parashift.com/c++-faq-lite/const-correctness.html.

En un mot, à l'aide de const est une bonne pratique parce que...

  1. Il vous protège contre le changement de variables qui ne sont pas destiné à être modifié,
  2. Elle vous protège de la prise accidentelle affectations de variables, et
  3. Le compilateur peut optimiser. Par exemple, vous êtes protégés

    if( x = y ) // whoops, meant if( x == y )
    

Dans le même temps, le compilateur peut générer du code plus efficace, car il sait exactement ce que l'état de la variable/fonction sera à tout moment. Si vous êtes à l'écriture serrée de code C++, c'est bien.

Vous avez raison, il peut être difficile à utiliser const-correctness constamment, mais le code est plus concis et plus sûr de programme. Lorsque vous faites beaucoup de développement en C++, les avantages de ce manifeste rapidement.

144voto

Doug T. Points 33360

Voici un morceau de code avec une erreur commune que const exactitude peut vous protéger contre:

void foo(const int DEFCON)
{
   if (DEFCON = 1)     //< FLAGGED AS COMPILER ERROR! WORLD SAVED!
   {
       fire_missiles();
   }
}

72voto

Chris Mayer Points 1034

Il semble que chaque fois que je marque quelque chose comme "const", j'obtiens une erreur et d'avoir à changer d'une autre fonction quelque part pour être const trop. Puis ce me fait avoir à changer de un autre la fonction de quelque part d'autre. Est-ce une chose que tout devient plus facile avec de l'expérience?

À partir de l'expérience, c'est un total de mythe. Il se produit lorsque les non-const-correct est assis avec const-correct code, c'est sûr. Si vous concevez const-correct dès le départ, cela ne devrait JAMAIS être un problème. Si vous faites quelque chose de const, et puis quelque chose d'autre ne veut pas compiler, le compilateur te dit quelque chose d'extrêmement important, et vous devriez prendre le temps de le fixer correctement.

33voto

Antonio Haley Points 2588

Ce n'est pas pour vous lorsque vous écrivez le code initialement. C'est pour quelqu'un d'autre (ou quelques mois plus tard) qui est à la recherche à la déclaration de la méthode à l'intérieur de la classe ou de l'interface pour voir ce qu'il fait. Pas la modification d'un objet est un élément important de l'information à glaner.

24voto

JohnMcG Points 5062

const est une promesse que vous êtes en tant que développeur, et s'assurer du compilateur d'aide dans l'application.

Mes raisons pour être const-correct:

  • Il communique aux clients de votre fonction de votre volonté de ne pas modifier la variable ou un objet
  • L'acceptation des arguments par référence const vous donne l'efficacité de passage par référence à la sécurité de passage par valeur.
  • L'écriture de vos interfaces const correcte permettra aux clients de les utiliser. Si vous écrivez votre interface pour prendre en non-const références, les clients qui sont à l'aide de const aurez besoin de jeter constness loin afin de travailler avec vous. C'est particulièrement gênant si votre interface accepte non-const char*s, et vos clients en utilisant std::les chaînes de caractères, puisque vous ne pouvez obtenir un const char* à partir d'eux.
  • À l'aide de const fera appel au compilateur de vous garder honnête, de sorte que vous n'avez pas tort de changer quelque chose qui ne devrait pas changer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X