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 :

mot clé explicit


Sujet :

C++

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 94
    Par défaut mot clé explicit
    Bonjour,

    quelques questions :

    1-quel est la signification de "explicit" ?
    2-quel est l'intérêt de définir un constructeur "explicit" ?
    3-Doit on déclarer systématiquement un constructeur "explicit"?


  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    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 288
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Citation Envoyé par Elay Voir le message
    1-quel est la signification de "explicit" ?
    explicit interdit au compilateur d'effectuer une conversion implicite d'un autre type vers celui du constructeur.
    Citation Envoyé par Elay Voir le message
    2-quel est l'intérêt de définir un constructeur "explicit" ?
    interdire au compilateur d'effectuer une conversion implicite d'un autre type vers celui du constructeur.
    Citation Envoyé par Elay Voir le message
    3-Doit on déclarer systématiquement un constructeur "explicit"?
    non

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 94
    Par défaut
    Tu as un exemple d'utilisation pertinente ?

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Les constructeurs des pointeurs intelligents.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 94
    Par défaut
    ouai je vais mettre mon nez dans les sources de boost

  6. #6
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    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 288
    Billets dans le blog
    2
    Par défaut
    Tu peux aussi regarder le auto_ptr de la STL (en-tête <memory>)

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je dirais que tu dois déclarer tes constructeurs explicit en règle générale, et ne le supprimer que sur les constructeurs qui impliquent une vraie conversion.

    Exemple: Une classe de chaîne de caractères peut possèder un constructeur implicite sur char const* (conversion), mais un constructeur explicite sur size_t (où l'argument serait une taille).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 638
    Par défaut
    Salut,

    Je viens un peu après la bataille, mais, dés qu'un constructeur prend un argument, il peut être considéré comme opérateur de conversion.

    Ainsi, avec une classe proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class A
    {
        public:
            A(int i):i(i){}
            i leI() const{return i;}
        private:
           int i;
    };
    si tu crées une fonction prenant un A en argument comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void foo(A /* const & */ a)
    {
        std::cout<<a.leI()<<std::endl;
    }
    il est tout à fait possible d'appeler foo en passant en argument... un entier, sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main()
    {
        int i = 123;
        foo(i);
        return 0;
    }
    car le constructeur prenant un entier de la classe A servira d'opérateur de conversion implicite du type entier vers le type A.

    Dans l'exemple ci-dessus, ce n'est pas *forcément* embêtant, mais, dans d'autres, cela peut provoquer quelques soucis (imagine si le constructeur de la classe A venait à créer un tableau de 1000 entiers, par exemple)

    Pour éviter ce phénomène de conversion implicite, il est possible de déclarer le constructeur explicite.

    Cela va indiquer au compilateur de ne créer une classe A que si l'auteur du code le demande explicitement.

    Ainsi, en modifiant tout juste la classe A précédente pour déclarer le constructeur explicite sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class A
    {
        public:
            explicit A(int i):i(i){}
            i leI() const {return i;}
        private:
           int i;
    };
    le code précédent n'est plus valide, et, pour pouvoir appeler foo (qui reste inchangée), tu devra clairement dire au compilateur de créer un objet de type A au départ de ton entier, sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main()
    {
        int i = 123;
        foo(A(i));
        return 0;
    }
    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

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Un autre exemple ici, si tu comprends l'anglais.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 94
    Par défaut
    super !

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

Discussions similaires

  1. Extraction de mots clés
    Par Olive1808 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 01/02/2016, 20h49
  2. Remplacer 1, 2, 3 par un mot explicite
    Par manu f dans le forum Langage SQL
    Réponses: 9
    Dernier message: 18/06/2010, 15h12
  3. Conversion cast implicite et mot clef "explicit"
    Par nikopol82 dans le forum Langage
    Réponses: 7
    Dernier message: 08/11/2009, 20h07
  4. Le mot-clé "explicit"
    Par Mersenne dans le forum C++
    Réponses: 4
    Dernier message: 14/05/2007, 08h53

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