Historique de la question :
Le qualifier const en C++ est apparu pour des raisons de sécurité : marquer les fonctions qui garantissent de ne pas modifier l'état interne de l'objet. Dans le contexte des classes, les méthodes const sont obligatoires pour les projets où une encapsulation stricte et une protection contre les erreurs accidentelles sont requises.
Problème :
Si l'on oublie de marquer les accesseurs, les fonctions auxiliaires et les méthodes de vérification comme const, elles ne peuvent pas être appelées pour un objet const. Sans méthodes const, le compilateur ne peut pas prévenir les modifications indésirables des données.
Solution :
Ajouter const dans la déclaration de la méthode de classe après la signature (et non avant !) Cela permet d'appeler la méthode pour des objets ordinaires ainsi que pour ceux déclarés comme const, évitant ainsi les erreurs de modification de l'état. À l'intérieur d'une telle méthode, il n'est pas possible de modifier les membres de la classe (sauf pour mutable), seul la lecture est accessible.
Exemple de code :
class Counter { int value; public: int getValue() const { return value; } // Peut être appelé pour const Counter }; void print(const Counter& c) { std::cout << c.getValue(); }
Caractéristiques clés :
Où écrit-on const pour la méthode : avant le type de retour ou après les parenthèses ?
Seulement après les parenthèses : int getValue() const; — il est incorrect de l’écrire avant le type de retour (par exemple, const int get();).
Un méthode const peut-elle appeler des méthodes non const de la classe ?
Non, une méthode const ne peut appeler que d'autres méthodes const si l'objet est const.
Quelle est la différence entre const dans une méthode et const dans le type de retour ?
int get() const (la méthode ne change pas l'état)
const int get(); (la valeur de retour ne peut pas être changée, mais la méthode peut modifier les données internes)
La classe a omis const pour une méthode qui ne change pas l'état. Elle ne peut pas être appelée pour un objet constant, ce qui empêche d'utiliser la classe dans des outils d'analyse et lors de l'utilisation d'API.
Avantages :
Inconvénients :
Tous les accesseurs, vérifications et méthodes auxiliaires sont déclarés avec const, les tests couvrent à la fois les objets const et non const.
Avantages :
Inconvénients :