ProgrammationDéveloppeur C++

Comment fonctionne la const-correctness en C++ ? Pourquoi est-il important d'utiliser des qualifiers const, et quelles erreurs la const-correctness aide-t-elle à éviter ? Donnez un exemple réel d'utilisation de const dans des méthodes et des fonctions.

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

const-correctness est un concept en C++ qui définit comment les variables, pointeurs, références et méthodes sont marqués comme "seulement en lecture". Cela améliore la sécurité du code, rend les interfaces de classe plus compréhensibles et permet au compilateur de détecter les erreurs lors de la compilation plutôt qu'à l'exécution.

L'utilisation des qualifiers const est importante car :

  • Elle permet de délimiter clairement quelles méthodes et fonctions ne modifient pas l'objet/données.
  • Elle empêche la modification accidentelle des données qui ne doivent pas être modifiées.
  • Elle aide le compilateur à optimiser le code.

Exemple :

class MyArray { public: int getItem(size_t idx) const { // Ne modifie pas l'objet return arr[idx]; } void setItem(size_t idx, int value) { arr[idx] = value; } private: int arr[10]; };

Ici, la méthode getItem garantit qu'elle ne modifie pas l'objet.

Question piège.

Quelle est la différence entre

void foo(const int* ptr);

et

void foo(int* const ptr);

?

Réponse correcte :

  • const int* ptr — un pointeur vers une valeur constante, la valeur ne peut pas être modifiée, le pointeur peut l'être.
  • int* const ptrun pointeur constant vers une valeur modifiable, le pointeur ne peut pas être changé, la valeur peut l'être.

Exemples d'erreurs réelles dues à la méconnaissance des subtilités du sujet.


Histoire
Dans un grand projet, une méthode de classe a été écrite sans qualifier const :

int MyClass::getVal();

À cause de cela, il était impossible d'utiliser l'objet de la classe comme référence const, par exemple, dans des fonctions ne travaillant qu'avec des objets "seulement en lecture". Cela a limité la réutilisation du code et a entraîné des copies excessives d'objets.


Histoire
Un développeur a accidentellement renvoyé une référence à des données internes via une méthode non constante :

int& MyClass::getInt();

En conséquence, le code client a pu modifier le champ privé de la classe, ce qui a conduit à un changement d'état inattendu et à des bugs difficiles à détecter.


Histoire
En laissant un paramètre constant sans const dans la fonction :

void printVector(std::vector<int>& v);

quelqu'un a accidentellement modifié le vecteur directement dans la fonction pour le débogage, oubliant de retirer ce code. Cela a entraîné un effet secondaire, presque imperceptible dans les tests, et n'a été détecté qu'en production.