web-dev-qa-db-fra.com

Comment initialiser la variable membre const dans une classe?

#include <iostream>

using namespace std;
class T1
{
  const int t = 100;
  public:

  T1()
  {

    cout << "T1 constructor: " << t << endl;
  }
};

Lorsque j'essaie d'initialiser la variable membre const t avec 100. Mais cela me donne l'erreur suivante:

test.cpp:21: error: ISO C++ forbids initialization of member ‘t’
test.cpp:21: error: making ‘t’ static

Comment puis-je initialiser une valeur const?

94
Chaitanya

La variable const spécifie si une variable est modifiable ou non. La valeur constante attribuée sera utilisée chaque fois que la variable est référencée. La valeur attribuée ne peut pas être modifiée pendant l'exécution du programme.

Bjarne Stroustrup explication résume brièvement ceci:

Une classe est généralement déclarée dans un fichier d'en-tête et un fichier d'en-tête est généralement inclus dans de nombreuses unités de traduction. Cependant, pour éviter les règles compliquées de l'éditeur de liens, C++ requiert que chaque objet ait une définition unique. Cette règle serait rompue si C++ permettait la définition en classe des entités devant être stockées en mémoire en tant qu'objets.

Une variable const doit être déclarée dans la classe, mais elle ne peut pas y être définie. Nous devons définir la variable const en dehors de la classe.

T1() : t( 100 ){}

Ici, l'affectation t = 100 se produit dans la liste des initialiseurs, bien avant l'initialisation de la classe.

104
Dinkar Thakur

Eh bien, vous pourriez le rendre static:

static const int t = 100;

ou vous pouvez utiliser un membre initializer:

T1() : t(100)
{
    // Other constructor stuff here
}
45
Fred Larson

Il existe deux manières d'initialiser les membres const à l'intérieur de la classe.

La définition de membre const en général nécessite également l'initialisation de la variable.

1) Dans la classe, si vous voulez initialiser const, la syntaxe est la suivante

static const int a = 10; //at declaration

2) La deuxième manière peut être

class A
{
  static const int a; //declaration
};

const int A::a = 10; //defining the static member outside the class

3) Eh bien, si vous ne voulez pas initialiser lors de la déclaration, l’autre méthode consiste à utiliser le constructeur, la variable doit être initialisée dans la liste d’initialisation (et non dans le corps du constructeur). Ça doit être comme ça

class A
{
  const int b;
  A(int c) : b(c) {} //const member initialized in initialization list
};
28
ravs2627
  1. Vous pouvez mettre à niveau votre compilateur pour prendre en charge C++ 11 et votre code fonctionnerait parfaitement.

  2. Utiliser la liste d'initialisation dans le constructeur.

    T1() : t( 100 )
    {
    }
    
12
borisbn

Si vous ne souhaitez pas rendre le membre de données const dans la classe statique, vous pouvez initialiser le membre de données const à l'aide du constructeur de la classe. Par exemple:

class Example{
      const int x;
    public:
      Example(int n);
};

Example::Example(int n):x(n){
}

s'il y a plusieurs membres const dans la classe, vous pouvez utiliser la syntaxe suivante pour initialiser les membres:

Example::Example(int n, int z):x(n),someOtherConstVariable(z){}
9
GANESH B K

Une autre solution est

class T1
{
    enum
    {
        t = 100
    };

    public:
    T1();
};

Donc, t est initialisé à 100 et il ne peut pas être changé et il est privé.

5
Musky

Si un membre est un tableau, ce sera un peu plus complexe que la normale:

class C
{
    static const int ARRAY[10];
 public:
    C() {}
};
const unsigned int C::ARRAY[10] = {0,1,2,3,4,5,6,7,8,9};

ou

int* a = new int[N];
// fill a

class C {
  const std::vector<int> v;
public:
  C():v(a, a+N) {}
};
3
Viet Anh Do

Une autre façon possible est les espaces de noms:

#include <iostream>

namespace mySpace {
   static const int T = 100; 
}

using namespace std;

class T1
{
   public:
   T1()
   {
       cout << "T1 constructor: " << mySpace::T << endl;
   }
};

L'inconvénient est que d'autres classes peuvent également utiliser les constantes si elles incluent le fichier d'en-tête.

2
Baran

C'est la bonne façon de faire. Vous pouvez essayer ce code.

#include <iostream>

using namespace std;

class T1 {
    const int t;

    public:
        T1():t(100) {
            cout << "T1 constructor: " << t << endl;
        }
};

int main() {
    T1 obj;
    return 0;
}

si vous utilisez C++10 Compiler or below, vous ne pourrez pas initialiser le membre contre au moment de la déclaration. Il est donc indispensable de faire constructeur pour initialiser le membre de données const. Il est également indispensable d’utiliser la liste d’initialisation T1():t(100) pour obtenir de la mémoire instantanément.

1
Gambler Aziz

vous pouvez ajouter static pour permettre l'initialisation de cette variable de membre de classe.

static const int i = 100;

Cependant, ce n'est pas toujours une bonne pratique d'utiliser une déclaration de classe interne, car tous les objets instaciés à partir de cette classe partagent la même variable statique qui est stockée dans la mémoire interne en dehors de la mémoire de la portée des objets instanciés.

0
dhokar.w