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 :

Norme : Fonctions libres et méthodes


Sujet :

C++

  1. #1
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut Norme : Fonctions libres et méthodes
    Bonjour à tous

    comme vous le savez, on peut posséder des méthodes qui possèdent le même nom que des fonctions libres. Et dans ce cas, l'opérateur unaire "::" permet de lever l'ambiguité.

    Je me demandais juste ce que disait la norme à ce sujet : lorsque ni this ni :: ne sont utilisés lors de l'appel, est ce qu'il s'agit de la méthode par défaut, ou s'agit-il d'un comportement indéterminé ?

    J'avoue, j'ai essayé de chercher tout seul dans la norme et je n'ai pas trouvé.
    Find me on github

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Au sein d'une fonction membre, l'utilisation de this est implicite.

    Si une fonction libre a exactement le même nom qu'une fonction membre et qu'elle prend exactement les mêmes paramètres, ce sera donc la fonction membre qui sera appelée, exactement comme si on avait invoqué this->laFonction.

    Dans une fonction non membre, le problème ne se pose pas vraiment, car tu appellera généralement la fonction membre... depuis un objet, à moins que ce ne soit une fonction statique, auquel cas, tu l'invoquera depuis... le type lui-même:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main()
    {
         T1 truc;
         foo(truc); // appel de la fonction libre
         Type machin;
         machin.foo(truc); // appel de Type::foo (fonction membre classique)
         Type::foo(truc); // appel de Type::foo (fonction statique)
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Si une fonction libre a exactement le même nom qu'une fonction membre et qu'elle prend exactement les mêmes paramètres, ce sera donc la fonction membre qui sera appelée, exactement comme si on avait invoqué this->laFonction.
    Il me semble que c'est plutôt :
    - s'il existe une fonction membre dont la signature est compatible avec l'appel, c'est elle qui sera appelée, sinon, on cherche une fonction libre compatible.

    Ce qui est assez cohérent : supposons le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void f(double d)
    {
            std::cout << "::f" << std::endl;
    }
     
    class A
    {
        public:
            A() {};
            void f(int a) { std::cout << "A::f" << std::endl; }
            void g() { return f(1.2); }
    };
    On imagine mal que, suivant si ::f(double) est déclarée (ce qui est dépendant des fichiers d'en-tête inclus), g appelle tantôt A::f, tantôt ::f -> on aurait une grosse incohérence dans la définition de la fonction, qui ne serait pas partout la même (théoriquement possible puisqu'inlinée). C'est donc bien toujours A::f qui est appelée, puisque 1.2 est implicitement convertible en int.

  4. #4
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Bonjour

    Oui, celà est clair pour moi, mais je me demandais où dans la norme ce point est débattu, par curiosité.
    Find me on github

  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 jblecanard Voir le message
    Bonjour

    Oui, celà est clair pour moi, mais je me demandais où dans la norme ce point est débattu, par curiosité.
    Recherche des noms non qualifies (3.4.1/8).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  6. #6
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Merci bien !
    Find me on github

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonctions libres vs. méthodes
    Par metagoto dans le forum Langage
    Réponses: 4
    Dernier message: 28/07/2013, 16h16
  2. [Système] fonction isset et méthode GET
    Par guillaume2vo dans le forum Langage
    Réponses: 1
    Dernier message: 21/04/2007, 19h57
  3. fonction locale à une méthode d'une classe
    Par Sahara dans le forum C++
    Réponses: 2
    Dernier message: 26/11/2006, 14h31
  4. [C#] Norme fonction main
    Par Kr00pS dans le forum Windows Forms
    Réponses: 1
    Dernier message: 26/08/2006, 20h05
  5. Réponses: 4
    Dernier message: 28/09/2005, 09h19

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