Warum ist Klassenname Klassenname Variablendefinition in C ++ kompiliert und ordnungsgemäß funktioniert?

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

Frage

Sagen, dass ich eine Klassendefinition haben:

class CustomClass {
    int member;
};

Warum wird die folgende Variablendefinition kompiliert und korrekt arbeiten:

CustomClass CustomClass; // the variable is properly constructed

should't dies die Compiler verwirren und verursacht sie einen Fehler anzuzeigen?

War es hilfreich?

Lösung

Klassennamen und Variablennamen belegen zwei getrennte Namensräume. Der Compiler ist in der Lage, um herauszufinden, dass der erste CustomClass ein Typ ist und die zweite CustomClass ist ein Variablenname.

Andere Tipps

Der angeforderte Zweifel ist nicht unbedingt über den Groß- und Kleinschreibung-Modus von C ++, es ist die Deklaration von Variablen, die die gleichen Namen wie die Klasse hat oben definiert ist. Ich denke, dass Ihre C ++ Compiler intelligent genug ist, um die Art des Tokens zu folgern, dass es das Parsen ..

Ich denke, sein Compiler Magie, das ist so dass es funktionieren. Ich stimme Ihnen zu, dass dies im Idealfall ein Compiler-Fehler (atleast verwirrt mich) sein sollte.

Wenn Sie versuchen, so etwas wie

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

Die Verwendung von ‚Test.member‘ im globalen Bereich wird nicht kompiliert, aber die gleichen Arbeiten im Innern ‚main ()‘, nachdem sowohl der globale ‚Test des sind kommentiert.

C ++ hat genug Komplexität Programmierer zu erregen, wie etwa Compiler auch einen Beitrag :-)?

Diese Antwort heißt es indirekt den Hauptgrund, warum es möglich ist, dies in C ++ zu tun. Es kommt auf die Abwärtskompatibilität mit C. In C-Typen einen anderen Namespace hatte und so war es möglich, einen Typ und ein Objekt oder eine Art und Funktion mit dem gleichen Namen zu erklären.

Um mit C kompatibel zu sein, fügte C ++ einige spezielle Regeln ein Objekt oder eine Funktion zu ermöglichen, die Deklaration eines Typs zu verbergen.

Klar, warum nicht? Nun, wie wieder Klasse Custom definieren? Ganz einfach: Verwendung Stichwort „Klasse“, wie folgt aus: Klasse; Klasse Custom CustomClassAgain;

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top