IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

preferer les appels aux fonctions const


Sujet :

C++

  1. #1
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut preferer les appels aux fonctions const
    Bonjour, y as t'il un moyen de faire choisir l'appel d'une fonction const à celle non const?

    Par exemple dans Qt, il as souvent les fonctions complémentaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    uchar * scanLine ( int i )
    const uchar * scanLine ( int i ) const
    seulement, dû au COW utilisé par Qt, la version const est plus rapide (pas de deferencement car const).

    Y as t'il une possibilité de privilégier la version const (quand c'est possible) à celle non const?

    ou faut t'il travailer avec une reference const sur l'objet?

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Salut fillot

    De ce que j'ai compris, la fonction const sera appelée dans le cas où l'instance qui appelle cette fonction est constante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void f( const Dum & d1)
    {
       Dum d2;
       d1.UneFonction(); // va appeler la version const de UneFonction()
       d2.Unefonction(); //  va appeler la version NON const de UneFonction()
    }
    Je ne sais pas si ça répond à ta question (te connaissant, ça me parait trop facile pour être ça ).

  3. #3
    screetch
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void f( Dum & d1)
    {
       ((const D&)d1).UneFonction(); // va appeler la version const de UneFonction()
       d1.Unefonction(); //  va appeler la version NON const de UneFonction()
    }

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par screetch Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void f( Dum & d1)
    {
       ((const D&)d1).UneFonction(); // va appeler la version const de UneFonction()
       d1.Unefonction(); //  va appeler la version NON const de UneFonction()
    }
    il n'y as d'autre façon pour obliger l'appel, quand c'est possible, de la fonction const quand on fait d1.Unefonction();? de manière caché?

  5. #5
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    il n'y as d'autre façon pour obliger l'appel, quand c'est possible, de la fonction const quand on fait d1.Unefonction();? de manière caché?
    C'est quoi "quand c'est possible?"

    Il n'y a pas de surcharge sur le type du resultat sauf a jouer avec des choses comme introduction d'un proxy.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    C'est quoi "quand c'est possible?"
    en prenant l'exemple de scanline de QImage.


    et que je fait cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int dif = myImage.ScanLine ( i )[0] - myImage2.ScanLine ( i )[0];
    avec myImage et myImage2 non const.
    L'appel a la fonction const serait plus logique car ce code ne les modifie pas.

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Tu veux donc une surcharge resolue sur le type de retour, ce qui n'est pas possible en C++ sauf a jouer avec des proxys et autres conversions implicites.

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Tu veux donc une surcharge resolue sur le type de retour, ce qui n'est pas possible en C++ sauf a jouer avec des proxys et autres conversions implicites.
    ok, merci.

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    seulement, dû au COW utilisé par Qt, la version const est plus rapide (pas de deferencement car const).
    [Mode sarcastique]
    Je croyais pourtant que le COW de Qt n'avait que des effets positifs sur les perfs
    [/mode]

    Plus sérieusement, si le COW a comme objectif principal de gérer les gens qui oublient de passer les paramètres par références constantes, mais qu'en contrepartie, il demande de devoir remplacer du code comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int dif = myImage.ScanLine ( i )[0] - myImage2.ScanLine ( i )[0];
    Par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    QImage const &constImage = myImage;
    QImage const &constImage2 = myImage2;
    int dif = constImage.ScanLine ( i )[0] - constImage2.ScanLine ( i )[0];
    Je ne suis pas certain qu'on y ait vraiment gagné en lisibilité.

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    [Mode sarcastique]
    Je croyais pourtant que le COW de Qt n'avait que des effets positifs sur les perfs
    [/mode]
    ben non ce serait trop facile (c'est même le contre exemple que j'avais ecrit
    http://www.developpez.net/forums/d59...e/#post3555660 )
    C'est d'ailleurs le gros point faible.

    Citation Envoyé par JolyLoic Voir le message
    Plus sérieusement, si le COW a comme objectif principal de gérer les gens qui oublient de passer les paramètres par références constantes, mais qu'en contrepartie, il demande de devoir remplacer du code comme :
    ...
    Je ne suis pas certain qu'on y ait vraiment gagné en lisibilité.
    En faite j'ai pris Qt et le cow en exemple, (je préfère éviter de refaire un débat dessus). Mais la question est générale. Comme l'on peut écrire les deux, je trouvais plus jolie que la fonction const soit privilégié.

    un autre exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class A
    {
        std::vector<int> m_tab;
    public :
        A(const std::vector<int> &ii =std::vector<int>()) :m_tab(ii){}
        std::vector<int> getI() {return m_tab;};
        const std::vector<int> & getI() const {return m_tab;};
    };
    getI() const à beaucoup d'intérêt à être privilégier par rapport à l'autre, tant que rien n'est modifié.

    Mais c'est peut être un problème de conception...

  11. #11
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class A
    {
        std::vector<int> m_tab;
    public :
        A(const std::vector<int> &ii =std::vector<int>()) :m_tab(ii){}
        std::vector<int> getI() {return m_tab;};
        const std::vector<int> & getI() const {return m_tab;};
    };
    getI() const à beaucoup d'intérêt à être privilégier par rapport à l'autre, tant que rien n'est modifié.

    Mais c'est peut être un problème de conception...
    Dans ce cas c'est différent. Et effectivement, le fait d'éviter la copie peut faire une énorme différence niveau perfs. Mais la, je ne dirais pas un "problème de conception", je dirais un problème de sémantique. Effectivement, le 1er getI, je ne l'aurais pas appelé comme ça. Puisqu'il renvoie une copie du vecteur, je l'aurais appelé un truc dans le style: GetICopy() ou GetCopyOfI(). Tu vois ce que je veux dire?

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut parrain.
    Citation Envoyé par r0d Voir le message
    Mais la, je ne dirais pas un "problème de conception", je dirais un problème de sémantique.
    j'ai pas trouvé d'exemple autre qu'avec le COW de Qt...

    Citation Envoyé par r0d Voir le message
    Effectivement, le 1er getI, je ne l'aurais pas appelé comme ça. Puisqu'il renvoie une copie du vecteur, je l'aurais appelé un truc dans le style: GetICopy() ou GetCopyOfI(). Tu vois ce que je veux dire?
    Un get n'est pas censé permet la modification interne d'une variable, non?

    Ce que je veut dire, c'est que j'ai l'impression qu'une fonction const est potentiellement plus rapide, car moins besoin de test et de contrôle, qu'une fonction non const. D'où la privilégier dés que possible..

    C'est ce qui se passe pour Qt. Les version const sont plus rapide car il n'y as pas de deferencement.

  13. #13
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Un get n'est pas censé permet la modification interne d'une variable, non?
    Non effectivement. Mais là on retombe sur un débat qui revient fréquemment: comment nommer un accesseur? Et sur ce point, de ce que j'ai vu, les avis divergent. Personnellement, je n'utilise quasiment plus de Get, précisément pour la raison que je viens de montrer: un Get()* n'est pas assez explicite à mon goût.

    Du coup, je ne sais pas s'il y a vraiment de réponse à ta question. Comme le dit Loic, sans passer par un proxy, tu ne peux pas forcer une surcharge sur le type de retour. Donc pour moi, la meilleure solution consiste à ne pas surcharger, c'est à dire à changer le nom de l'accesseur. Mais bon, c'est mon avis, et je sais que tout le monde n'est pas d'accord. Il serait d'ailleurs intéressant d'avoir d'autres avis.


    * aujourd'hui, le seul cas où j'utilise un Get, c'est dans le cas d'un variable de type simple (int, char, float...) et si une ou les deux conditions suivantes sont vérifiées:
    . Je dois effectuer une opération supplémentaire (en plus de retourner la variable), comme par exemple une vérification.
    . Cette variable ne doit à aucun prix être modifiée de l'extérieur (autrement dit, pas de set() )

Discussions similaires

  1. C detecter les appels aux fonctions internes
    Par saturn1 dans le forum C
    Réponses: 6
    Dernier message: 07/01/2012, 11h49
  2. Les appels aux fonctions ne fonctionnent pas
    Par MaPommeTao dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 16/08/2011, 22h33
  3. voir tout les appels de fonction avec le debugger?
    Par decksroy dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 03/10/2006, 11h33
  4. Appel aux fonctions d'une DLL externe ??
    Par Fbartolo dans le forum Access
    Réponses: 7
    Dernier message: 21/11/2005, 17h54
  5. appel de fonction const
    Par pseudemys dans le forum C++
    Réponses: 5
    Dernier message: 15/02/2005, 23h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo