Utiliser le qualificatif const avec des pointeurs en C++

  1. Utiliser la notation const type var pour déclarer un objet en lecture seule en C++
  2. 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;
}

Output :

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

Article connexe - C++ Pointer

  • Accéder aux fonctions des membres depuis un pointeur jusqu'à un vecteur en C++