lokale Variabeln überschreiben globale 8.4
Bjarne nennt in 8.4 unterschiedlichen Geltungsbereiche von Variablen
– global
– lokal
– in Klasse allein (siehe vektor unten)
– in Namensgebeit (z. B. struct, enum, …)
– in Aussagen (z. B. innerhalb eines for)
Der Geltungsbereich hat mit dem Datentyp etwas zu tun, und auf welchem RAM-Segment der Code abgelegt wird.
extern
extern int aktuelle_Version;
Die Variable wird nur deklariert und ist überall sichtbar.
Sie kann (theoretisch) in jedem File neu definiert und mit neuen Werten zugewiesen werden, das ist jedoch gefährlich. Besser ist es, nur in 1 File die Variable zu definieren und dann für alle anderen Files nur sichtbar zu machen.
Klasse
class MyVector{ . // Klassenvariable. Gültigkeit in der Klasse . vector <int> v . . public: . // öffentliche Funktion . int largest(){ . int max = 0; . for (int i = 0; i < v.size(); i++) { . max = max( x, abs(v[i]) ); . return max; . } . // öffentliche Variable . int i; . };
Der Vektor v ist nur in der Klasse sichtbar. Ausserhalb exstiert er nicht und kann auch nicht angesprochen werden.
Argumente sind lokal
int funcition_b (int value_1){ . . // }
Die Funktion ist global, aber der Parameter value_1 ist lokal bezüglich der function_b .
constexpr <function>
Lokale Variablen liegen FIFO im Stack. Man kann nicht auf sie zugreifen (Bjarne 8.5.9). Soll eine Funktion während dem Kompilieren definiert werden, braucht sie das Schlüsselwort constexpr bei all ihren Variablen und für die Funktion.
constexpr int scale_x = 3; constexpr int scale_y = 2;
constexpr Point scale( Point P){ . . return { scale_x * P.x, scale_y * P.y }; }