2010-08-04 8 views
2

J'ai quelques questions concernant la différenciation entre les versions const et non-const des méthodes en C++.Différenciation entre les versions const et non-const des méthodes en C++

Exemple:

 MyObject* MyClass::objectReference() 
const MyObject* MyClass::objectReference() const 

Mes questions sont les suivantes:

  1. Est-il possible à tous de faire la différence entre la version de la méthode est appelée manuellement? Ou est-il complètement/complètement automatique et si oui, quelles sont les règles précises pour déterminer quelle version doit être appelée? En ce qui concerne (1), si vous ne pouvez pas différencier l'appel de la version const de la version non-const, il est impossible d'appeler une version d'une méthode de l'autre pour éviter la duplication?
  2. Comment créer un lien vers une version ou l'autre dans la documentation d'une des méthodes utilisant doxygen? (par exemple "const version de myMethod()." ou "non-const version de myMethod().") J'ai découvert cela moi-même - ajoutez ou omettez "const" à la fin de la signature de la méthode.
+1

Je suggère de faire de * # 3 * une question différente - la dernière est spécifique à Doxygen, alors que les premières sont des questions générales en C++. Seperating * # 1 * et * # 2 * pourrait mieux fonctionner aussi. –

+0

# 2 est juste un cas particulier de # 1, où l'objet en question est celui qui est pointé par 'this'. Je suis tout à fait d'accord que le numéro 3 devrait avoir sa propre question, cependant. – bcat

+0

@bcat: Eh bien, donc * pourrait * - le partage d'implémentation est un problème intéressant en soi: [# 1] (http://stackoverflow.com/questions/407100/calling-a-const-function-from-a -non-const-object), [# 2] (http://stackoverflow.com/questions/1333849/how-to-generate-a-non-const-method-from-a-const-method), [# 3] (http://stackoverflow.com/questions/856542/elegant-solution-to-duplicate-const-and-non-const-getters), ... :) –

Répondre

5

Je ne connais pas le doxygène; mais voici ce que je sais.

  1. S'il y a seulement une version non const, il ne peut simplement pas être appelé sur un objet const.
  2. S'il existe seulement une version const, elle peut être appelée sur les objets const et non const.
  3. S'il y a les deux, la version non const sera appelée sur des objets non const et la version const sera appelée sur const objets.
  4. Si vous voulez appeler explicitement l'const un, vous devez jeter votre objet à une référence const lui-même: static_cast<const MyClass&>(myObject).objectReference();
+1

Voulez-vous utiliser 'const_cast' à la place? – Anthony

+4

@Duracell: Je préfère utiliser 'const_cast' uniquement pour supprimer le modificateur' const', puisque static_cast' fait un excellent travail en l'ajoutant. – zneak

+3

@Duracell @zneak: C'est un bon exemple d'utilisation pour [un modèle de fonction 'implicit_cast'] (http://stackoverflow.com/questions/868306/what-is-the-difference-between-static-cast-and- implicite-cast/869597 # 869597). –

1

Alors, appelant la méthode non const sur une const instance est probablement pas sage . Si vous souhaitez appeler la méthode const sur une instance non const, utilisez simplement une distribution. Voir le programme suivant pour un exemple:

#include <iostream> 

class ConstTest { 
public: 
    void cows() const { 
    std::cout << "const method call" << std::endl; 
    }; 

    void cows() { 
    std::cout << "non-const method call" << std::endl; 
    } 
}; 

int main() { 
    ConstTest ct; 

    ct.cows();         // Prints "non-const method call" 
    static_cast<const ConstTest &>(ct).cows(); // Prints "const method call" 
} 
Questions connexes