Perché ClassName ClassName definizione variabile in C ++ compilando e funziona correttamente?

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

Domanda

Dire che ho una definizione di classe:

class CustomClass {
    int member;
};

Perché la seguente definizione di variabile viene compilata e funziona correttamente:

CustomClass CustomClass; // the variable is properly constructed

Questo non dovrebbe confondere il compilatore e indurlo a indicare un errore?

È stato utile?

Soluzione

I nomi delle classi e i nomi delle variabili occupano due spazi dei nomi separati. Il compilatore è in grado di capire che il primo CustomClass è un tipo e il secondo CustomClass è un nome variabile.

Altri suggerimenti

Il dubbio richiesto non riguarda necessariamente la modalità case sensitive di C ++, è la dichiarazione della variabile che ha lo stesso nome della classe definita sopra. Sto pensando che il tuo compilatore c ++ sia abbastanza intelligente da dedurre il tipo di token che sta analizzando ..

Penso che la sua magia del compilatore lo stia facendo funzionare. Concordo con te sul fatto che questo dovrebbe idealmente essere un errore del compilatore (almeno mi confonde).

Se provi qualcosa del genere

#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;
}

L'uso di 'Test.member' in ambito globale non verrà compilato, ma lo stesso funziona all'interno di 'main ()' dopo che entrambi i 'Test' globali sono stati commentati.

Il C ++ ha abbastanza complessità per entusiasmare i programmatori, che ne pensi dei compilatori che contribuiscono anch'essi :-)?

Questo la risposta indica indirettamente il motivo principale per cui è possibile farlo in C ++. Si tratta di retrocompatibilità con C. In C i tipi avevano uno spazio dei nomi diverso e quindi era possibile dichiarare un tipo e un oggetto, o un tipo e una funzione con lo stesso nome.

Per essere compatibile con C, C ++ ha aggiunto alcune regole speciali per consentire a un oggetto o una funzione di nascondere la dichiarazione di un tipo.

Certo, perché no? Ora come definire di nuovo la classe CustomClass? Facile: usa la parola chiave " class " ;, in questo modo: classe ; classe CustomClass CustomClassAgain;

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top