Por que a definição de variável ClassName ClassName em C ++ compilação e funcionando corretamente?

StackOverflow https://stackoverflow.com/questions/828106

Pergunta

dizer que tenho uma definição de classe:

class CustomClass {
    int member;
};

Por que é a seguinte definição variável compilando e funcionando corretamente:

CustomClass CustomClass; // the variable is properly constructed

should't este confundir o compilador e causar-lhe para indicar um erro?

Foi útil?

Solução

Nomes de classes e nomes de variáveis ??ocupar dois espaços separados. O compilador é capaz de descobrir que a primeira CustomClass é um tipo eo segundo CustomClass é um nome de variável.

Outras dicas

A dúvida solicitada não é necessariamente sobre o modo sensível caso de C ++, que é a declaração de variável que tem o mesmo nome da classe definido acima. Estou pensando que o seu compilador C ++ é inteligente o suficiente para deduzir o tipo do token que é a análise ..

Eu acho que é isso é compilador mágicas fazê-lo funcionar. Concordo com você que isso, idealmente, deve ser um erro do compilador (pelo menos me confunde).

Se você tentar algo como

#include <iostream>
class Test { public: int member; };
Test Test;   // comaeu warns 'expression has no effect!'
Test.member = 10; // dosen't compile!

int main(){
  Test Test;   
  Test.member = 10; // compiles fine after global 'Test's are commented!!
  std::cout<<Test.member<<std::endl;
  return 0;
}

O uso de 'Test.member' no escopo global não irá compilar, mas as mesmas obras dentro 'main ()' Depois de ambos os 'de Teste Global são comentados.

C ++ tem complexidades suficiente para programadores Excite, como sobre compiladores também contribuem :-)?

Este resposta afirma indiretamente a principal razão pela qual é possível fazer isso em C ++. Tudo se resume a compatibilidade com tipos C. Em C teve um espaço de nomes diferente e por isso foi possível declarar um tipo e objeto, ou um tipo e função com o mesmo nome.

A fim de ser compatível com C, C ++ acrescentou algumas regras especiais para permitir que um objeto ou uma função para esconder a declaração de um tipo.

Claro, porque não? Agora como definir CustomClass classe de novo? Fácil: o uso de palavras-chave "class", como este: classe ; classe CustomClass CustomClassAgain;

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top