Quelle est l'utilisation de la surcharge const en C ++?
-
05-07-2019 - |
Question
En C ++, la signature d'une fonction dépend en partie du fait qu'elle soit ou non const. Cela signifie qu'une classe peut avoir deux fonctions membres avec des signatures identiques, sauf que l'une est const et l'autre pas. Si vous avez une classe comme celle-ci, le compilateur décidera de la fonction à appeler en fonction de l'objet sur lequel vous l'appelez: s'il s'agit d'une instance const de la classe, la version const de la fonction sera appelée; si l'objet n'est pas const, l'autre version sera appelée.
Dans quelles circonstances pourriez-vous profiter de cette fonctionnalité?
La solution
Cela n'a de sens que lorsque la fonction membre renvoie un pointeur ou une référence à un membre de données de votre classe (ou à un membre d'un membre, ou à un membre d'un membre d'un membre, ... etc.). Il est généralement mal vu de renvoyer des pointeurs non constants ou des références à des membres de données, mais cela est parfois raisonnable ou simplement très pratique (par exemple, l'opérateur []). Dans de tels cas, vous fournissez les versions const et non const du getter. De cette façon, la décision sur la possibilité ou non de modifier l'objet dépend de la fonction qui l'utilise, qui a le choix de le déclarer const ou non-const.
Autres conseils
C’est là que vous pouvez demander au compilateur de renvoyer un objet const ou régulier, tout en conservant la même signature de méthode. Une Const Correctness offre une explication détaillée.
Vous pouvez l’utiliser pour décider de renvoyer ou non une référence const à un objet. Les conteneurs de la STL utilisent les fonctions begin () et end () surchargées pour décider de renvoyer un const_iterator ou un itérateur normal.
Regardez le comportement de std :: map :: operator []. La version const génère une erreur si vous essayez de référencer une clé non valide, mais la version non const effectue une insertion. Le comportement d'insertion est beaucoup plus pratique que d'avoir à utiliser std :: map :: insert (et fera un écrasement, en plus) mais ne peut pas fonctionner pour une carte const.