Vous devez utiliser const
dans la signature chaque fois que vous n'avez pas besoin d'écrire. L'ajout de const
à la signature a deux effets: il indique au compilateur que vous voulez qu'il vérifie et garantisse que vous ne modifiez pas cet argument dans votre fonction. Le deuxième effet est que le code externe peut utiliser votre fonction en passant des objets qui sont eux-mêmes constants (et temporaires), permettant plus d'utilisations de la même fonction.
En même temps, le mot-clé const
est une partie importante de la documentation de votre fonction/méthode: la signature de la fonction indique explicitement ce que vous avez l'intention de faire avec l'argument, et s'il est sûr de passer un objet fait partie des invariants d'un autre objet dans votre fonction: vous êtes explicite en ce sens que vous ne jouez pas avec leur objet. L'utilisation de const
force un ensemble d'exigences plus strict dans votre code (la fonction): vous ne pouvez pas modifier l'objet, mais en même temps il est moins restrictif dans vos appelants, ce qui rend votre code plus réutilisable.
void printr(int & i) { std::cout << i << std::endl; }
void printcr(const int & i) { std::cout << i << std::endl; }
int main() {
int x = 10;
const int y = 15;
printr(x);
//printr(y); // passing y as non-const reference discards qualifiers
//printr(5); // cannot bind a non-const reference to a temporary
printcr(x); printcr(y); printcr(5); // all valid
}
est-il pas la différence entre 'const int &' int et a' ou même 'a' const int le point réel a'? Je me demande pourquoi le compilateur devrait faire une différence entre 'const int & a' et' const int a'? Ou est-ce que l'utilisation et la garantie que le compilateur ne fera pas de copie et que 'const int a' le force à faire une copie? Comment pouvez-vous dire «laisser le compilateur choisir»? – kriss
Voir aussi ici: http://stackoverflow.com/questions/2139224/2139254#2139254 – sbi
@kriss: Le compilateur ne peut pas choisir. Considérons que vous déclarez une fonction 'void f ( int x);'. Au moment de la déclaration, le compilateur n'a aucune information indiquant si vous voulez ou non modifier l'objet. En voyant seulement le code, il peut affirmer que le code ne change pas ou change le paramètre. Et même alors, si le code change un paramètre, comment le compilateur peut-il savoir si vous voulez que ce changement soit visible en dehors de la fonction? Même s'il pouvait décider avec la définition, comment le compilateur considérerait-il la signature dans les unités de traduction où seul l'en-tête est inclus? –