1 votes

Quelle est la meilleure pratique concernant les méthodes d'instance constantes ?

À la lumière de la réponse acceptée soulignant que le retour d'une référence non-const à un membre à partir d'une méthode d'instance const ne sera pas compilé (sans un cast ou en rendant la variable membre mutable), la question est devenue plus une discussion générale sur les meilleures pratiques concernant les méthodes d'instance const.

Pour la postérité, voici la question initiale :

Si j'ai un objet avec un getter qui renvoie une référence non-const, par exemple :

SomeObject& SomeOtherObject::foo(){
   return someObjectInstance;
}

Faut-il le rendre obligatoire ? Il est évident que l'appel lui-même ne modifie pas l'objet, mais l'appelant pourrait alors modifier someObjectInstance, ce qui modifierait mon instance de SomeOtherObject.

Je pense que ma question se résume en fait à " Que signifie exactement l'expression "const" dans une méthode membre ? " Est-ce que A) l'appel lui-même ne mute pas l'objet ou B) aucune mutation de l'objet ne peut se produire pendant l'appel, ou comme résultat des références/pointeurs renvoyés (avec une mise en garde pour les personnes qui font des const_casts).

Par ailleurs, je suis en train de l'ajouter là où j'ai besoin d'appels constants.

 const SomeObject& SomeOtherObject::constFoo() const{
   return someObjectInstance;
}

pour plus de sécurité, car je suis réticent à l'idée de faire

 SomeObject& SomeOtherObject::foo() const{
   return someObjectInstance;
}

même si cela me faciliterait la vie à certains endroits.

4voto

Dolphin Points 2694

constante (lorsqu'il est appliqué à une fonction membre) est principalement utile comme moyen d'auto-documentation. Il s'agit d'un contrat avec le code appelant selon lequel cette fonction ne modifiera pas l'état externe (c'est-à-dire qu'elle n'aura pas d'effets secondaires observables).

Le compilateur y parvient en rendant tous les membres effectivement constants lorsqu'ils se trouvent à l'intérieur d'une fonction membre constante

Il n'est pas rare de voir des codes comme :

const SomeObject& SomeOtherObject::constFoo() const;
SomeObject& SomeOtherObject::constFoo();

Ce qui suit ne se compile pas (MSVC 9 et gcc 3.4.4)

SomeObject& SomeOtherObject::constFoo() const{
  return someObjectInstance;
}

Vous pouvez contourner l'erreur ci-dessus en supprimant le const :

SomeObject& SomeOtherObject::constFoo() const{
  return (SomeObject&)someObjectInstance;
}

mais cela rompt bien sûr le contrat avec les utilisateurs de votre code selon lequel vous ne modifierez pas l'instance de SomeOtherObject.

Vous pouvez également créer une instance d'objet (someObjectInstance) mutable pour pouvoir éviter la distribution, mais en fin de compte, ce n'est pas mieux.

2voto

Pour répondre à votre question :

"Qu'est-ce qu'une const sur une méthode membre signifie-t-il ?"

Cela signifie que la méthode peut être appliquée de manière sûre et raisonnable à un objet constant. Bien entendu, ce que l'on entend par "sécurité" et "bon sens", c'est Bien entendu, ce que signifient "en toute sécurité" et "judicieusement" dépend du domaine du problème que vos classes modélisent.

Vous pourriez également envisager de faire en sorte que vos accesseurs renvoient des valeurs plutôt que des références. S'ils doivent renvoyer des références, je reconsidérerais alors ma conception globale.

1voto

David Thornley Points 39051

Si vous avez un objet et que vous appelez n'importe quel nombre de const au cours du traitement, le comportement observable ne changera pas, je dirais.

La norme (9.3.2, paragraphe 2) stipule que "dans une const l'objet pour lequel la fonction est appelée est accessible par l'intermédiaire d'une fonction de membre const chemin d'accès ; par conséquent, un const ne doit pas modifier l'objet et ses membres de données non statiques". Cela signifie également que vous ne pouvez pas renvoyer un objet non const par le biais des règles normales de correction des constantes.

(Cela ne signifie pas que les éléments internes de la classe ne peuvent pas être modifiés ; la norme dispose de la fonction mutable pour désigner les données des membres qui peuvent être modifiées dans une const fonction.)

0voto

Sev Points 6532

Que signifie exactement l'expression "const" dans une méthode membre ? signifie-t-il ?"

Cela signifie que la méthode ne modifie pas les variables membres d'une classe particulière. En outre, l'utilisation de const ne permet pas à la méthode d'appeler une autre méthode non-const.

Il est utilisé pour des raisons de lisibilité et de clarté, ainsi que pour la sécurité qu'il offre en cas de modifications accidentelles, soit directement, soit en appelant une autre méthode susceptible de le faire.

0voto

Tyler McHenry Points 35551

La sémantique de const dépend du domaine du problème. Si elle est potentiellement ambiguë, documentez-la.

Par exemple, si vous disposez d'une classe qui intègre l'accès à une base de données, il serait parfaitement judicieux que les méthodes "const" soient celles qui ne modifient pas l'état de la base de données, même si elles peuvent modifier l'état interne caché de l'objet (en utilisant le mot-clé "mutable" pour le permettre).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X