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 :

Classe : initialisation d'une variable statique


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 72
    Points : 48
    Points
    48
    Par défaut Classe : initialisation d'une variable statique
    Bonjour
    Le programme suivant compile bien.

    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
     
     
    // Quelques" #include" inutiles, sans aucun doute !
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <iomanip>
    #include <cmath>
    #include <Windows.h>
    #include <cstdlib>
     
    using namespace std;
     
    class toto
    {
        public:
     
        static const int m_const = 5 ; // la constante est crée et initialisée (de la place mémoire a été allouée)
        static int m_var ;  // la variable est déclarée mais n'a aucune existence (aucune place mémoire allouée)
     
        toto(){} ;
        ~toto(){} ;
     
    };
     
    int toto::m_var = 12; // la variable est crée seulement maintenant et initialisée (0 par défaut)
     
     
    int main()
    {
        cout<<"m_const = "<<toto::m_const<<", m_var = "<<toto::m_var<<endl;
     
        return 0;
    }
    Il me semble qu'il serait plus pratique d'écrire dans le corps de la classe
    mais ce n'est pas possible.

    Ma question est : Il y a-t-il une raison pour traiter différemment les variables statiques et les constantes statiques ?

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 488
    Points : 6 177
    Points
    6 177
    Par défaut
    Bonjour,

    En fait, non, il n'y a probablement pas de mémoire qui a été allouée pour toto::m_const.

    std::cout << toto::m_const compile, mais std::cout << &toto::m_const, avec le &, ne compilera pas, parce que tu n'as pas défini toto::m_const, par exemple avec une ligne du genre int toto::m_const = 5;.
    En gros, si std::cout << toto::m_const compile sans avoir besoin que toto::m_const soit définie, c'est parce que le compilateur connaît la valeur et peut remplacer cette expression par std::cout << 5. Or, pour qu'il connaisse la valeur à la compilation, il faut que m_const soit const.
    En termes plus techniques, une variable membre statique non inline a besoin d'être définie si elle est ODR-used.

    Cela dit, en C++17, tu pourras définir directement m_var dans ta classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class toto
    {
    public:
     
        static const int m_const = 5;
        inline static int m_var = 12;
     
        toto(){} ;
        ~toto(){} ;
     
    };

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 72
    Points : 48
    Points
    48
    Par défaut
    Merci beaucoup pour cette explication précise.

    Mon interrogation est liée à mon erreur concernant la soit-disant mémoire allouée à la constante.
    S'il en était ainsi, pourquoi ne pas faire de même avec la variable ?

    Mais effectivement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     cout<<"&m_const = "<<&toto::m_const<<endl;
    ne compile pas car, comme tu le dis, la constante n'est pas définie.

    Merci encore

    Serge

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

Discussions similaires

  1. [PRO*C] initialisation d'une variable en zone statique
    Par awalter1 dans le forum Interfaces de programmation
    Réponses: 0
    Dernier message: 23/07/2012, 15h48
  2. [PHP 5.0] Initialisation d'une variable statique
    Par Rolf-IV dans le forum Langage
    Réponses: 7
    Dernier message: 19/03/2009, 11h04
  3. Réponses: 5
    Dernier message: 19/09/2008, 22h25
  4. Réponses: 1
    Dernier message: 14/04/2008, 14h53

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