126 votes

const char * const versus const char *?

Je suis en cours d'exécution à travers quelques exemples de programmes de refamiliarize moi-même avec le C++ et j'ai couru dans la question suivante. Tout d'abord, voici l'exemple de code:

void print_string(const char * the_string)
{
    cout << the_string << endl;
}

int main () {
    print_string("What's up?");
}

Dans le code ci-dessus, le paramètre de print_string aurait plutôt été const char * const the_string. Ce qui serait plus correct?

Je comprends que la différence est que l'un est un pointeur vers une constante caractère, tandis que l'un est un pointeur constant sur une constante caractère. Mais pourquoi faire tant de ces travaux? Quand est-il pertinent?

280voto

Kent Boogaart Points 97432

Ce dernier vous empêche de modifier the_string à l'intérieur d' print_string. Il serait approprié ici, mais peut-être le niveau de verbosité mettre du développeur.

char* the_string : Je peux changer l' char qui the_string des points, et je peux modifier l' char au cours de laquelle il pointe.

const char* the_string : Je peux changer l' char qui the_string des points, mais je ne peux pas modifier l' char au cours de laquelle il pointe.

char* const the_string : Je ne peux pas changer l' char qui the_string des points, mais je peux modifier l' char au cours de laquelle il pointe.

const char* const the_string : Je ne peux pas changer l' char qui the_string des points, je ne peux modifier l' char au cours de laquelle il pointe.

154voto

James Michael Hare Points 19077

const char * p; -> Pointeur modifiable sur un caractère constant

char * const p; -> pointeur constant sur un caractère mutable

const char * const p; -> pointeur constant sur un caractère constant

31voto

Nawaz Points 148870

const char * const moyen pointer ainsi que les données du pointeur pointée, sont tous les deux const!

const char * signifie que seules les données sur lesquelles le pointeur a été pointé sont const. le pointeur lui-même n'est cependant pas const.

Exemple.

 const char *p = "Nawaz";
p[2] = 'S'; //error, changing the const data!
p="Sarfaraz"; //okay, changing the non-const pointer. 

const char * const p = "Nawaz";
p[2] = 'S'; //error, changing the const data!
p="Sarfaraz"; //error, changing the const pointer. 
 

15voto

Thomas Matthews Points 19838

De nombreuses personnes suggèrent de lire le spécificateur de type de droite à gauche.

 const char * // Pointer to a `char` that is constant, it can't be changed.
const char * const // A const pointer to const data.
 

Dans les deux formes, le pointeur pointe vers des données constantes ou en lecture seule.

Dans la seconde forme, le pointeur ne peut pas être changé; le pointeur indiquera toujours le même endroit.

2voto

leonbloy Points 27119

La différence est que sans les const supplémentaires, le programmeur pourrait changer, dans la méthode, vers le pointeur; par exemple:

  void print_string(const char * the_string)
 {
    cout << the_string << endl;
    //....
    the_string = another_string();
    //....

 }
 

Ce serait plutôt illégal si la signature était void print_string(const char * const the_string)

De nombreux programmeurs se sentent trop verbeux (dans la plupart des scénarios) du mot clé supplémentaire const et l'omettent, même s'il serait sémantiquement correct.

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