#include <iostream>
using namespace std;
class T1
{
const int t = 100;
public:
T1()
{
cout << "T1 constructor: " << t << endl;
}
};
Quando estou tentando inicializar a variável const membro 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 const
valor?
Respostas:
o
const
variável especifica se uma variável é modificável ou não. O valor constante atribuído será usado cada 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 tudo brevemente:
Uma
const
variável deve ser declarada dentro da classe, mas não pode ser definida nela. Precisamos definir a variável const fora da classe.Aqui, a atribuição
t = 100
acontece na lista de inicializadores, muito antes de ocorrer a inicialização da classe.fonte
Here the i = 10 assignment in initializer list happens much before the class initilizaiton occurs.
que não entendi. E basicamente esse tipo de permissão de definições dentro da classe é específico do compilador, certo?operator = function not found
em VC ++. Qual pode ser o problema?Bem, você poderia fazer isso
static
:ou você pode usar um inicializador de membro:
fonte
const member
deveria ser acessível a partir das funções / objetos, então por que estático?Existem algumas maneiras de inicializar os membros const dentro da classe.
Definição de membro const em geral, também precisa da inicialização da variável.
1) Dentro da classe, se você deseja inicializar o const a sintaxe é assim
2) A segunda via pode ser
3) Bem, se você não quiser inicializar na declaração, a outra maneira é por meio do construtor, a variável precisa ser inicializada na lista de inicialização (não no corpo do construtor). Tem que ser assim
fonte
Se você não deseja tornar o
const
membro de dados estático na classe, pode inicializar oconst
membro de dados usando o construtor da classe. Por exemplo:se houver vários
const
membros de dados na classe, você pode usar a seguinte sintaxe para inicializar os membros:fonte
Você pode atualizar seu compilador para suportar C ++ 11 e seu código funcionaria perfeitamente.
Use a lista de inicialização no construtor.
fonte
Outra solução é
Portanto, t é inicializado com 100 e não pode ser alterado e é privado.
fonte
Se um membro for um Array, será um pouco mais complexo do que o normal:
ou
fonte
Outra forma possível são os namespaces:
A desvantagem é que outras classes também podem usar as constantes se incluírem o arquivo de cabeçalho.
fonte
Esta é a maneira certa de fazer. Você pode tentar este código.
se estiver usando
C++10 Compiler or below
, não será possível inicializar o membro contras no momento da declaração. Portanto, aqui é necessário fazer o construtor para inicializar o membro de dados const. Também é necessário usar a lista de inicializadoresT1():t(100)
para obter memória instantaneamente.fonte
você pode adicionar
static
para tornar possível a inicialização desta variável de membro de classe.No entanto, nem sempre é uma boa prática usar a declaração de classe interna, porque todos os objetos instanciados dessa classe compartilharão a mesma variável estática que é armazenada na memória interna fora da memória de escopo dos objetos instanciados.
fonte