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 :
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.
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 ptr — un pointeur constant vers une valeur modifiable, le pointeur ne peut pas être changé, la valeur peut l'être.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.