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 :

question de code pure sur const_cast


Sujet :

C++

  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut question de code pure sur const_cast
    Bonjour
    J'ai un bout de code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template <class T>
    class TauPtr 
    {
     
        virtual bool operator == (const T* right) const;
    	  virtual bool operator == (T* right) const {return operator == (const_cast<const T*>(right));}
    	  virtual bool operator == (int right) const {return right == 0 && _ptr == 0;} // pour comparaison avec NULL
     
     
    ..}
    D'après ce que j'ai compris, const_cast supprime le caractère constant d'un objet. Donc dans la ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (const_cast<const T*>(right));}
    On supprime le caractère const à right.
    right est implicitement de type const à cause de const dans la déclaration d e l'opérateur == (ok?). Ensuite, on lui attribut le type const T* à right.
    Pour moi, on fait une opération de const_cast, puis en fait l'opération inverse après.


    En fait, je ne vois pas a quoi cette fonction sert, si ce n'est de lui supprimer le type const, pour appeler la fonction == (définie avant) qui prend l'argument const T*.

    Merci

  2. #2
    Membre Expert
    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
    Par défaut
    const_cast sert à modifier le caractère constant d'un objet. Ici, on ne l'enlève pas, mais on l'ajoute, pour appeler explicitement la version de l'opérateur == qui prend un T const *.

    Par contre, j'ai un peu de mal à voir en quoi c'est nécessaire, car il y normalement conversion implicite de T * vers T const *. Donc aucune nécessité de définir l'opérateur == pour T*, si c'est pour lui faire appeler celui pour T const*.

  3. #3
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    const_cast sert à modifier le caractère constant d'un objet. Ici, on ne l'enlève pas
    Removes the const, volatile, and __unaligned attribute(s) from a class.
    http://msdn.microsoft.com/en-us/libr...5h(VS.80).aspx

    mais on l'ajoute, pour appeler explicitement la version de l'opérateur == qui prend un T const *.
    je ne la vois pas définie dans ce que j'ai envoyé.

    Donc aucune nécessité de définir l'opérateur == pour T*, si c'est pour lui faire appeler celui pour T const*.
    Je suis d'accord avec toi.

    Sinon, j'ai une question du même type:

    Quelle est la différence entre ces deux fonctions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    T& operator * () const;
    operator T* () const;
    Quoiqu'il en soit *() est la déclaration d'un opérateur de déférencement.

  4. #4
    Membre Expert
    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
    Par défaut
    Citation Envoyé par deubelte Voir le message
    Removes the const, volatile, and __unaligned attribute(s) from a class.
    http://msdn.microsoft.com/en-us/libr...5h(VS.80).aspx
    Dans mon draft de la norme 0x, à la rubrique const_cast (trop longue et technique pour être reprise en entier), j'ai la petite note suivate :

    73) const_cast is not limited to conversions that cast away a const-qualifier
    Dans les faits, on s'en sert rarement pour autre chose que l'enlever, car l'ajout est implicite.

    je ne la vois pas définie dans ce que j'ai envoyé.
    Elle y est, et en double (erreur de copier coller ? )

    virtual bool operator == (const T* right) const;

    Sinon, j'ai une question du même type:

    Quelle est la différence entre ces deux fonctions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    T& operator * () const;
    operator T* () const;
    Quoiqu'il en soit *() est la déclaration d'un opérateur de déférencement.
    La première déclare l'opérateur de déréférencement. La deuxième déclare l'opérateur de conversion vers un T*.

  5. #5
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Elle y est, et en double (erreur de copier coller ? )

    Non, c'est le développeur qui a fait ce fichier qui a du la mettre en double. C'était d'ailleurs ma question initiale. Il y avait une sorte de redondance

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

Discussions similaires

  1. question de code pure sur les headers
    Par deubelte dans le forum Débuter
    Réponses: 2
    Dernier message: 09/09/2010, 19h10
  2. Question "pas si bête" sur le protocole SNMP
    Par arsenik7 dans le forum Développement
    Réponses: 3
    Dernier message: 02/01/2006, 11h49
  3. Faire tourner du code PHP sur un CD Rom
    Par Furius dans le forum Langage
    Réponses: 8
    Dernier message: 22/11/2005, 12h16
  4. [JVM] interactions jvm - code : agir sur les paramètres ?
    Par pierre.zelb dans le forum Général Java
    Réponses: 6
    Dernier message: 07/07/2005, 13h02
  5. question (peut-être idiote) sur les vues
    Par LadyArwen dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 26/03/2003, 10h35

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