#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
?
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.
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
}
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
};
Vous pouvez mettre à niveau votre compilateur pour prendre en charge C++ 11 et votre code fonctionnerait parfaitement.
Utiliser la liste d'initialisation dans le constructeur.
T1() : t( 100 )
{
}
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){}
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é.
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) {}
};
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.
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.
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.