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 :

Questions sur le mot clé union


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 Questions sur le mot clé union
    Bonjour

    On dit que la class et la struct est globablement la même chose.
    Mais en est-il de même pour l'union?
    J'ai essayé, est il ne semble pas y avoir de problème à définr des fonctions membres, des constructeurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    union T{
    private:
    int a, b;
    public:
    	T(int o,int u):a(o),b(u){};
    	int ret() const{return a;};
    };
    Mais peut-on définir des union comme on définit des classes? est-ce vraiment utilisé ainsi?
    Merci

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

    Informations professionnelles :
    Activité : aucun

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

    La réponse est simple: non...

    La réponse complète est assez compliquée:

    Une classe ou une structure permet de regrouper plusieurs informations de type potentiellement différents, et potentiellement non POD (Plain Old Data), à des adresses différentes

    Une union ne peut, de son coté, être composée que de données de type POD, et fait en sorte que les différentes données partagent le même espace mémoire.

    Cela permet de décider, à un moment donné, de considérer que l'on travaille avec un type de donnée, et, par la suite, de considérer que l'on travaille avec un autre.

    Par exemple, une union pourrait être présentée sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    union Lunion
    {
        char c[4]; //je compte 4 byte pour un int ;)
        int i;
    };
    et pourrait être utilisée sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main()
    {
        Lunion u;
        u.c[0]='1'; //j'utilise les caractères
        return 0;
    }
    void foo()
    {
        Lunion u;
        u.i=36540; //j'utilise l'entier
    }
    Il faut en outre noter que l'utilisation des différentes données de manière plus ou moins simultanée a un comportement indéfini:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main()
    {
        Lunion u;
        u.i=36540; // on travaille avec le int
        char c=u.c[2];// danger!!! comportement indéfini
        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

  3. #3
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 545
    Par défaut
    une struct est une classe dont les membres sont publiques par défaut.

    dans une union les membres sont aussi publiques par défaut, mais contrairement à une classe/struct mais il n'y a pas de place pour tout les attributs car ceux-ci se mettent 'les uns sur les autres', c.a.d. qu'au lieu de réserver assez de place pour tous on ne reserve que la place pour mettre le plus grand d'entre eux. Ensuite c'est à la place de l'application de savoir lequel est utilisé car il sont bien-sûr exclusifs en utilisation à cause du chevauchement. Bien évidemment il n'est pas question que le type des attributs aient un constructeur, ce qui réduit les possibilités, en donc par exemple pas question d'un attribut soit std::string, et dans ce cas on utilise std::string *.

    [edit]cela m'aurait étonné que personne ne réponde en même temps [/edit]
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  4. #4
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Citation Envoyé par bruno_pages Voir le message
    une struct est une classe dont les membres sont publiques par défaut.
    Pas que ça.. (type d'héritage par défaut)

    Citation Envoyé par bruno_pages Voir le message
    et dans ce cas on utilise std::string *
    Ou plutôt un union safe tel que boost.variant.

  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
    Il faut en outre noter que l'utilisation des différentes données de manière plus ou moins simultanée a un comportement indéfini:
    Ok, merci pour la réponse. Il ne faut donc pas assigner deux membres d'une union dans une même portée {}

  6. #6
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 545
    Par défaut
    Citation Envoyé par deubelte Voir le message
    Il ne faut donc pas assigner deux membres d'une union dans une même portée {}
    ce qui compte est la portée dynamique, {} désigne une portée lexicale statique

    une union contient au plus qu'une valeur, quelque soit le nombre d'attributs
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 634
    Par défaut
    Citation Envoyé par deubelte Voir le message
    Ok, merci pour la réponse. Il ne faut donc pas assigner deux membres d'une union dans une même portée {}
    Non, parce que cela modifiera le même espace mémoire, et les deux assignations pourraient provoquer des incohérences
    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

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    La restriction est plutôt au niveau lecture : on ne peut lire la valeur que du dernier membre qui a été assigné.

    Sinon globalement une union à les mêmes possibilités qu'une structure sauf :
    - Pas de membres non-POD
    - Pas de membres de type référence
    - Pas de fonctions virtuelles
    - Pas de membres statiques
    Mais tout le reste est possible, bien que peu souvent utilisé
    - Héritage
    - Constructeurs
    - Destructeurs
    - Fonctions membres
    - ...

Discussions similaires

  1. Question sur le mot new
    Par heeedi dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 03/08/2009, 11h20
  2. question sur le mot clef const
    Par elmcherqui dans le forum C++
    Réponses: 3
    Dernier message: 08/07/2008, 08h42
  3. Deux questions sur le mot clé EXTERN
    Par Bleys dans le forum C++
    Réponses: 4
    Dernier message: 02/03/2008, 14h58
  4. [Sécurité] Question sur les mots de passes
    Par wallawalla dans le forum Langage
    Réponses: 4
    Dernier message: 02/04/2007, 17h51
  5. Question sur l'utilisation du mot réservé static
    Par flash2590 dans le forum Langage
    Réponses: 4
    Dernier message: 10/04/2006, 00h20

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