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 :

initialisation de variable d'instance


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    GO
    GO est déconnecté
    Membre régulier Avatar de GO
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 114
    Points : 92
    Points
    92
    Par défaut initialisation de variable d'instance
    Pouvez-vous me dire ce que fait la ligne suivante (en gras), je pense qu'il y a une erreur ou est-ce un mode déclaration de variable (sans compter qu'il manque sûrement le ? :

    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
    class tableau
    {
        const int m_iTailleMax;
        const int *m_pDonnees;
    public:
        tableau(int iTailleMax);
        ~tableau();
    };
    
    tableau::tableau(int iTailleMax) :
        m_iTailleMax(iTailleMax)    // Initialise la donnée membre constante.
    {
        // Allocation d'un tableau de m_iTailleMax entrées :
        m_pDonnees = new int[m_iTailleMax];
    }
    
    tableau::~tableau()
    {
        // Destruction des données :
        delete[] m_pDonnees;
    }
    Merci

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 374
    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 374
    Points : 41 541
    Points
    41 541
    Par défaut
    C'est la syntaxe d'initialiseur de membre.
    C'est l'unique moyen d'initialiser une donnée constante ou une référence.
    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 averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Et aussi d'initialiser une classe mère. cf. la FAQ, pour plus de détails.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Ou d'appeler un constructeur autre que celui par défaut pour les variables membres.
    Boost ftw

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2006
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    non il ne manque pas de ;

  6. #6
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    A ce propos, je n'ai jamais compris la différence entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tableau::tableau(int iTailleMax) :
        m_iTailleMax(iTailleMax)
    {}
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tableau::tableau(int iTailleMax)
    {
        m_iTailleMax = iTailleMax;
    }
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  7. #7
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par r0d
    A ce propos, je n'ai jamais compris la différence entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tableau::tableau(int iTailleMax) :
        m_iTailleMax(iTailleMax)
    {}
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tableau::tableau(int iTailleMax)
    {
        m_iTailleMax = iTailleMax;
    }
    Si je ne me trompes pas (ce qui est bien possible ) :

    Dans le premier cas, l'espace mémoire pour m_iTailleMax est alloué et directement initialisé avec iTailleMax.
    Dans le deuxième cas, l'espace mémoire pour m_iTailleMax est alloué (sans initialisation), puis la valeur de iTailleMax est recopiée dans m_iTailleMax.

    Pour les types de 'base', ça n'a pas tellement d'importance. Mais pour les objets, la seconde solution est moins optimisée puisque tu as une construction de l'objet puis une affectation (au lieu d'une construction par copie parexemple).

    Il est préférable de prendre de bonnes habitudes et des systématiquement utiliser la liste d'initialisation pour les variables membres.

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    J'ajouterai que la méthode <construction par défaut puis affectation>, en plus d'être plus lente que la méthode <construction avec les bon paramètres dès le début> a l'inconvénient de ne pas marcher dans tous les cas, car il y a plein de cas où affecter n'est pas possible (référence, donnée membre constante, donnée membre d'un type n'yant pas d'opérateur =...)
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/07/2010, 22h25
  2. Réponses: 6
    Dernier message: 26/06/2007, 18h36
  3. Réponses: 11
    Dernier message: 07/04/2005, 10h20
  4. [VB6]Initialiser une variable Static dans un évenement
    Par loverdose dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 20/01/2005, 14h57
  5. Réponses: 9
    Dernier message: 29/06/2004, 08h40

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