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 :

Liste d'initialisation et norme


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut Liste d'initialisation et norme
    Bonsoir,

    Je souhaiterais savoir si la norme garantit que les variables initialisées dans une liste d'initialisation le soient avant celles du corps du constructeur ? (C'est à dire, si j'initialise une variable dans une liste d'initialisation du constructeur, et que je l'utilise par la suite dans le corps même du constructeur, est-ce que la norme me garantit que cette variable aura bien la valeur à laquelle je l'ai initialisée ?).

    Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 29
    Par défaut
    Bonsoir,
    Oui elles sont initialisées avant d'entrer dans le corps du constructeur.
    De plus l'ordre d'initialisation est celui de la liste d'initialisation du constructeur et pas celui de leur declaration dans la classe.

  3. #3
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    D'accord merci

  4. #4
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Citation Envoyé par fafacpp Voir le message
    De plus l'ordre d'initialisation est celui de la liste d'initialisation du constructeur et pas celui de leur declaration dans la classe.
    Tu es sûr?
    Quand sous minGW l'ordre n'est pas le même, il me sort un warning?

  5. #5
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    On m'a confirmé sur ce forum une fois que l'initialisation était uniquement dépendante de l'ordre de déclaration dans la classe...

    C'était a cause d'un problème de membres interdépendants de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    #include <iostream>
     
    class A
    {
    public:
    	A( int k ) : K( k ) {}
     
    	const int K;
    };
     
    class B
    {
    public:
    	B( const A& a) : m_a( a ) 
    	{
    		std::cout<< m_a.K <<std::endl;
    	}
     
    private:
    	const A& m_a;
    };
     
    class C
    {
    public:
     
    	C();
     
    private:
     
    	B m_b;
    	A m_a;
     
    };
     
    C::C()
    : m_b( m_a )
    , m_a( 42 )
    {
    }
     
    int main()
    {
    	C test;
     
    	std::cin.ignore(1);
    	return 0;
    }
    Après tests sous VC9, le programe affiche :
    Et en remplaçant juste :

    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    	A m_a;
    	B m_b;
    On obtient le resultat voulu :

    Tout ça pour dire que l'ordre d'initialisation est toujours celui de déclaration dans la classe (et si c'est pas ça j'aimerai bien connaitre les exceptions O__O )

    EDIT> Oups, en relisant je me rends compte que c'est hors sujet... Désolé!!

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 29
    Par défaut
    Oups!
    Autant pour moi, c'est l'inverse de ce que j'ai dit : l'ordre d'initialisation des membres depent de l'ordre de declaration dans la classe et pas dans la liste d'nitialisation du constucteur.

  7. #7
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Tous les membres constructibles sont construits dans l'ordre de déclaration des membres.

    S'ils sont explicités dans la liste d'initialisation, ils seront construits (ou juste initialisés selon la nature du type ; tout en respectant toujours l'ordre de déclaration dans la classe) à l'aide des paramètres spécifiés.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

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

Discussions similaires

  1. Liste d'initialisation en java ?
    Par jph_void dans le forum Langage
    Réponses: 12
    Dernier message: 13/05/2008, 09h44
  2. Réponses: 4
    Dernier message: 20/04/2008, 20h12
  3. Liste d'initialisation C++
    Par three minute hero dans le forum BOUML
    Réponses: 7
    Dernier message: 08/10/2007, 10h18
  4. FAQ -> liste d'initialisation
    Par Mindiell dans le forum C++
    Réponses: 24
    Dernier message: 05/09/2007, 17h24
  5. [syntax] liste d'initialisation et heritage
    Par ZaaN dans le forum C++
    Réponses: 1
    Dernier message: 12/12/2006, 16h01

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