Gültigkeitsbereiche und Namensräume
Der Scope oder Gültigkeitsbereich bestimmt, wo ein Name verwendet werden kann. Ein Block erzeugt einen lokalen Bereich. Außerhalb davon ist der darin definierte lokale Name normalerweise nicht sichtbar. Sichtbarkeit ist nicht dasselbe wie Lebensdauer; dazu folgt ein eigenes Speicherkapitel.
Gültigkeitsbereiche und Namensräume#
Funktionen und Programmaufbau · Lektion 24 von 60
Voraussetzungen: Funktionen. Lernziel: Du verstehst Sichtbarkeit, Namenskonflikte und std::.
Der Scope oder Gültigkeitsbereich bestimmt, wo ein Name verwendet werden kann. Ein Block erzeugt einen lokalen Bereich. Außerhalb davon ist der darin definierte lokale Name normalerweise nicht sichtbar. Sichtbarkeit ist nicht dasselbe wie Lebensdauer; dazu folgt ein eigenes Speicherkapitel.
1#include <iostream>2 3namespace geometrie {4 double flaeche(double breite, double hoehe) {5 return breite * hoehe;6 }7}8 9int main() {10 const double breite{3.0};11 {12 const double hoehe{4.0};13 std::cout << geometrie::flaeche(breite, hoehe) << '\n';14 }15}breite ist auch im inneren Block sichtbar. hoehe ist nach dessen schließender Klammer nicht mehr über diesen Namen erreichbar. Ein Zugriff danach führt typischerweise zu was not declared in this scope.
namespace ist ein Sprachmittel#
Ein Namespace, deutsch Namensraum, gruppiert Namen. geometrie::flaeche benennt ausdrücklich die Funktion im Namensraum geometrie. Der Bereichsauflösungsoperator :: trennt die Teile. std ist der Namensraum vieler Teile der C++-Standardbibliothek.
Der C++-Namespace dieses Wikis ist dagegen ein organisatorischer Inhaltsbereich. Er hat keine technische Verbindung zu einem namespace im C++-Quelltext. Beide verwenden lediglich dieselbe Bezeichnung für das Gruppieren von Namen oder Inhalten.
Warum nicht überall using namespace std?#
using namespace std; beteiligt viele Standardnamen an der unqualifizierten Namenssuche. Unqualifiziert heißt, dass beispielsweise cout ohne std:: geschrieben wird. Das kann Namen mehrdeutig machen, besonders wenn später weitere Bibliotheken hinzukommen.
Verwende im Kurs std::cout, std::string und ähnliche vollständige Namen. Ein gezieltes using std::cout; innerhalb eines kleinen Bereichs ist kontrollierter. Schreibe keine globale using namespace-Direktive in einen eigenen Header: Sie würde sich auch auf dessen Benutzer auswirken.
Shadowing#
Shadowing, deutsch Verdecken, entsteht, wenn ein innerer Name einen gleichnamigen äußeren Namen verdeckt. Ein zweites int wert{2}; in einem inneren Block ändert dann nicht automatisch das äußere wert. Verwende unterschiedliche, aussagekräftige Namen und beachte entsprechende Compilerwarnungen.
Übung#
Wie können zwei Bibliotheken beide eine Funktion laden anbieten?
Lösung
Sie können unterschiedliche Namensräume verwenden, beispielsweise bilder::laden() und texte::laden(). Die qualifizierten Namen bleiben eindeutig.
Weiterlernen#
Zurück: Parameter: Wertübergabe, Referenz und Überladung · Kursübersicht · Weiter: Header, #include und mehrere Quelldateien
Kommentare 0
Kommentare sind für diese Seite deaktiviert.