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 :

static_cast, dynamic_cast : le doute m'habite


Sujet :

C++

  1. #1
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut static_cast, dynamic_cast : le doute m'habite
    Hi!
    J'ai récemment eu besoin d'un dynamic_cast je suis donc aller voir la FAQ à ce sujet.
    Et depuis j'ai un doute affreux.
    Déjà mis à part un éventuel warning : quelles différences entre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    float b = 0.5f;
    int a = (int)b;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    float b = 0.5f;
    int a = static_cast<int>(b);//EDIT : correction (merci Medinoc)
    Parce que je sais pas vous mais pour ce genre de conversion j'utilise plutôt la première méthode, certes plus C-like mais tellement moins longue à écrire

    Et autre chose :
    avant j'utilisait le static_cast dans le sens conversion classes dérivée -> classe parent. Et le dynamic_cast (avec toutes les précautions qui s'imposent) dans le sens classe parent -> classe dérivée.
    Est ce la bonne logique ?
    Je me suis aperçu, un peu par hasard que le down casting fonctionnait de la même façon dans mon programme avec le static_cast ou le dynamic_cast.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 385
    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 385
    Par défaut
    Salut!
    1. Le cast C-Style est à proscrire, mais plus particulièrement avec les pointeurs, car il permet n'importe quoi. Pour de bètes float/int, c'est simplement "une mauvaise pratique".
    2. Pour les conversions pointeur/ref-vers-dérivée->pointeur/ref vers parent, je n'utilise pas de cast explicite: Je déclare une nouvelle variable au besoin, pour laisser le cast implicite faire le travail.
    3. Pour les conversion parent-dérivée, static_cast et dynamic_cast ont le même effet quand la classe dérivée est bien celle attendue. Par contre:
      • dynamic_cast est plus lent,
      • Et quand la classe dérivée n'est pas celle attendue, static_cast ne s'aperçoit de rien, tandis que dynamic_cast retourne NULL pour un cast de pointeurs et lève une exception std::bad_cast pour un cast de références.

    PS: Si je tape directement sous Visual ce que tu as mis, j'ai une erreur de syntaxe car b doit être entre parenthèses...
    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.

  3. #3
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Tout s'éclaire
    Merci

  4. #4
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Le cast C-Style est à proscrire, mais plus particulièrement avec les pointeurs, car il permet n'importe quoi. Pour de bètes float/int, c'est simplement "une mauvaise pratique".
    >>On est donc d'accord, comme le dit befalimpertinent, pour les types de
    bases,qui ne sont pas des pointeurs, comme char, double, int,...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    double a=0.4;
    int b=(int)b
    (qui le cast C-type)

    est totalement équivalent à:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    double a=0.4;
    int b=static_cast<int>b
    qui est la forme C++.

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

Discussions similaires

  1. [Info] Quelle API graphique pour une "carte habitée"
    Par loz dans le forum SIG : Système d'information Géographique
    Réponses: 16
    Dernier message: 07/11/2008, 01h15
  2. [Débutant] Doute: attributs multivaleurs
    Par Paulinho dans le forum Langage SQL
    Réponses: 6
    Dernier message: 26/11/2005, 23h24
  3. des doutes envers mes processus
    Par StyleXP dans le forum Autres Logiciels
    Réponses: 14
    Dernier message: 14/11/2005, 12h09
  4. Une petite doute avec le cycle while
    Par Paulinho dans le forum C++
    Réponses: 3
    Dernier message: 06/11/2005, 11h15
  5. Doute : Clé étrangère et relation
    Par maitrebn dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 24/11/2004, 16h59

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