Arguments constants

Il est parfaitement possible de déclarer constant l’argument d’une fonction, avec le mot clé const, comme on le ferait pour une autre donnée. Cependant, c’est sans intérêt pour les arguments usuels, car s’ils sont passés par valeur, la fonction ne peut les modifier extérieurement, et s’ils sont passés par référence, c’est bien en général pour les modifier (sauf dans le cas de grands types, comme on l’a vu précédemment).

Par contre, c’est particulièrement intéressant pour les tableaux et les pointeurs. Imaginons par exemple que nous programmions une fonction qui calcule la somme des n premiers termes d’un tableau. Dans ce cas, le tableau n’a aucune raison d’être modifié, bien au contraire. Cependant, une fausse manipulation provoquera cette modification, ce qui risque d’être catastrophique, la fonction ayant alors un effet de bord inattendu.

Voici comment créer une telle fonction de manière précautionneuse :

long sommetab(unsigned n, const int *tab)
{
     long somme = 0;
     while (n-- > 0) somme += *tab++;
     return somme;
}

Observons que la fonction ne se prive pas de modifier n et le pointeur tab, qui eux ne sont pas constants : comme ce sont des arguments passés par valeur, il n’y a aucun risque. Cependant, les éléments du tableau sont constants ; dès lors, si l’on avait écrit par erreur (*tab)++ au lieu de *tab++, on aurait eu le message Error : Cannot modify a const object, on ne peut modifier un objet constant.

Précédent Précédent Sommaire Sommaire Suivant Suivant