robert filatow logo
konstanten in c++

Konstanten in C++(Verwirrung pur)

Einleitung

zahl ist ein int, zahlzeiger ist ein Zeiger auf int, konstantezahl ist ein konstantes int, konstanterzahlzeiger ist ein Zeiger auf ein konstantes int und konstantezahlkonstanterzeiger ist ein konstanter Zeiger auf ein konstantes int Konstante auf Zeigerint seinen Cousin.

Hä was?

– Everyone

const ist verwirrend und es ist nicht deine Schuld

Zunächst einmal möchte ich dich beruhigen. Falls du dich bereits mit const beschäftigt hast, ist es gut möglich das du eine brodelnde Frustration in deinem Körper gespürt hast. Das ist normal, das ist Programmierung. Es ist auch nicht deine Schuld, dass du es nicht verstanden hast. Denn const gehört zu den Konventionen die etwas “locker” definiert sind. Der eine schreibt es immer so, der andere immer anders und einige Ausgeburten der Hölle schreiben es mal so mal so. Genug der Vorrede, klären wir zunächst einmal über das Schlüsselwort const auf.


Was ist const?

const steht für constant, was auf deutsch übersetzt konstant heißt, was unveränderlich bedeutet und auf althochdeutsch unfirwantallih geschrieben wird. Die Aufgabe des Schlüsselworts const beim Programmieren ist nicht den Entwickler zu verwirren(das auch), sondern dafür zu Sorgen das der Wert einer Variablen nicht geändert werden kann.

Beispiel

const float pi = 3.14159;
//kleine Info: der erste Buchstabe des Bezeichnernamens einer Konstante sollte nicht groß geschrieben werden,
// da man das nur bei Klassennamen macht. Also pi und nicht Pi!

Lesen können wir das als “pi ist eine Konstante vom Typ float”.
Das heißt, sobald wir diese Konstante in unserem Code zum ersten mal deklariert haben, können wir den Wert während der Laufzeit nicht mehr ändern. Aus diesem Grund muss sie auch bei der Deklaration initialisiert werden.

const float pi = 3.14159;
pi = 2.718 //führt zu einem Fehler: "error: assignment of read-only variable 'pi'

Merke dir: Einer konstanten Variable musst du immer bei der Deklaration einen Wert zuweisen!

Kommen wir nun zum verwirrenden Teil…

Wo gehört das Schlüsselwort hin?

Im Beispiel oben, steht das const vor dem Datentyp float. Jedoch ist auch die Schreibweise möglich, bei der das const hinter dem float steht:

const float pi = 3.14159;
float const pi = 3.14159;

Beide Schreibweisen sind möglich. Die Regel in C++ lautet folgendermaßen:

const wirkt sich auf die Deklaration aus, die links davon steht. Außer es steht ganz links dann wirkt es sich auf den ersten Teil der Deklaration aus.

Wie du siehst, haben die gleichen Personen die die Corona Ausgangsbeschränkungen und Verhaltensregeln formuliert haben auch diese Konvention eingeführt. Diese Regel musst du dir merken wenn du const wirklich verstehen willst.

Die Leseregel

Beim Lesen von Variablen mit Konstanten kann man sich das Verständnis leichter machen indem man von rechts nach links ließt. Aus diesem Grund bevorzuge ich es persönlich das const Schlüsselwort rechts neben die Deklaration zu schreiben, auf die sie sich bezieht(und zwar immer und nicht manchmal):

const float pi = 3.14159; // pi ist eine float Konstante?
float const pi = 3.14159; // pi ist ein konstantes float. (meiner Meinung nach besser)

Zeiger machen jedem Spaß

Man kann nicht nur eine Variable konstant deklarieren, sondern auch Zeiger.

Kurze Info: Im Bezeichnernamen steht p für pointer, c für const und i für integer.

Beispiel 1: Konstanter Zeiger auf Variable

int i = 42; // variables Integer
int * const cp = &i; //konstanter Zeiger auf variables Integer

In diesem Beispiel ist es möglich den Zeiger zu dereferenzieren und den Wert von i zu ändern.

int i = 42; // variables Integer
int * const cp = &i; //konstanter Zeiger auf variables Integer
*cp = 69; //nice

cout << *cp << endl;

69
Process returned 0 (0x0) execution time : 0.025 s
Press any key to continue.

Aber wir können cp keine andere Adresse zuweisen, da unser Zeiger als konstant deklariert wurde:

int i = 42; // variables Integer
int whatever = 69;
int * const cp = &i; //konstanter Zeiger auf variables Integer
cp = &whatever;

error: assignment of read-only variable ‘cp’

Beispiel 2: Variabler Zeiger auf konstantes Integer

int const ci = 42; //konstantes Integer
int const * pci = &ci; //Variabler Zeiger auf konstantes Integer

In diesem Beispiel ist pci ein Variabler Zeiger auf ein konstantes Integer. Oder anders gesagt: Wir dürfen dem Zeiger pci etwas anderes zuweisen, aber der Wert von ci darf nicht geändert werden, da ci als konstant deklariert wurde.
Folgendes Beispiel führt zu einem Fehler:

int const ci = 42; //konstantes Integer
int const * pci = &ci; //Variabler Zeiger auf konstantes Integer
*pci = 69; //führt zu einem Fehler "error: assignment of read-only variable 'ci'

Dereferenzieren wir den Zeiger pci und weisen der Konstante ci einen neuen Wert zu, so führt das zu einem Fehler.
Aber da der Zeiger nicht als const deklariert wurde kann er auf eine andere Variable zeigen:

int const ci = 42; //konstantes Integer
int const whatever = 7;
int const * pci = &ci; //Variabler Zeiger auf konstantes Integer
pci = &whatever;
cout << *pci << endl;

7
Process returned 0 (0x0) execution time : 0.025 s
Press any key to continue.

Beispiel 3: Konstanter Zeiger auf konstante Variable

Es ist auch möglich sowohl den Zeiger als auch die Variable als konstant zu deklarieren:

int const ci = 42; // konstantes Integer
int const * const cpci = &ci; //konstanter Zeiger auf konstantes Integer

Das bedeutet wir können sowohl den Wert der Variable, als auch den Wert des Zeigers nicht ändern.

Schreibkonventionen

Wie bereits erwähnt, können wir sowohl const int als auch int const schreiben.
Das gilt auch für die anderen Beispiele im Folgenden möchte ich alle verschiedenen Schreibweisen mit ihren Bedeutungen auflisten:

int i; // variables Integer, muss nicht initialisiert werden.
int *  ip; // Zeiger auf Integer Variable, muss nicht initialisiert werden.

int const ci = 42; // konstantes Integer, muss initialisiert werden, weil const.
const int ic = 42 // genau wie ci aber weniger cool...

int * const cpi = &i; //KONSTANTER Zeiger auf variables Integer, muss initialisiert werden, weil const.

int const * pci; //VARIABLER Zeiger auf konstantes Integer, nicht zu verwechseln mit cpi!
//muss nicht initialisiert werden, weil variabler Zeiger.
const int * pic; //genau wie pci nur weniger cool...

int const * const cpci = &ci; //konstanter Zeiger auf konstantes Integer, muss initialisiert werden.

Sollte sich irgendwo ein Fehler eingeschlichen haben, dann weise mich bitte im Kommentarbereich darauf hin.

Wofür braucht man Konstanten?

Konstanten braucht man immer dann, wenn man nicht will, dass sich der Wert der Variablen ändern kann(Sag bloß…).
Bei unserem ersten Beispiel hatten wir tatsächlich eine mathematische Konstante “pi”.
Aber man braucht sie auch bei den sogenannten Gettern und Settern. Das sind Methoden, mit dessen Hilfe man auf private Attribute eines Objekts zugreifen kann. Das heißt mit Gettern können wir den Wert eines Attributs “holen” und mit Settern “setzen”.

Da wir nicht möchten, dass beim “holen” des Wertes der Wert verändert wird, kann man eine Get-Funktion auch als const deklarieren, da dadurch gewährleistet wird, dass die Funktion nicht mehr in der Lage ist den Wert zu verändern.

int getnumber() const; //konstante Get-Methode

Dadurch, dass die Funktion als const deklariert wurde, würde man einen Compiler-Fehler erhalten, wenn die Funktion versuchen würde ein Attribut der Klasse, auf welche sie zugreift, zu ändern.

Bei Settern ist das so, dass wir das erhaltene Argument in der Setter-Funktion nicht verändern wollen bevor wir den Wert zuweisen. Daher können wir den Parameter als const deklarieren.

void setnumber(int const number);

Zusammenfassung

  • Eine konstante Variable muss bei der Deklaration initialisiert werden.
  • const wirkt sich auf die Deklaration aus, die links davon steht. Außer es steht ganz links dann wirkt es sich auf den ersten Teil der Deklaration aus.
  • int const und const int geht beides.
  • braucht man bei Gettern und Settern.

Hat dir der Inhalt gefallen?

Falls du mehr zu Themen der Informatik lesen willst, kannst du die Suche dafür verwenden:


Du bist der Meinung, das war der Beste Beitrag zum Thema Informatik den du jemals gelesen hast? Dann ist die einzig logische Schlussfolgerung, diesen Beitrag mit deinen Kommilitonen zu teilen. Oder auch nicht mach was du willst, ich bin nicht dein Dad.

TAGS

© 2023. All rights reserved. Website made by Robert Filatow