Definition von Klasse und Variable mit dem gleichen Namen

7

Da ist dieser Code:

%Vor%

Warum ist es zulässig, Variable und Klasse mit demselben Namen zu definieren, aber es ist nicht zulässig, Variable und Funktion mit demselben Namen zu definieren?

    
scdmb 16.05.2013, 16:39
quelle

4 Antworten

5

Was hier vor sich geht, ist spezifisch für C ++. Die Verwendung von x als Klassenname ist ausgeblendet.

Abschnitt 3.3.7 (Name Verstecke) Absatz 2:

  

Ein Klassenname (9.1) oder ein Enumerationsname (7.2) kann durch den Namen eines Objekts, einer Funktion oder eines Enumerators ausgeblendet werden, die im selben Bereich deklariert sind. Wenn ein Klassen- oder Enumerationsname und ein Objekt, eine Funktion oder ein Enumerator im selben Bereich (in beliebiger Reihenfolge) mit demselben Namen deklariert sind, wird der Klassen- oder Enumerationsname überall dort angezeigt, wo der Name des Objekts, der Funktion oder des Enumerators sichtbar ist / p>

    
David Hammen 16.05.2013, 17:08
quelle
13

Erster Fall: 2 Identifikatoren

%Vor%

Zweiter Fall: 1 Bezeichner, 1 Typname

%Vor%

Der Compiler kann den ersten Fall nicht behandeln, weil Sie zwei Bezeichner mit demselben Namen haben, so dass es eine Mehrdeutigkeit geben kann. (Beispiel: Versuchen Sie, die Speicheradresse von einem von ihnen zu bekommen. Das ist ein Fall, wo eine Mehrdeutigkeit entstehen könnte)

Der Compiler kann den zweiten Fall behandeln, weil der eine ein Typ und der andere ein Bezeichner ist. Da er weiß, wo er einen Typ erwartet und wo er einen Bezeichner erwartet, gibt es keine Mehrdeutigkeit.

    
Mohamad Ali Baydoun 16.05.2013 16:41
quelle
4

Dies ist für die Rückwärtskompatibilität mit C erforderlich (wenn ich mich erinnere, definieren einige UNIX-Header sowohl eine Struktur als auch eine Variable mit demselben Namen).

Sie können zwischen einer Klasse und einer Variablen / Funktion disambiguieren:

%Vor%

Aber Sie können nicht zwischen einer Variablen und einer Funktion unterscheiden.

Siehe auch das Buch "Design und Entwicklung von C ++" von Bjarne Stroustrup, §2.8.2.

    
gx_ 16.05.2013 16:57
quelle
2

union , enum und struct (und ich nehme an, auch class ) haben zusammen verschiedene "Name Buckets" (hat nichts mit C ++ - Namespaces zu tun!) aus gewöhnlichen Bezeichnern. Dies wird in C deutlich, da Sie den Namen mit struct etc. Voranstellen müssen.

Ich habe es nicht für C ++, aber das ist vom C-Standard:

%Vor%     
typ1232 16.05.2013 16:55
quelle

Tags und Links