Por que const membros ser inicializado no inicializador construtor em vez de em seu corpo?

votos
60

Por que os membros da classe declarada como constser inicializado na lista inicializador construtor em vez de no corpo do construtor?

Qual é a diferença entre os dois?

Publicado 10/12/2008 em 07:35
fonte usuário
Em outras línguas...                            


3 respostas

votos
92

Em C ++, um objecto é considerado totalmente inicializado quando a execução entra no corpo do construtor.

Você disse:

"Eu queria saber por que const devem ser inicializadas na lista de inicializador de construtor em vez de nela do corpo?".

O que está faltando é que a inicialização acontece na lista de inicialização, e atribuição acontece no corpo do construtor. Os passos de lógica:

1) Um objecto constante só pode ser inicializado.

2) Um objeto tem todos os seus membros inicializados na lista de inicialização. Mesmo se você não inicializar explicitamente lá, o compilador terá todo o prazer fazê-lo para você :-)

3) Portanto, colocando 1) e 2), em conjunto, um membro que é const sempre só poderá ter um valor atribuído a ele na inicialização, o que acontece durante a lista de inicialização.

Respondeu 10/12/2008 em 08:01
fonte usuário

votos
9

const e variáveis ​​de referência deve ser inicializado na linha eles são declarados.

 class Something  
 {  
     private:  
      const int m_nValue;  
     public:  
      Something()  
      {  
          m_nValue = 5;  
      }  
  };

produziria código equivalente a;

const int nValue; // error, const vars must be assigned values immediately  
nValue = 5; 

Atribuindo const ou membro referência valores variáveis ​​no corpo do construtor não é suficiente.

C ++ fornece uma outra maneira de inicializar variáveis ​​de membro que permite inicializar variáveis ​​de membro quando eles são criados em vez de mais tarde. Isto é feito através do uso de uma lista de inicialização.

Você pode atribuir valores a variáveis ​​de duas formas: explícita e implicitamente: Vista plaincopy para clipboardprint?

int nValue = 5; // explicit assignment  
double dValue(4.7); // implicit assignment  

Usando uma lista de inicialização é muito semelhante ao fazer atribuições implícitas.

Lembre-se que a lista de inicialização membro, usado para inicializar objetos de dados de base e membros, está na definição, não declaração do construtor.

Mais sobre CPP-tutorial e Código Wrangler .

Respondeu 10/12/2008 em 07:57
fonte usuário

votos
-2

Como as variáveis ​​constantes e referências devem ser inicializado no momento da declaração, ou seja, antes do uso. Mas Construtores irá atribuir valor a uma varaible não initailize a variável, portanto, você deve usar initailizier lista para constante e referências

Respondeu 12/08/2016 em 09:05
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more