Konstanten in C++
Ein Programmierer kann in C++ Namen definieren. Ein Name muß mit einem Buchstaben beginnen, dem Ziffern oder Grundstriche folgen, und er darf kein Schlüsselwort sein.
Benannte Werte
Wird der Wert eines Bezeichner innerhalb seines Gültigkeitsbereiches unveränderbar festgelegt, so wird der Bezeichner auch als Konstante bezeichnet.
Konstante [UML, static structure diagram]
.-----------. .----------.
| Konstante | 1 | Name |
| |--------------| |
| | | |
| | '----------'
| | .----------.
| | * 1 | Datentyp |
| |--------------| |
| | | |
| | '----------'
| | .----------.
| | * 1 | Wert |
| |--------------| |
| | | |
'-----------' '----------'
In C++ können Werte benannt werden. In dem folgenden Programm wird der Wert "12" vom Datentyp "int" durch den Namen "zwoelf" benannt.
Der erste Gebrauch des Namens "zwoelf" in dem folgenden Programm ist die Definition.
Die Definition stellt die Verbindung zwischen dem Namen, dem Typ und dem Wert dar.
Der zweite Gebrauch des Namens "zwoelf" ist die Verwendung. Bei der Verwendung steht der Name für den Wert, als den er definiert wurde.
constant.cpp
#include <iostream>
#include <ostream>
int main()
{ const int zwoelf( 12 );
std::cout << zwoelf << '\n'; }std::cout
12
Konstante [UML, static structure diagram]
.-----------. .----------------.
| Konstante | 1 | zwoelf : Name |
| |--------------| -------------- |
| | | |
| | '----------------'
| | .----------------.
| | * 1 | int : Datentyp |
| |--------------| -------------- |
| | | |
| | '----------------'
| | .----------------.
| | * 1 | 12 : Wert |
| |--------------| --------- |
| | | |
'-----------' '----------------'
Der Name selber ist egal und kann verändert werden, ohne daß dies die Funktion des Programmes verändert. Ein irreführender Name, wie in dem folgenden Beispiel, sollte natürlich vermieden werden. Doch für den Computer ist der Name ohne Bedeutung: Er verknüpft nur die verschiedenen Stellen seiner Verwendung.
Bei der Ersetzung eines Namens durch einen anderen, muß dieser überall ersetzt werden, wenn sich die Bedeutung nicht ändern soll.
constant.cpp
#include <iostream>
#include <ostream>
int main()
{ const int zehn( 12 );
std::cout << zehn << '\n'; }std::cout
12
Das folgende Programm errechnet aus einem benannten Wert "300", der eine Temperatur in Kelvin darstellen soll, einen anderen benannten Wert: die entsprechende Celsius-Temperatur.
celsius.cpp
#include <iostream>
#include <ostream>
int main()
{ const double kelvin( 300 );
const double versatz( 273.15 );
const double celsius( kelvin - versatz );
std::cout << celsius << '\n'; }
Der Text "300" ist ein Literal vom Datentyp "int". Da der sich ergebende Wert aber eine Konstante vom Datentyp "double" definiert, wird der Wert vom Datentyp "int" in den Datentyp "double" gewandelt.
Ausdrücke, die neben Operator nur Konstanten und Literale enthalten, können oft bereits während der Übersetzung eines Programmes ausgewertet werden und kosten daher nur wenig Laufzeit.
Typwandlung bei Initialisierung
Die Festlegung des Wertes der Konstanten beim Anlegen wird auch als Initialisierung bezeichnet. Bei der Initialisierung einer Konstanten kann ein Ausdruck verwendet werden, der nicht denselben Typ hat wie die Konstante, wenn C++ für diesen Fall eine Umwandlung vorsieht. Dies ist ähnlich wie beim Aufruf einer Funktion, die ein Argument vom Typ der Konstanten erwartet mit einem Argument vom Typ des zur Initialisierung verwendeten Ausdrucks. Das folgende Programmbeispiel zeigt, wie von solchen Umwandlungen Gebrauch gemacht wird.
conversion.cpp
#include <iostream>
#include <ostream>
int main()
{ const double d( 300 );
const int i( 273.15 );
const int j( true );
const bool b( 1 );
std::cout << std::boolalpha <<
d << ", " << i << ", " << j << ", " << b << '\n'; }std::cout
300, 273, 1, true
Übungsaufgaben
- Übungsaufgabe Übungsfrage
pluseins.cpp
#include <iostream>
#include <ostream>
int main()
{ const double a( 1 );
std::cout << a + 1 << '\n';
// hier
}
Welchen Wert hat die Konstante "a" nach der Ausgabe?
- Übungsaufgabe Übungsaufgabe
Schreiben Sie ein Programm nach dem obigen Muster, das aus einer Konstante mit dem Wert 1,29 (in Mark zu verstehen) eine entsprechende andere Konstante in Euro errechnet. Das Programm soll also mindestens zwei Konstanten enthalten.
- Übungsaufgabe Übungsaufgabe
sinus1.cpp
#include <iostream>
#include <ostream>
#include <cmath>
int main()
{ const double x( 1 );
const double y( std::sin( x ));
const double z( std::sqrt( y ));
const double u( std::pow( y, 0.51 ));
std::cout << z << '\n';
std::cout << u << '\n'; }std::cout
0.917317
0.915735
Übungsaufgabe Schreiben Sie die Einheit "sinus1.cpp" so um, daß dieselben Werte ausgegeben werden und dieselben Numerale und Funktionen zur Berechnung verwendet werden, aber keine Konstanten mehr in dem Programm vorkommen. Ersetzen Sie zunächst die Konstante "x" überall durch ihre Definition, also durch den Wert "1" und entfernen Sie die Definition von x. Nach diesem Schema können dann alle anderen Definitionen eliminiert werden, bis nur noch die beiden Ausgabeausdrücke übrigbleiben.
- Übungsaufgabe Übungsaufgabe
sinus2.cpp
#include <iostream>
#include <ostream>
#include <cmath>
int main()
{ std::cout << std::sin( 1 + std::log( 2.178 ))<< '\n';
std::cout << std::cos( 1 + std::log( 2.178 ))<< '\n'; }std::cout
0.978526
-0.206122
Übungsaufgabe Schreiben Sie die Einheit "sinus2.cpp" so um, daß derzeit wiederholt vorkommende gleiche Teilausdrücke nur einmal vorkommen. Definieren Sie diese dazu als Konstante oder Konstanten und verwenden Sie die Konstante oder Konstanten dann an deren Stellen. Die Ausgabe des Programmes darf sich dadurch nicht ändern.