C++ der globale gültigkeitsbereich weist kein powf auf.

Weiter zum Hauptinhalt

Dieser Browser wird nicht mehr unterstützt.

Führen Sie ein Upgrade auf Microsoft Edge durch, um die neuesten Features, Sicherheitsupdates und den technischen Support zu nutzen.

Gültigkeitsbereich (C++)

  • Artikel
  • 08/08/2022
  • 4 Minuten Lesedauer

In diesem Artikel

Wenn Sie ein Programmelement wie eine Klasse, Funktion oder Variable deklarieren, kann der Name nur "gesehen" und in bestimmten Teilen Ihres Programms verwendet werden. Der Kontext, in dem ein Name sichtbar ist, wird als Bereich bezeichnet. Wenn Sie beispielsweise eine Variable x innerhalb einer Funktion deklarieren, x ist nur innerhalb dieses Funktionstexts sichtbar. Er verfügt über den lokalen Bereich. Möglicherweise haben Sie andere Variablen mit demselben Namen in Ihrem Programm; solange sie sich in unterschiedlichen Bereichen befinden, verstoßen sie nicht gegen die One Definition Rule, und es wird kein Fehler ausgelöst.

Für automatische nicht statische Variablen bestimmt der Bereich auch, wann sie im Programmspeicher erstellt und zerstört werden.

Es gibt sechs Arten von Bereich:

  • Globaler Bereich Ein globaler Name ist ein Name, der außerhalb einer Klasse, Funktion oder eines Namespace deklariert wird. In C++ sind diese Namen jedoch auch mit einem impliziten globalen Namespace vorhanden. Der Bereich der globalen Namen erstreckt sich vom Deklarationspunkt bis zum Ende der Datei, in der sie deklariert werden. Bei globalen Namen wird die Sichtbarkeit auch durch die Regeln der Verknüpfung bestimmt, die bestimmen, ob der Name in anderen Dateien im Programm sichtbar ist.

  • Namespacebereich Ein Name, der innerhalb eines Namespaces außerhalb einer Klassen- oder Enumerationsdefinition oder Funktionsblock deklariert wird, ist von seinem Deklarationspunkt bis zum Ende des Namespaces sichtbar. Ein Namespace kann in mehreren Blöcken in verschiedenen Dateien definiert werden.

  • Lokaler Bereich Ein Name, der in einer Funktion oder Lambda deklariert wird, einschließlich der Parameternamen, weist einen lokalen Bereich auf. Sie werden häufig als "Locals" bezeichnet. Sie sind nur von ihrem Deklarationspunkt bis zum Ende der Funktion oder des Lambdatexts sichtbar. Der lokale Bereich ist eine Art Blockbereich, der weiter unten in diesem Artikel erläutert wird.

  • Klassenbereich Namen von Klassenmitgliedern weisen den Klassenbereich auf, der unabhängig vom Deklarationspunkt in der gesamten Klassendefinition erweitert wird. Die Barrierefreiheit von Kursmitgliedern wird durch die publicprivateSchlüsselwörter , und protected die Barrierefreiheit von Kursmitgliedern weiter gesteuert. Öffentliche oder geschützte Mitglieder können nur mithilfe der Memberauswahloperatoren (oder->) oder Zeiger-zu-Member-Operatoren (oder -) (oder ->*) zugegriffen werden.*

  • Anweisungsbereich Namen, die in einem for, if, while, oder switch einer Anweisung deklariert sind, sind bis zum Ende des Anweisungsblocks sichtbar.

  • Funktionsbereich Eine Bezeichnung hat Funktionsbereich, was bedeutet, dass sie während eines Funktionstexts sichtbar ist, auch vor dem Deklarationspunkt. Der Funktionsbereich ermöglicht das Schreiben von Anweisungen wie goto cleanup vor der cleanup Deklarierten Bezeichnung.

Ausblenden von Namen

Sie können einen Namen verbergen, indem Sie ihn in einem eingeschlossenen Block deklarieren. In der folgenden Abbildung wird i innerhalb des inneren Blocks neu deklariert. Dadurch wird die Variable ausgeblendet, die i im äußeren Blockbereich zugeordnet ist.

C++ der globale gültigkeitsbereich weist kein powf auf.

Blockbereich und Name ausblenden

Die in der Abbildung dargestellte Ausgabe des Programms lautet wie folgt:

i = 0 i = 7 j = 9 i = 0

Hinweis

Es wird angenommen, dass das szWhat-Argument im Funktionsbereich liegt. Daher wird es so behandelt, als wäre es im äußersten Block der Funktion deklariert worden.

Ausblenden von Klassennamen

Sie können Klassennamen ausblenden, indem Sie eine Funktion, ein Objekt, eine Variable oder einen Enumerator im gleichen Bereich deklarieren. Der Klassenname kann jedoch weiterhin zugegriffen werden, wenn das Schlüsselwort classpräfixiert wird.

// hiding_class_names.cpp // compile with: /EHsc #include <iostream> using namespace std; // Declare class Account at global scope. class Account { public: Account( double InitialBalance ) { balance = InitialBalance; } double GetBalance() { return balance; } private: double balance; }; double Account = 15.37; // Hides class name Account int main() { class Account Checking( Account ); // Qualifies Account as // class name cout << "Opening account with a balance of: " << Checking.GetBalance() << "\n"; } //Output: Opening account with a balance of: 15.37

Hinweis

Jeder Ort, für den der Klassenname (Account) aufgerufen wird, muss die Schlüsselwortklasse verwendet werden, um sie vom globalen Variablenkonto zu unterscheiden. Diese Regel gilt nicht, wenn der Klassenname auf der linken Seite des Bereichsauflösungsoperators (::) auftritt. Namen auf der linken Seite des Bereichsauflösungsoperators gelten immer als Klassennamen.

Im folgenden Beispiel wird veranschaulicht, wie sie einen Zeiger mit dem class Schlüsselwort auf ein Objekt des Typs Account deklarieren:

class Account *Checking = new class Account( Account );

Der Account Initialisierer (in Klammern) in der vorherigen Anweisung hat den globalen Bereich; er ist vom Typ double.

Hinweis

Die in diesem Beispiel dargestellte Wiederverwendung von Bezeichnernamen gilt als schlechter Programmierstil.

Informationen zur Deklaration und Initialisierung von Klassenobjekten finden Sie unter "Klassen", "Strukturen" und "Unions". Informationen zur Verwendung der operatoren für delete den new freien Speicher finden Sie unter neuen und löschenden Operatoren.

Ausblenden von Namen mit globalem Bereich

Sie können Namen im globalen Bereich ausblenden, indem Sie denselben Namen explizit im Blockbereich deklarieren. Auf globale Bereichsnamen kann jedoch über den Bereichsauflösungsoperator (::) zugegriffen werden.

#include <iostream> int i = 7; // i has global scope, outside all blocks using namespace std; int main( int argc, char *argv[] ) { int i = 5; // i has block scope, hides i at global scope cout << "Block-scoped i has the value: " << i << "\n"; cout << "Global-scoped i has the value: " << ::i << "\n"; } Block-scoped i has the value: 5 Global-scoped i has the value: 7

Siehe auch

Grundlegende Konzepte