68 votes

Pourquoi utiliser le mot clé const si vous savez déjà que la variable doit être constante ?

Beaucoup des livres que je lis utilisent le mot-clé const lorsque la valeur d'une variable ne doit pas être modifiée. Mis à part le fait de préciser aux lecteurs du code que vous risquez de provoquer des erreurs si vous modifiez cette variable (vous pouvez utiliser des commentaires pour ce faire), pourquoi auriez-vous besoin de ce mot-clé pour faire partie d'un langage de programmation ? Il me semble que si vous ne voulez pas qu'une variable soit modifiée, il suffit de ne pas le faire.

Quelqu'un pourrait-il m'éclairer à ce sujet ?

98voto

En plus de préciser aux lecteurs du code que vous risquez de provoquer des erreurs si vous modifiez cette variable (vous pouvez utiliser des commentaires pour ce faire).

Pas "peut" ; sera provoquer des erreurs dans votre programme.

  • Un compilateur C++ l'appliquera avec des échecs de compilation et des messages de diagnostic ("erreurs de compilation"), sans avoir besoin de commentaires ;
  • Un compilateur C l'appliquera dans l'ensemble bien que sa bibliothèque standard présente des lacunes en raison de son héritage, notamment en ce qui concerne les éléments suivants strchr et il possède des règles de conversion implicites plutôt indulgentes qui peuvent vous permettre de laisser tomber les données de la base de données. const sans s'en rendre compte assez facilement. Cependant, ce n'est pas parce que vous avez obtenu une compilation réussie que vous n'avez pas d'erreurs. fait signifie que les erreurs peuvent être des bogues subtils dans votre programme, ainsi que des plantages importants et spectaculaires.

D'une manière ou d'une autre, votre programme est garanti de contenir un erreur à l'intérieur.

Il me semble que si vous ne voulez pas qu'une variable soit modifiée, il suffit de ne pas le faire.

C'est bien beau tout ça, mais personne n'est parfait. Les programmeurs font des erreurs. Cela permet au compilateur - qui ne fait jamais d'erreurs (du moins, pas habituellement) - de vous les signaler.

C'est particulièrement utile lorsque vous utilisez une variable de données à de très nombreuses lignes de code de l'endroit où elle a été créée. Plus elle est éloignée, plus il est facile de la modifier sans se rendre compte que vous n'étiez pas censé le faire. Pour les bases de code importantes et complexes, c'est tout simplement un must.

Vous obtenez une nouvelle mesure de prouvabilité , exactitude y stabilité dans votre base de code, ainsi qu'une grande partie des causes possibles de bogues vraiment subtils et méchants. Il y a aussi de vastes possibilités d'optimisation pour votre compilateur (dans certains cas) lorsqu'il sait qu'une certaine valeur ne changera pas après la compilation.

Nous pourrions énumérer les avantages toute la journée, mais, vraiment, vous n'allez pas tout à fait grok jusqu'à ce que vous ayez travaillé sur une telle base de code.

En fait, dans un monde parfait, toutes les variables seraient const par défaut et vous devrez les déclarer avec le mot-clé mutable pour pouvoir les modifier. Le C++ est rétrograde.

40voto

Jerry Coffin Points 237758

Au moins en C++, const a quelques utilisations au-delà de la simple documentation de votre intention aux autres programmeurs.

const peuvent également indiquer certaines choses au compilateur. Par exemple, une fonction qui prend une référence, comme : void f(T &t); ne peut pas accepter un objet temporaire comme paramètre. Pour qu'il puisse le faire, vous devez const qualifier la référence, comme : void f(T const &t) .

De même, pour invoquer une fonction membre sur un objet const, la fonction membre doit être const qualifiés comme tels : void T::foo() const {} .

Dans un système embarqué, const peut c'est-à-dire plus encore, éventuellement indiquer au compilateur où localiser l'objet en question (le mettre en ROM ou en RAM). const en soi n'est pas nécessairement suffisant pour dire "mettez cet objet en ROM", mais c'est souvent un prérequis.

De même (sous C++11) const indique au compilateur la sécurité des threads .

Maintenant, il est sans doute vrai que l'on pourrait définir un autre langage qui (par d'autres aspects) ressemblerait à C ou C++ et qui ne ferait pas appel à const de ces manières. Le résultat serait un langage assez différent de l'un ou l'autre. Sans connaître vos intentions, il est impossible de dire ce que cela donnerait, mais il pourrait se rapprocher de Java ou de C# (pour quelques exemples), qui sont tous deux quelque peu similaires à C et C++ à certains égards, mais pas à celui-là en particulier (c'est-à-dire qu'il ne faut pas utiliser const comme le font C et C++).

37voto

JackCColeman Points 2599

Outre les considérations habituelles de programmation déjà abordées dans d'autres réponses, une chose qui me préoccupe est l'attitude :

Il me semble que si l'on ne veut pas qu'une variable soit modifiée, il faut simplement ne le faites pas.

En règle générale, 20 % du coût de l'écriture du code est dépensé dans la phase de développement. Les 80 % restants sont dépensés pendant la durée de vie du code, pour sa mise à niveau, sa maintenance, etc. Cela signifie que de nombreuses personnes autres que vous-même travailleront sur votre code.

Le temps consacré au développement qui permet d'éviter des problèmes des années plus tard est un bon investissement. Cet effort comprend : l'écriture de commentaires, la définition de constantes qui sont des constantes, et l'écriture d'un code explicite qui fait no s'appuyer sur des constructions linguistiques obscures.

Aussi, @worlboss, j'entends une bonne dose d'intolérance. Comme d'autres l'ont fait remarquer, les unités carbone font des erreurs et tout ce qu'une unité silicium peut faire pour aider à éviter les erreurs est apprécié.

21voto

edtheprogrammerguy Points 3502

Il indique au compilateur que la variable ne doit pas être modifiée. Ainsi, si quelqu'un écrit un code qui la modifie, le compilateur le signale comme une erreur.

17voto

ouah Points 75311

Pour deux raisons :

  1. documentation imposée par le compilateur
  2. optimisations du compilateur

Voici un bon explication de Ian Lance Taylor (qui a travaillé sur gcc y gold linker) :

La première signification de const a un effet réel sur le programme. Une variable déclarée const peut être compilée différemment d'une variable qui n'est pas déclarée const.

La deuxième signification de const, d'autre part, est, en fait, une documentation forcée par le compilateur. Le compilateur émettra une erreur si l'on tente de modifier une valeur à l'aide d'un pointeur qualifié const, mais la déclaration d'un tel pointeur ne modifiera pas le code généré.

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