Utiliser le qualificatif const avec des pointeurs en C++
-
Utiliser la notation
const type var
pour déclarer un objet en lecture seule en C++ -
Utiliser le qualificateur
const
avec des pointeurs pour traiter les objets en lecture seule en C++
Cet article présente plusieurs méthodes pour utiliser un qualificateur const
avec des pointeurs en C++.
Utiliser la notation const type var
pour déclarer un objet en lecture seule en C++
Le C++ fournit le mot-clé const
comme qualificatif pour les objets qui doivent être définis comme étant en lecture seule (immuables). Les variables const
sont déclarées avec la notation const type var
ou type const var
, qui sont toutes deux syntaxiquement correctes, mais la première est utilisée comme style conventionnel. Comme les objets qualifiés const
ne sont pas mutables, ils doivent être initialisés lors de la déclaration. Cela rend la déclaration const int number
invalide et provoque une erreur de compilation (probablement que votre IDE va aussi crier à ce sujet).
Lorsque la variable const
est initialisée, elle ne peut pas être affectée d’une valeur différente pendant l’exécution. Ainsi, la troisième ligne de la fonction main
de l’exemple suivant est invalide, et le compilateur ne la traitera pas. Notez que si vous déclarez un pointeur vers le même type de variable et que vous essayez ensuite de lui assigner l’adresse de la variable const
, l’erreur est signalée par le compilateur. Notez que cette dernière erreur est généralement annulée si nous compilons avec le drapeau -fpermissive
.
#include <iostream>
int main() {
const int number = 1234;
number = 235; // Error
int *ptr = &number; // Error
return 0;
}
Utiliser le qualificateur const
avec des pointeurs pour traiter les objets en lecture seule en C++
Le qualificatif const
est souvent utilisé avec des pointeurs. Il existe trois types de déclarations : const type * var
, type *const var
et const type *const var
. La première déclare le pointeur var
à l’objet type
en lecture seule, ce qui signifie que l’objet ne peut pas être modifié mais que le pointeur lui-même peut l’être. La seconde - var
pointeur en lecture seule vers un objet de type type
, où nous déclarons unique, un pointeur immuable vers l’objet qui peut être modifié, et la dernière définit les deux - pointeur et objet comme immuables.
Ces notations fournissent de multiples fonctionnalités utiles qui sont explorées dans les exemples de code suivants. Comme le montre le dernier exemple, nous n’avons pas pu stocker l’adresse de la variable const
dans un pointeur sans const, mais si nous ajoutons le spécificateur const, l’opération est valide. Cependant, nous ne pouvons toujours pas modifier la valeur stockée via un pointeur nouvellement déclaré, comme le montre la 4ème ligne de la boucle main
:
#include <iostream>
using std::cout;
using std::endl;
#define STR(num) #num
int main() {
const int number = 1234;
const int *c_ptr = &number;
// *c_ptr = 42; // Error
cout << STR(number) << " - " << number << endl;
cout << STR(*c_ptr) << " - " << *c_ptr << endl;
return 0;
}
Production:
number - 1234
*c_ptr - 1234
Un autre problème courant lors de l’utilisation du qualificateur const
avec les pointeurs est l’affectation des pointeurs non-const
aux pointeurs qui pointent vers les objets en lecture seule. Notez qu’il y a une nouvelle variable non-const number2
initialisée dans l’exemple de code suivant, et que la c_ptr
qui était déclarée comme pointeur vers l’objet const
, est maintenant assignée avec l’adresse de number2
. Cette opération est légale en C++, et la conséquence est que nous ne pouvons lire la valeur stockée dans la variable number2
que via c_ptr
, mais toute modification entraînera une erreur de compilation.
#include <iostream>
using std::cout;
using std::endl;
#define STR(num) #num
int main() {
const int number = 1234;
const int *c_ptr = &number;
int number2 = 3456;
c_ptr = &number2;
// *c_ptr += 12; // Error
number2 += 12;
cout << STR(number) << " - " << number2 << endl;
cout << STR(*c_ptr) << " - " << *c_ptr << endl;
return 0;
}
Production :
number2 - 3468
*c_ptr - 3468
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook