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 :

reinterpret_cast<type>, static_cast<type> ou (type)?


Sujet :

C++

  1. #1
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut reinterpret_cast<type>, static_cast<type> ou (type)?
    Bonsoir

    Après avoir lu cet article de la faq, je suis tombé sur un cas concret et je me trouvais embêté de ne pas savoir lequel choisir.

    voici une représentation de la classe en question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class A{
    public:
       explicit A(unsigned int);
    private:
       A(int);
    };
    Or pour certaines raisons, je veux dans une méthode de la classe appeler le premier constructeur alors que je manipule(peut-être) un int. La question est alors: lequel des trois codes est alors préférable ?:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       return A(static_cast<unsigned int>(mon_int));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       return A(reinterpret_cast<unsigned int>(mon_int));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       return A((unsigned int)mon_int);

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    - Le premier effectuera la conversion de la valeur en unsigned int (ce que tu veux)
    - Le deuxième ne compile pas; mais imaginons qu'il compile : il ferait croire au compilateur qu'il y a un unsigned int à l'emplacement mémoire où se trouve en réalité un int -- tout ce qu'il faut pour récupérer une valeur incorrecte
    - Le troisième est dans tous les cas à éviter

  3. #3
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut
    Citation Envoyé par Laurent Gomila Voir le message
    - Le premier effectuera la conversion de la valeur en unsigned int (ce que tu veux)
    A la compilation ou à l'execution ?
    Citation Envoyé par Laurent Gomila Voir le message
    - Le deuxième ne compile pas
    Heu, je sait que la question peut paraître impertinente voir déplacée, mais... pourquoi ?
    Citation Envoyé par Laurent Gomila Voir le message
    il ferait croire au compilateur qu'il y a un unsigned int à l'emplacement mémoire où se trouve en réalité un int -- tout ce qu'il faut pour récupérer une valeur incorrecte
    En réalité, ce n'est pas une variable mais une opération qui est reinterpret_castée ce qui signifie que la variable en question est une variable qui sera effacée à la ligne suivante.
    Citation Envoyé par Laurent Gomila Voir le message
    - Le troisième est dans tous les cas à éviter
    Une fois encore, et en te priant d'excuser l'outrecuidante impétuosité dont je fais preuve dans mes ineptes interrogations, je me permettrais de réitérer, l'insolente, la succincte, l'enfantine et pourtant diabolique et fatale question: Pourquoi ?

    En espérant une réponse de haute volée.

    Cordialement

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par méphistopheles Voir le message
    A la compilation ou à l'execution ?
    A l'exécution, c'est toujours à l'exécution un transtypage ! Mais comme il connaît les types, ça se fera tranquillement.
    Citation Envoyé par méphistopheles Voir le message
    Heu, je sait que la question peut paraître impertinente voir déplacée, mais... pourquoi ?En réalité, ce n'est pas une variable mais une opération qui est reinterpret_castée ce qui signifie que la variable en question est une variable qui sera effacée à la ligne suivante.
    Il n'y a pas de cast effectué en réalité. Ca dit de réinterprété le contenu de la case comme un entier non signé, ce qui pose problème une fois sur deux.
    Imagine que c'est un flottant...
    En réalité, les reinterpret_cast, ça marche sur les pointeurs, ça permet de modifier le type sous-jacent.
    Citation Envoyé par méphistopheles Voir le message
    Une fois encore, et en te priant d'excuser l'outrecuidante impétuosité dont je fais preuve dans mes ineptes interrogations, je me permettrais de réitérer, l'insolente, la succincte, l'enfantine et pourtant diabolique et fatale question: Pourquoi ?
    Parce que !
    C'est un cast C-like, dans ce cas ça sera équivalent à un static_cast, mais dans d'autres, ça sera un reinterpret_cast. Donc à éviter.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,
    Citation Envoyé par méphistopheles Voir le message
    Une fois encore, et en te priant d'excuser l'outrecuidante impétuosité dont je fais preuve dans mes ineptes interrogations, je me permettrais de réitérer, l'insolente, la succincte, l'enfantine et pourtant diabolique et fatale question: Pourquoi ?

    En espérant une réponse de haute volée.

    Cordialement
    Simplement parce qu'un transtypage prenant la forme de
    est un transtypage issu du C et qu'il subit toutes les limites de son prédécesseur...

    Le C est un langage faiblement typé dans lequel tu *peux* décider à n'importe quel moment de transtyper n'importe quoi en n'importe quoi d'autre, sans que le langage n'aie le moyen de vérifier que la conversion soie possible.

    Cela signifie que, si tu n'y prend pas garde, tu puisse en arriver à faire passer un spagetti pour... une voiture

    Le C++ quant à lui est, en tout cas, plus fortement typé, et fournit une série de possibilités qui nous permettent de nous assurer qu'une conversion est - au minimum - cohérente (que le spagetti ne soit jamais considéré comme autre chose qu'un aliment... avec sans doute même quelques restrictions)

    C'est la raison principale pour laquelle nous conseillons régulièrement de préférer toutes les possibilités offertes par le C++ à l'équivalent qui serait fourni par le C

  6. #6
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut
    Merci beaucoup


    et moi qui croyais que la conversion (untype)unautretype étais propre au C++...

    bon, ben du coup, j'ai quelques lignes à recoder, mais heureusement que le replace existe


    Merci encore

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    C'est un cast C-like, dans ce cas ça sera équivalent à un static_cast, mais dans d'autres, ça sera un reinterpret_cast.
    Ou pire, un const_cast.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/03/2009, 13h02
  2. Réponses: 3
    Dernier message: 16/01/2009, 16h28
  3. Réponses: 3
    Dernier message: 06/07/2008, 20h51
  4. quel type de donnée choisir pour simuler le type Currency
    Par maamar1979 dans le forum Débuter
    Réponses: 2
    Dernier message: 18/02/2007, 12h44
  5. Réponses: 5
    Dernier message: 12/10/2006, 13h49

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