Developpez.com

Plus de 2 000 forums
et jusqu'à 5 000 nouveaux messages par jour

Discussion : Peut-on créer une méthode virtuelle const ?

Le , par NiamorH, Membre éprouvé
Voila, il est plus de minuit et demi maintenant et je me pose une question existencielle :

Les méthodes d'interface et autres méthodes virtuelles "ont-elles le droit" d'être déclarées const?

A moins de cas particuliers, mais je n'en vois pas, même en cherchant, c'est à l'implémentation de décider si, oui ou non, la méthode redéfinie va être amenée à modifier l'objet.

Quel est votre avis la-dessus ?


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse

Avatar de NiamorH NiamorH - Membre éprouvé http://www.developpez.com
le 03/11/2008 à 10:44
Hum je suis pas sûr d'avoir pigé ta remarque Médinoc
Avatar de Médinoc Médinoc - Expert éminent sénior http://www.developpez.com
le 03/11/2008 à 10:53
Traduction:
Quand tu parcoures une liste chaînée, tu ne stockes pas le pointeur "courant" dans la structure liste elle-même, mais tu le gardes à l'extérieur.
Que ce soit sous la forme d'un itérateur (listes STL) ou autre chose (listes MFC).
Avatar de Luc Hermitte Luc Hermitte - Expert éminent http://www.developpez.com
le 03/11/2008 à 11:11
Et aussi pour des histoires de ré-entrance et autres accès concurrents.
Avatar de Matthieu Brucher Matthieu Brucher - Rédacteur http://www.developpez.com
le 03/11/2008 à 11:24
Citation Envoyé par koala01  Voir le message
Le role d'une méthode const est de préciser au compilateur "cette méthode ne modifie pas l'objet".

Et surtout à l'utilisateur
Avatar de NiamorH NiamorH - Membre éprouvé http://www.developpez.com
le 03/11/2008 à 13:34
Je dirais même au développeur
Avatar de koala01 koala01 - Expert éminent sénior http://www.developpez.com
le 05/11/2008 à 11:15
Citation Envoyé par Matthieu Brucher  Voir le message
Et surtout à l'utilisateur

En fait, non...

La valeur d'une fonction constante pour l'utilisateur est - effectivement - purement informative.

Tu peux en effet très bien envisager d'appeler une méthode constante sur un objet qui ne l'est pas.
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
void foo() 
{ 
    /* création d'un objet non constant */ 
    std::vector<Type> tab; 
    /* utilisation d'une méthode constante sur... un objet non constant */ 
    if (tab.size()!=0) 
    { 
        /*...*/ 
    } 
}
se voit de manière très commune...

Par contre, c'est si l'objet est constant que cela se corse:

Le compilateur refusera tout appel à une méthode qui ne se sera pas engagée (par sa signature constante) à ne pas modifier l'objet, et cela fait force de loi pour lui.
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
void bar(const std::vector<Type>& tab) 
{ 
   /* tab est un objet constant */ 
    tab.push_back (/*...*/ ) /* Refusé: push_back ne s'est pas engagée 
                              * à ne pas modifier l'objet 
                              */ 
    if(tab.size() == 0) // accepté : size() est une méthode constante 
    { 
        /*...*/ 
    } 
}
La déclaration d'une méthode constante s'adresse donc bien en priorité au compilateur
Avatar de Luc Hermitte Luc Hermitte - Expert éminent http://www.developpez.com
le 05/11/2008 à 11:22
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
struct Titi { 
    void change(); 
}; 
struct Toto { 
   void f() const {  
      m_p -> change(); 
   } 
private: 
   Titi * m_p; 
};
Le compilo vérifie des choses avec le const, mais c'est bien avant tout une précision sur l'état visible, donc qui concerne plus l'utilisateur qu'autre chose.
Avatar de Matthieu Brucher Matthieu Brucher - Rédacteur http://www.developpez.com
le 05/11/2008 à 11:40
Citation Envoyé par koala01  Voir le message
En fait, non...

La valeur d'une fonction constante pour l'utilisateur est - effectivement - purement informative.

Quand je dis que c'est pour le développeur, c'est que j'ai mes raisons
Je renvoie à ce que Herb Sutter dit du mot-clé const, et je suis d'accord avec lui. C'est surtout pour empêcher le développeur de faire n'importe quoi. Mais derrière, le compilateur ne va pas activer des optimisations spécifiques, parce qu'il ne peut pas, à cause des mutable, des pointeurs vers les classes, ...
Avatar de Médinoc Médinoc - Expert éminent sénior http://www.developpez.com
le 05/11/2008 à 11:43
Il peut en activer certaines quand une fonction const est définie inline, bien sûr.

Ensuite, je pense qu'on doit pouvoir régler le compilo pour qu'il suppose que les fonctions membres const ne font pas de const_cast, permettant des optimisations pour les membres ni pointeurs ni mutables. Si le "Assume no aliasing" existe, une telle option doit exister aussi...
Avatar de Matthieu Brucher Matthieu Brucher - Rédacteur http://www.developpez.com
le 05/11/2008 à 11:55
Pas encore trouvé cette option alors, et pourtant, j'ai scanné pas mal d'options de compilateurs ces dernières semaines.
const ou pas const, s'il constate que tout le code est const, il va faire les mêmes choses, les mêmes optimisations. Donc c'est vraiment au développeur de faire attention à bien différentier les deux si le besoin s'en fait sentir.
Avatar de Jean-Marc.Bourguet Jean-Marc.Bourguet - Expert éminent http://www.developpez.com
le 05/11/2008 à 12:19
Citation Envoyé par Médinoc  Voir le message
Il peut en activer certaines quand une fonction const est définie inline, bien sûr.

Et rien n'empeche de faire les memes si la fonction n'est pas const, il doit faire exactement les memes controles.
Offres d'emploi IT
Analyste développeur confirmé/senior C++ h/f
Sigmalis - Suisse - Lausanne
Ingénieur en développement C++
small IZ beautiful - Ile de France - Orsay (91400)
Data scientist h/f
AXA - Ile de France - Paris - Avenue Matignon

Voir plus d'offres Voir la carte des offres IT
Contacter le responsable de la rubrique C++