Variablen in C++
Ein bennantes Objekt wird in C++ auch eine Variable genannt.
Deklarationen
Eine Objektdeklaration vereinbart einen Bezeichner für ein Objekt.
Dazu muß der Typ des Bezeichners angegeben werden. Die Produktion dafür ist ähnlich wie bei einer Konstantendefinition, nur daß nun das Schlüsselwort "const" entfällt und keine Initialisierung notwendig ist.
- 〈simple-declaration 〉 ::=
- 〈decl-specifier 〉 {〈decl-specifier 〉} [〈init-declarator 〉 {"," 〈init-declarator 〉}] ";".
- 〈decl-specifier 〉 ::=
- "bool" | "int" | "double" | "const" | "extern".
- 〈init-declarator 〉 ::=
- 〈declarator 〉 [〈initializer 〉].
Durch "int v;" wird beispielsweise ein Bezeichner "v" mit dem Typ "int" vereinbart.
Eine Deklaration des Bezeichners "v"
.---------- <decl-specifier>
| .------- <init-declarator>
| |
--- -
int v;
Es können mehrere Init-Deklaratoren durch Komma getrennt und einer Kombination von Deklarations-Spezifizierern zugeordnet werden.
Eine Deklaration
.---------- <decl-specifier>
| .------- <init-declarator>
| | .---- <init-declarator>
| | |
--- - -
int v, w;
Die Deklaration "int v, w;" hat die gleichen Folgen, wie die Folge der Deklarationen "int v; int w;".
Da die Verwendung mehrerer Init-Deklaratoren in einer Deklaration manchmal zu Mißverständnissen führen kann, sind im Zweifel mehrere Deklarationen mit nur jeweils einem Init-Deklarator vorzuziehen.
Definitionen
Durch eine Objektdefinition wird ein Bezeichner vereinbart und ein passender Speicherbereich bereitgestellt (unter Umständen wird das Objekt auch initialisiert).
Eine Objektdeklaration ist auch eine Objektdefinition, wenn sie nicht den Spezifizierer "extern" enthält oder einen Initialisierer hat.
Die Objektdeklaration "int v;" ist daher auch eine Objektdefinition: Es wird ein int-Objekt bereitgestellt und an den int-Bezeichner "v" gebunden.
Eine Objekt-Definition
.---------- <decl-specifier>
| .------- <init-declarator>
| |
--- -
int v;
Initialisierungen
Eine Initialisierung einer Variablen kann durch den Initialisierer des Init-Deklarators der Variablen geschehen.
Variablendefinition mit Direkt-Initialisierer
.-------- <declarator>
| .---- <initializer>
| |
- -----
int v ( 9 );Variablendefinition mit Kopier-Initialisierer
.------- <declarator>
| .---- <initializer>
| |
- ---
int v = 9;
Durch die Initialisierung wird ein Anfangswert für das Objekt der Variablen festgelegt, der aber später verändert werden kann. Der Kopierinitialisierer "v = 9" hat dieselbe Wirkung wie der direkte Initialisierer "v( int( 9 ))", der Unterschied zwischen Kopierinitialisierung und direkter Initialisierung wird in anderen Lektionen behandelt.
Variablenverwendungen
Der Name einer Variablen steht zunächst für das Objekt der Variablen. Wird ein Variablenname an einer Stelle verwendet, an der auch ein Literal stehen könnte, so steht der Variablenname für den Wert des Objektes der Variablen.
Daher ist die Wirkung der Auswertung des Ausdrucks "( ::std::cout << v )" mit einer int-Variablen "v" die Ausgabe einer Darstellung des int-Wertes, der sich in dem int-Objekt "v" befindet. Der Ausdruck "v + 1" ist die Summe dieses Wertes von "v" und "1".
Zuweisungen
Anders als bei Konstanten ist es bei Variablen möglich, ihren Wert während eines programmgesteuerten Vorgangs zu verändern, da der Wert in einem Objekt (Wertspeicher) gehalten wird. Solch einer Veränderung kann in C++ durch eine Zuweisung erfolgen. Der Ausdruck "v = 8" ist eine Zuweisung des Wertes "8" der rechten Seite des Zuweisungsoperators "=" an das Objekt "v" auf der linken Seite des Zuweisungsoperators. Die vereinfachte Produktion folgt.
- 〈assignment-expression 〉 ::=
- 〈logical-or-expression 〉 "=" 〈assignment-expression 〉.
Die Wirkung der Zuweisung ist die Speicherung (das Schreiben) des Werts der rechten Seite 〈assignment-expression 〉 in das Objekt (den Wertspeicher) auf der linken Seite, der durch eine 〈logical-or-expression 〉 bezeichnet wird. Dadurch wird der Wert des Objektes so verändert, daß er ab dem nächsten Sequenzpunkt der Wert der rechten Seite ist (wenn die Typen gleich sind).
Die Anweisungsfolge "v = 3; v = 7; ::std::cout << v;" führt also zur Ausgabe einer Darstellung des Wertes "7", wenn der Bezeichner "v" der Name eines int-Objekts ist. Die Zuweisung "v = 7" überschreibt dabei den vorherigen Wert "3". Wenn dann der Ausgabeoperator "<<" aktiviert wird, hat die Variable "v" den Wert "7".
Eine Kopierinitialisierung, wie in der Deklaration "int v = 8;" wird auch mit einem Gleichheitszeichen geschrieben, ist aber keine Zuweisung.