Como inicializar a variável de membro const em uma class?

#include  using namespace std; class T1 { const int t = 100; public: T1() { cout << "T1 constructor: " << t << endl; } }; 

Quando estou tentando inicializar a variável de membro const t com 100. Mas está me dando o seguinte erro:

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

Como posso inicializar um valor const ?

A variável const especifica se uma variável é modificável ou não. O valor constante atribuído será usado toda vez que a variável for referenciada. O valor atribuído não pode ser modificado durante a execução do programa.

A explicação de Bjarne Stroustrup resume brevemente:

Uma class é geralmente declarada em um arquivo de header e um arquivo de header é normalmente incluído em várias unidades de tradução. No entanto, para evitar regras de vinculador complicadas, o C ++ exige que cada object tenha uma definição exclusiva. Essa regra seria quebrada se o C ++ permitisse a definição em class de entidades que precisavam ser armazenadas na memory como objects.

Uma variável const deve ser declarada dentro da class, mas não pode ser definida nela. Precisamos definir a variável const fora da class.

 T1() : t( 100 ){} 

Aqui a atribuição t = 100 acontece na lista de inicializadores, muito antes da ocorrência da boot da class.

Bem, você poderia torná-lo static :

 static const int t = 100; 

ou você poderia usar um inicializador de membro:

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

Existem algumas maneiras de inicializar os membros const dentro da class.

Definição de membro const em geral, precisa de boot da variável também ..

1) Dentro da class, se você quer inicializar a const a syntax é assim

 static const int a = 10; //at declaration 

2) O segundo caminho pode ser

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

3) Bem, se você não quer inicializar na declaração, então a outra maneira é através do construtor, a variável precisa ser inicializada na lista de boot (não no corpo do construtor). Tem que ser assim

 class A { const int b; A(int c) : b(c) {} //const member initialized in initialization list }; 
  1. Você pode atualizar seu compilador para suportar o C ++ 11 e seu código funcionaria perfeitamente.

  2. Use a lista de boot no construtor.

     T1() : t( 100 ) { } 

Outra solução é

 class T1 { enum { t = 100 }; public: T1(); }; 

Então, t é inicializado em 100 e não pode ser alterado e é privado.

Se um membro é um Array, será um pouco complexo do que o normal é:

 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 v; public: C():v(a, a+N) {} }; 

Se você não quiser tornar o membro de dados const na class static, será possível inicializar o membro de dados const usando o construtor da class. Por exemplo:

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

se houver vários membros de dados const na class, você poderá usar a seguinte syntax para inicializar os membros:

 Example::Example(int n, int z):x(n),someOtherConstVariable(z){} 

Outra maneira possível são namespaces:

 #include  namespace mySpace { static const int T = 100; } using namespace std; class T1 { public: T1() { cout < < "T1 constructor: " << mySpace::T << endl; } }; 

A desvantagem é que outras classs também podem usar as constantes se incluírem o arquivo de header.

você pode adicionar static para tornar possível a boot dessa variável de membro de class.

 static const int i = 100; 

No entanto, nem sempre é uma boa prática usar a declaração dentro da class, porque todos os objects instaurados dessa class compartilharão a mesma variável estática armazenada na memory interna, fora da memory do escopo dos objects instanciados.