C++

Geltungsbereich in C++

Geltungsbereich in C++
Eine Entität in C++ hat einen Namen, der deklariert und/oder definiert werden kann. Eine Deklaration ist eine Definition, aber eine Definition ist nicht unbedingt eine Deklaration. Eine Definition weist Speicher für die benannte Entität zu, aber eine Deklaration kann Speicher für die benannte Entität zuweisen oder nicht. Eine deklarative Region ist der größte Teil eines Programms, in dem der Name einer Entität (Variable) gültig ist. Diese Region wird als Scope oder potenzieller Scope bezeichnet. Dieser Artikel erklärt das Scoping in C++. Darüber hinaus sind Grundkenntnisse in C++ erforderlich, um diesen Artikel zu verstehen.

Artikelinhalt

Deklarativer Bereich und Geltungsbereich

Eine deklarative Region ist der größte Teil eines Programmtextes, in dem der Name einer Entität gültig ist. Es ist die Region, in der der unqualifizierte Name verwendet (gesehen) werden kann, um auf dieselbe Entität zu verweisen. Betrachten Sie das folgende kurze Programm:

#einschließen
Verwenden von Namespace-Std;
Leere fn()

intvar = 3;
wenn (1==1)

cout<

int main()

fn();
0 zurückgeben;

Die Funktion fn() hat zwei Blöcke: einen inneren Block für die if-Bedingung und einen äußeren Block für den Funktionsrumpf. Der Bezeichner var wird eingeführt und im äußeren Block angezeigt. Es ist auch im inneren Block zu sehen, mit der cout-Anweisung. Der äußere und der innere Block sind beide der Geltungsbereich für den Namen, var.

Der Name var kann jedoch weiterhin verwendet werden, um eine andere Entität wie beispielsweise ein Float im inneren Block zu deklarieren. Der folgende Code veranschaulicht dies:

#einschließen
Verwenden von Namespace-Std;
Leere fn()

intvar = 3;
wenn (1==1)

float var = 7.5;
cout<

int main()

fn();
0 zurückgeben;

Die Ausgabe ist 7.5. In diesem Fall kann der Name var im inneren Block nicht mehr verwendet werden, um auf die ganze Zahl mit dem Wert 3 zu verweisen, die im äußeren Block eingeführt (deklariert) wurde. Solche inneren Blöcke werden als potenzieller Geltungsbereich für Entitäten bezeichnet, die im äußeren Block deklariert sind.

Hinweis: Eine Entität des gleichen Typs, wie die des äußeren Blocks, kann weiterhin im inneren Block deklariert werden. In diesem Fall gilt jedoch im inneren Block die neue Deklaration und ihre Bedeutung, während die alte Deklaration und ihre Bedeutung außerhalb des inneren Blocks im äußeren Block weiterhin gültig bleibt.

Eine gleichnamige Deklaration in einem inneren Block überschreibt normalerweise die gleichnamige Deklaration außerhalb dieses inneren Blocks. Innere Blöcke können andere innere Blöcke verschachteln.

Globaler Geltungsbereich

Wenn ein Programmierer gerade mit der Eingabe einer Datei beginnt, ist dies der globale Geltungsbereich. Das folgende kurze Programm veranschaulicht dies:

#einschließen
Verwenden von Namespace-Std;
float var = 9.4;
int main()

cout <cout <<::var<<'\n';
0 zurückgeben;

Die Ausgabe ist:
9.4
9.4

In diesem Fall beginnt der deklarative Bereich bzw. Geltungsbereich für var ab dem Deklarationspunkt für var, wird nach unten bis zum Ende der Datei (Übersetzungseinheit) fortgesetzt.

Der Block der Funktion main() ist ein anderer Geltungsbereich; es ist ein verschachtelter Bereich für den globalen Bereich. Um auf eine Entität des globalen Geltungsbereichs aus einem anderen Geltungsbereich zuzugreifen, wird der Bezeichner direkt verwendet oder dem Geltungsbereichsauflösungsoperator vorangestellt, :: .

Hinweis: Die Entität main() wird auch im globalen Gültigkeitsbereich deklariert.

Blockbereich

Die if-, while-, do-, for- oder switch-Anweisungen können jeweils einen Block definieren. Eine solche Aussage ist eine zusammengesetzte Aussage. Der Name einer in einem Block deklarierten Variablen hat den Gültigkeitsbereich eines Blocks. Sein Geltungsbereich beginnt am Deklarationspunkt und endet am Ende seines Blocks. Das folgende kurze Programm veranschaulicht dies für die Variable ident:

#einschließen
Verwenden von Namespace-Std;
int main()

wenn (1==1)

/*einige Aussagen*/
int-Ident = 5;
cout</*einige Aussagen*/

0 zurückgeben;

Eine Variable wie ident, die im Blockbereich deklariert wird, ist eine lokale Variable.

Eine außerhalb des Blockbereichs und darüber deklarierte Variable ist im Header des Blocks zu sehen (e seen.G., Bedingung für if-Block) und auch innerhalb des Blocks. Das folgende kurze Programm veranschaulicht dies für die Variable identif:

#einschließen
Verwenden von Namespace-Std;
int main()

int-Kennung = 8;
if (identif == 8)

cout<
0 zurückgeben;

Die Ausgabe ist 8. Hier gibt es zwei Blockbereiche: den Block für die main()-Funktion und die verschachtelte if-compound-Anweisung. Der verschachtelte Block ist der potenzielle Geltungsbereich des main()-Funktionsblocks.

Eine in einen Blockbereich eingefügte Deklaration kann außerhalb des Blocks nicht gesehen werden. Das folgende kurze Programm, das nicht kompiliert, veranschaulicht dies mit der Variablen variab:

#einschließen
Verwenden von Namespace-Std;
int main()

wenn (1 == 1)

int variab = 15;

cout<0 zurückgeben;

Der Compiler erzeugt eine Fehlermeldung für variab.

Eine eingeführte Entität, die im Header einer zusammengesetzten Funktion deklariert ist, kann außerhalb (unterhalb) der zusammengesetzten Anweisung nicht gesehen werden. Der folgende for-Schleifencode wird nicht kompiliert, was zu einer Fehlermeldung führt:

#einschließen
Verwenden von Namespace-Std;
int main()

für (int i=0; i<4; ++i)

cout<
cout<0 zurückgeben;

Die Iterationsvariable i wird innerhalb des for-Schleifenblocks gesehen, aber nicht außerhalb des for-Schleifenblocks.

Funktionsumfang

Ein Funktionsparameter wird im Funktionsblock angezeigt. Eine in einem Funktionsblock deklarierte Entität wird vom Deklarationspunkt bis zum Ende des Funktionsblocks betrachtet. Das folgende kurze Programm veranschaulicht dies:

#einschließen
#einschließen
Verwenden von Namespace-Std;
string fn(string str)

char stri[] = "Bananen";
/*andere Aussagen*/
string totalStr = str + stri;
Rückgabe totalStr;

int main()

string totStr = fn("Essen");
cout<0 zurückgeben;

Die Ausgabe ist:
Bananen essen

Hinweis: Eine außerhalb der Funktion (darüber) deklarierte Entität ist in der Funktionsparameterliste und auch im Funktionsblock zu sehen.

Etikette

Der Geltungsbereich eines Labels ist die Funktion, in der es erscheint. Der folgende Code veranschaulicht dies:

#einschließen
Verwenden von Namespace-Std;
Leere fn()

goto labl;
/*andere Aussagen*/
labl: int inte = 2;
cout<
int main()

fn();
0 zurückgeben;

Die Ausgabe ist 2.

Aufzählungsbereich

Aufzählung ohne Gültigkeitsbereich
Betrachten Sie den folgenden if-Block:

wenn (1==1)

Aufzählung a, b, c=b+2;
cout<

Die Ausgabe ist 0 1 3.

Die erste Zeile im Block ist eine Aufzählung, a, b und c sind ihre Aufzählungen. Der Gültigkeitsbereich eines Enumerators beginnt vom Deklarationspunkt bis zum Ende des umschließenden Blocks der Enumeration.

Die folgende Anweisung wird nicht kompiliert, da der Deklarationspunkt von c nach dem von a liegt:

Aufzählung a=c+2, b, c;

Das folgende Codesegment wird nicht kompiliert, da auf die Enumeratoren nach dem einschließenden Block der Enumeration zugegriffen wird:

wenn (1==1)

Aufzählung a, b, c=b+2;

cout<Die obige Aufzählung wird als Aufzählung ohne Bereichsgrenzen beschrieben, und ihre Aufzählungszeichen werden als Aufzählungszeichen ohne Bereichsgrenzen beschrieben. Dies liegt daran, dass es nur mit dem reservierten Wort enum . beginnt. Aufzählungen, die mit Aufzählungsklasse oder Aufzählungsstruktur beginnen, werden als bereichsbezogene Aufzählungen bezeichnet. Ihre Enumeratoren werden als bereichsbezogene Enumeratoren bezeichnet.

Bereichsbezogene Aufzählung
Die folgende Aussage ist in Ordnung:

Aufzählungsklassenname a, b, c=b+2;

Dies ist ein Beispiel für eine bereichsbezogene Enumeration. Der Name der Klasse ist nam. Hier beginnt der Gültigkeitsbereich des Enumerators vom Deklarationspunkt bis zum Ende der Aufzählungsdefinition und nicht bis zum Ende des umschließenden Blocks für die Aufzählung. Der folgende Code wird nicht kompiliert:

wenn (1==1)

Aufzählungsklassenname a, b, c=b+2;
cout<

Klassenumfang

Beim normalen Scoping beginnt der deklarative Bereich an einem Punkt, wird dann fortgesetzt und an einem anderen Punkt beendet stops. Der Anwendungsbereich existiert in einer zusammenhängenden Region. Mit der Klasse kann der Geltungsbereich einer Entität in verschiedenen Regionen liegen, die nicht miteinander verbunden sind. Die Regeln für verschachtelte Blöcke gelten weiterhin. Das folgende Programm veranschaulicht dies:

#einschließen
Verwenden von Namespace-Std;
//Basisklasse
Klasse Cla

Privatgelände:
int memP = 5;
geschützt:
int memPro = 9;
Öffentlichkeit:
Leere fn()

cout<
;
//Abgeleitete Klasse
Klasse DerCla: öffentlicher Cla

Öffentlichkeit:
int derMem = memPro;
;
int main()

Cla obj;
obj.fn();
DerCla derObj;
cout<0 zurückgeben;

Die Ausgabe ist:
5
9

In der Klasse Cla wird die Variable memP an der Deklarationsstelle gesehen seen. Danach wird der kurze Teil von „protected“ übersprungen und dann wieder im Klassenmember-Funktionsblock angezeigt. Die abgeleitete Klasse wird übersprungen und dann wieder im main()-Funktionsbereich (Block) angezeigt.

In der Klasse Cla wird die Variable memPro an der Deklarationsstelle gesehen seen. Der Teil der öffentlichen Funktion fn() wird übersprungen und dann im abgeleiteten Klassenbeschreibungsblock angezeigt. Es wird wieder unten in der main()-Funktion angezeigt.

Scope Resolution Operator
Der Bereichsauflösungsoperator in C++ ist :: . Es wird verwendet, um auf ein statisches Mitglied der Klasse zuzugreifen. Das folgende Programm veranschaulicht dies:

#einschließen
Verwenden von Namespace-Std;
Klasse Cla

Öffentlichkeit:
static int const mem = 5;
Öffentlichkeit:
statische Leere fn()

cout<
;
int main()

cout<Cla::fn();
0 zurückgeben;

Die Ausgabe ist:
5
5

Die statischen Member werden im main()-Funktionsblock angezeigt, auf den mit dem Bereichsauflösungsoperator zugegriffen wird.

Vorlagenparameterbereich

Der normale Gültigkeitsbereich eines Vorlagenparameternamens beginnt vom Deklarationspunkt bis zum Ende seines Blocks, wie im folgenden Code:

Vorlage struct Ages

TJohn = 11;
U Peter = 12.3;
T Maria = 13;
U Freude = 14.6;
;

U und T sind innerhalb des Blocks zu sehen.

Bei einem Vorlagenfunktionsprototyp beginnt der Gültigkeitsbereich vom Deklarationspunkt bis zum Ende der Funktionsparameterliste, wie in der folgenden Anweisung:

Vorlage void func (T no, U cha, const char *str );

Bei der Klassenbeschreibung (Definition) kann der Geltungsbereich jedoch auch unterschiedliche Anteile haben, wie im folgenden Code:

#einschließen
Verwenden von Namespace-Std;
Vorlage Klasse TheCla

Öffentlichkeit:
T-Zahl;
statische U ch;
void func (U cha, const char *str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

statischer Leerspaß (U ch)

if (ch == 'a')
cout << "Official static member function" << '\n';

;
int main()

TheCla obj;
obj.Anzahl = 12;
obj.func('$', "500");
0 zurückgeben;

Namensverstecken

Ein Beispiel für das Verbergen von Namen tritt auf, wenn der Name desselben Objekttyps in einem verschachtelten Block erneut deklariert wird. Das folgende Programm veranschaulicht dies:

#einschließen
Verwenden von Namespace-Std;
Leere fn()

intvar = 3;
wenn (1==1)

intvar = 4;
cout<
cout<
int main()

fn();
0 zurückgeben;

Die Ausgabe ist:
4
3

Das liegt daran, dass var im verschachtelten Block var im äußeren Block versteckt hat.

Möglichkeit zur Wiederholung der Erklärung im gleichen Umfang

Der Punkt der Deklaration ist, wo der Name (zum ersten Mal) in seinem Geltungsbereich eingeführt wird.

Funktionsprototyp
Unterschiedliche Entitäten, auch unterschiedlichen Typs, können normalerweise nicht im gleichen Geltungsbereich deklariert werden. Ein Funktionsprototyp kann jedoch im selben Geltungsbereich mehr als einmal deklariert werden. Das folgende Programm mit zwei Funktionsprototypen und entsprechender Funktionsdefinition veranschaulicht dies:

#einschließen
Verwenden von Namespace-Std;
void fn(int num);
void fn(int num);
void fn(int num)

cout<
int main()

fn(5);
0 zurückgeben;

Das Programm funktioniert.

Überladene Funktionen
Überladene Funktionen sind Funktionen mit demselben Namen, aber unterschiedlichen Funktionssignaturen. Als weitere Ausnahme können überladene Funktionen gleichen Namens im gleichen Geltungsbereich definiert werden. Das folgende Programm veranschaulicht dies:

#einschließen
Verwenden von Namespace-Std;
void fn(int num)

cout<
void fn(float nein)

cout<
int main()

fn(5);
Schwimmer flt = 8.7;
fn(flt);
0 zurückgeben;

Die Ausgabe ist:
5
8.7

Die überladenen Funktionen wurden im globalen Geltungsbereich definiert.

Namespace-Bereich

Namespace Scope verdient einen eigenen Artikel. Der besagte Artikel wurde für diese Website geschrieben, linuxhint.com. Geben Sie einfach die Suchbegriffe "Namespace Scope" in das Suchfeld dieser Site (Seite) ein und klicken Sie auf OK, und Sie erhalten den Artikel.

Umfang in verschiedenen Portionen

Die Klasse ist nicht das einzige Schema, bei dem der Geltungsbereich in verschiedenen Teilen liegen kann. Friend-Bezeichner, bestimmte Verwendungen des elaborierten-Typ-Bezeichners und using-Direktiven sind andere Schemata, bei denen der Geltungsbereich an anderen Stellen liegt - für Details siehe später.

Fazit

Ein Geltungsbereich ist eine deklarative Region. Eine deklarative Region ist der größte Teil eines Programmtextes, in dem der Name einer Entität gültig ist. Es kann nach bestimmten Programmierschemata in mehr als einen Teil unterteilt werden, z. B. in verschachtelte Blöcke. Die Teile, die den Deklarationspunkt nicht haben, bilden den potentiellen Geltungsbereich. Der potenzielle Umfang kann die Erklärung haben oder nicht.

So zeigen Sie OSD-Overlay in Vollbild-Linux-Apps und -Spielen an
Das Spielen von Spielen im Vollbildmodus oder die Verwendung von Apps im ablenkungsfreien Vollbildmodus kann Sie von relevanten Systeminformationen ab...
Top 5 Karten zur Spielaufnahme
Wir alle haben Streaming-Gameplays auf YouTube gesehen und geliebt. PewDiePie, Jakesepticye und Markiplier sind nur einige der Top-Gamer, die Millione...
So entwickeln Sie ein Spiel unter Linux
Vor einem Jahrzehnt hätten nicht viele Linux-Benutzer vorhergesagt, dass ihr Lieblingsbetriebssystem eines Tages eine beliebte Spieleplattform für kom...