Por que a definição de variável ClassName ClassName em C ++ compilação e funcionando corretamente?
-
06-07-2019 - |
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?
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;